# to run this script in irc channel
# python bot_learning_definitions.py irc.freenode.net '#algolit' monster
from __future__ import division
import nltk
from nltk.corpus import wordnet as wn
from pattern.en import tag
import sys
from time import sleep
import irc.bot
# Functions
# transformation of the message
def rewriting(words):
definitions = []
# tokenize source and get Part-of-Speech tags for each word
for word in words:
# create tuple of tuples with pairs of word + POS-tag
collection = tag(word)
# transform tuple into list to be able to manipulate it
collection = list(collection)
# for each pair:
for element in collection:
# look for nouns & replace them with their definition
if element[1] == "NN":
synset = wn.synsets(element[0])
definitions.append("<")
definitions.append(synset[0].definition())
definitions.append(">")
else:
# non-nouns are left as words
definitions.append(element[0])
# write the transformed sentence
reply = " ".join(definitions)
return reply
# Actions bot
class MyBot(irc.bot.SingleServerIRCBot):
def __init__(self, channel, nickname, server, port=6667):
irc.bot.SingleServerIRCBot.__init__(self, [(server, port)], nickname, nickname)
self.channel = channel
def on_welcome(self, c, e):
c.join(self.channel)
print "join"
def on_privmsg(self, c, e):
pass
def on_pubmsg(self, c, e):
# e.target, e.source, e.arguments, e.type
# captures last line in chat
print e.arguments
msg = e.arguments[0]
# splits chat message in wordlist
words = msg.split()
reply = rewriting(words)
c.privmsg(self.channel, reply)
# Launch bot
if __name__ == "__main__":
import sys
if len(sys.argv) != 4:
print "Usage: bot_learning_definitions.py <server[:port]> <channel> <nickname>"
sys.exit(1)
s = sys.argv[1].split(":", 1)
server = s[0]
if len(s) == 2:
try:
port = int(s[1])
except ValueError:
print "Error: Erroneous port."
sys.exit(1)
else:
port = 6667
channel = sys.argv[2]
nickname = sys.argv[3]
bot = MyBot(channel, nickname, server, port)
bot.start()