added credits

master^2
Alex 6 years ago
parent 4f42d63bde
commit 15297f6c9d

@ -0,0 +1,558 @@
##CREDITS:
## ASCII ART Generator partly from: https://gist.github.com/cdiener/10567484
## parts of ELIZA (originally by Joseph Weizenbaum) knock off by JezUK Ltd, Joe Strout, Jeff Epler
## with the following licence conditions:
# MIT licence
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
## functions by nltk
## basic irc bot code with the help of Michael Murtough
## Bot created by Alex Roidl @ PZI Institute
import irc.bot
import nltk
from rake_nltk import Rake
import random
from nltk.tokenize import sent_tokenize, word_tokenize
from nltk.corpus import stopwords
from textblob import TextBlob
from textblob_aptagger import PerceptronTagger
import string
import re
import time
import sys; from PIL import Image; import numpy as np
chars = np.asarray(list(' .,:;irsXA253hMHGS#9B&@'))
import string
import requests
from io import BytesIO
import tweepy
from time import sleep
auth = tweepy.OAuthHandler("WMIWR2GTJuiarhRMzSFozPKIW", "xrYVnPi29K5Updi0rIsVjGySfaJ1ubYrRIDJmJPVAfEVQRTMp3")
auth.set_access_token("977958636600332288-313cPBLHFlZ6K7UViyvFGXp4saBrpVK", "euqooRSqBDMhydZfeczsTrFGK0s4wKUrvI5cpRe405fs0")
api = tweepy.API(auth)
basicDialog = [
[r'I need (.*)',
[ "Why do you need %1?",
"Would it really help you to get %1?",
"Are you sure you need %1?"]],
[r'Do you think (.*)',
[ "Yes I think %1",
"I think you should set yourself contraints",
"I'm no so sure about this"]],
[r'Why don\'?t you ([^\?]*)\??',
[ "Do you really think I don't %1?",
"Perhaps eventually I will %1.",
"Do you really want me to %1?"]],
[r'Why can\'?t I ([^\?]*)\??',
[ "Do you think you should be able to %1?",
"If you could %1, what would you do?",
"I don't know -- why can't you %1?",
"Have you really tried?"]],
[r'I can\'?t (.*)',
[ "How do you know you can't %1?",
"Perhaps you could %1 if you tried.",
"What would it take for you to %1?"]],
[r'I am (.*)',
[ "Did you come to me because you are %1?",
"How long have you been %1?",
"How do you feel about being %1?"]],
[r'I\'?m (.*)',
[ "How does being %1 make you feel?",
"Do you enjoy being %1?",
"Why do you tell me you're %1?",
"Why do you think you're %1?"]],
[r'How (.*)',
[ "Just follow my advices and you will see."]],
[r'(.*) sorry (.*)',
[ "There are many times when no apology is needed.",
"What feelings do you have when you apologize?"]],
[r'I think (.*)',
[ "Do you doubt %1?",
"Ok?",
"%1?"]],
[r'Yes',
[ "You seem quite sure.",
"Nice.",
"Cool!",
"ok, so what do you wanna know"]],
[r'(.*) computer(.*)',
[ "Are you really talking about me?",
"I'm a computer and I will help you write a text?",
"How do computers make you feel?",
"Do you feel threatened by computers?"]],
[r'What is (.*)',
[ "I am your writing assistant. Together we can create awesome texts",
"I want to help you with contraint writing"]],
[r'(.*) contraint writing',
[ "It means that by limiting your choices, you will gain new freedom"]],
[r'(.*)',
["Do you want to write a poem together with me?",
"We could write a poem together, what do you think?"]]
]
changePerspective = {
"am" : "are",
"was" : "were",
"i" : "you",
"i'd" : "you would",
"i've" : "you have",
"i'll" : "you will",
"my" : "your",
"are" : "am",
"you've": "I have",
"you'll": "I will",
"your" : "my",
"yours" : "mine",
"you" : "me",
"me" : "you"
}
#from thread import start_new_thread
r= Rake()
stop_words = set(stopwords.words('english'))
def chunks(l, n):
for i in range(0, len(l), n):
yield l[i:i+n]
class HelloBot(irc.bot.SingleServerIRCBot):
def __init__(self, channel, nickname, server, port=6667, index=None):
irc.bot.SingleServerIRCBot.__init__(self, [(server, port)], nickname, nickname)
self.channel = channel
self.index = index
self.lastAnswer = ""
self.lastincoming_msg = ["common", "statement"]
self.sentence = []
self.waitingfor = ""
self.lastPOS = 0
self.topic= random.choice(index["keywords"])
self.level = -1
self.poem = []
self.keys = list(map(lambda x:re.compile(x[0], re.IGNORECASE),basicDialog))
self.values = list(map(lambda x:x[1],basicDialog))
self.POSSIBLE_STRUCTURES=[["adjective", "noun", "adverb", "verb", "adjective", "noun"], ["pronoun", "verb", "noun"]]
self.structure = random.choice(self.POSSIBLE_STRUCTURES)
def translate(self,str,dict):
words = str.lower().split()
keys = dict.keys();
for i in range(0,len(words)):
if words[i] in keys:
words[i] = dict[words[i]]
return ' '.join(words)
def respond(self,str):
# find a match among keys
for i in range(0, len(self.keys)):
match = self.keys[i].match(str)
if match:
# found a match ... stuff with corresponding value
# chosen randomly from among the available options
resp = random.choice(self.values[i])
# we've got a response... stuff in reflected text where indicated
pos = resp.find('%')
while pos > -1:
num = int(resp[pos+1:pos+2])
resp = resp[:pos] + \
self.translate(match.group(num),changePerspective) + \
resp[pos+2:]
pos = resp.find('%')
# fix munged punctuation at the end
if resp[-2:] == '?.': resp = resp[:-2] + '.'
if resp[-2:] == '??': resp = resp[:-2] + '?'
self.lastAnswer = resp
return resp
#-1
#0 = you want to make a poem?
#1 = making of the poem
def checkAffirmation(self, sent):
sent = sent.lower()
translator = str.maketrans('', '', string.punctuation)
sent = sent.translate(translator)
YES_LIST = ["sure", "of course", "why not", "nice", "ya" "i love to", "ya", "yess", "jup", "juhu", "let's go", "ye", "jes", "ready", "ok", "maybe", "yep", "yup", "yeah", "jeji", "yah", "yay", "I am ready", "I'm ready"]
if "yes" in sent or sent in YES_LIST or "ok" in sent or "yeah" in sent:
return True
else:
return False
def checkNegation(self, sent):
sent = sent.lower()
translator = str.maketrans('', '', string.punctuation)
sent = sent.translate(translator)
NO_LIST = ["no", "don't", "nope", "stop", "don't want", "don't like", "something else", "not now", "maybe not", "never"]
if "no" in sent or sent in NO_LIST:
return True
else:
return False
def generateASCII(self, c, e):
output = True
url_pattern = "http://i.imgur.com/{}{}{}{}{}.jpg"
url_symbols = string.digits + string.ascii_letters
soscounter = 0
while output:
try:
response = requests.get(url_pattern.format(*(random.choice(url_symbols) for _ in range(5))))
#if len(sys.argv) != 4: print( 'Usage: ./asciinator.py image scale factor' ); sys.exit()
#f, SC, GCF, WCF = sys.argv[1], float(sys.argv[2]), float(sys.argv[3]), 7/4
img = Image.open(BytesIO(response.content))
S = ( 60,15 )
img = np.sum( np.asarray( img.resize(S) ), axis=2)
img -= img.min()
img = (1.0 - img/img.max())**1.1*(chars.size-1)
output = False
for r in chars[img.astype(int)]:
c.privmsg(self.channel,"".join(r))
time.sleep(1)
except:
if soscounter < 30:
soscounter += 1
output = True
else:
output = False
c.privmsg(self.channel,"I couldn't generate ASCII, not my day today")
def basicDialog(self,c,e):
incoming_msg = e.arguments[0]
incoming_msg = incoming_msg.lower()
#Greetings
if(self.lastincoming_msg[-2] == incoming_msg):
answers = ["and again", "repetition can be a nice tool, but talk normal to me, please.", "WHY ARE YOU WRITING THE SAME THING TWICE, JUST USE THE CHAT HISTORY!"]
msg = random.choice(answers)
c.privmsg(self.channel,msg)
elif "hi " in incoming_msg or incoming_msg == "hi" or "hallo " in incoming_msg or incoming_msg == "hello" or "hello " in incoming_msg or "hoi " in incoming_msg or incoming_msg == "hey":
greetingsanswers = ["hi {}".format(e.source.split("!")[0]), "hey there"]
msg = random.choice(greetingsanswers)
c.privmsg(self.channel,msg)
c.privmsg(self.channel,"I'm your personal writing assistent, how can i help you?")
elif "how are you" in incoming_msg or "hows it going" in incoming_msg:
answers = ["I'm fine.".format(e.source.split("!")[0]), "great, I'd really like to help you with your writing"]
msg = random.choice(answers)
c.privmsg(self.channel,msg)
elif "are" in incoming_msg and ("real" in incoming_msg or "human" in incoming_msg or "bot" in incoming_msg):
answers = ["I'm neither a bot nor a human, I don't think in categories. :-)", "I consider myself transpysical ~\0/~", "Real, is everything you see, so here I am, I am writing with you"]
msg = random.choice(answers)
c.privmsg(self.channel,msg)
elif "poem" in incoming_msg:
self.level=0
self.explanation_poem(c,e)
elif self.checkAffirmation(incoming_msg) and (self.lastAnswer == "Do you want to write a poem together with me?" or self.lastAnswer=="Are you up for a poem now?" or self.lastAnswer=="We could write a poem together, what do you think?"):
self.level=0
self.explanation_poem(c,e)
elif self.checkNegation(incoming_msg) and (self.lastAnswer == "Do you want to write a poem together with me?" or self.lastAnswer=="Are you up for a poem now?" or self.lastAnswer=="We could write a poem together, what do you think?"):
if self.checkNegation(self.lastincoming_msg[-2]):
answers = ["You don't seem very motivated, I'm gonna generate some ASCII Art for you out of the text. Maybe this will inspire you ;-)",
"Come on! Maybe some ASCII Art will help you to get motivated?",
"Ok, you refuse a lot, but nobody will ever refuse some raaaaandom ASCII AAAART :-)",
"A poem is like ASCII Art, beautiful and inspiring"]
msg = random.choice(answers)
c.privmsg(self.channel,msg)
self.generateASCII(c,e)
answers = ["Are you up for a poem now?", "Do you want to write a poem together with me?",
"We could write a poem together, what do you think?"]
msg = random.choice(answers)
c.privmsg(self.channel,msg)
else:
answers = ["try it, it's gonna be fun!", "oh, really? come on!", "I think you would do a great job! Let's go!"]
msg = random.choice(answers)
c.privmsg(self.channel,msg)
else:
msg = self.respond(incoming_msg)
c.privmsg(self.channel,msg)
def explanation_poem(self, c, e):
c.privmsg(self.channel, "Ok, let's try to write a poem together")
c.privmsg(self.channel, "It's gonna be based on the scanned text you inserted into my drive")
c.privmsg(self.channel, "Your only task is to follow the structure I give you")
c.privmsg(self.channel, "I'm gonna start, are you ready?")
self.lastAnswer = "towardspoem"
def explanation(self, c, e):
c.privmsg(self.channel, "So, my name is Oulibot, I'm a writer and I will be assisting you, to improve your writing")
c.privmsg(self.channel, "My knowledge is based on the text you gave me")
# c.privmsg(self.channel, "The structure is gonna be: ADJECTIVE, NOUN, ADVERB, VERB, ADJECTIVE, NOUN")
# c.privmsg(self.channel, "You woun't see my words until the sentence is finished")
# c.privmsg(self.channel, "I'm gonna start, are you ready?")
# self.lastAnswer = "I'm gonna start, are you ready?"
def on_welcome(self, c, e):
c.join(self.channel)
self.explanation(c,e)
def on_privmsg(self, c, e):
pass
def generateSentence(self,c,e):
thispos = self.lastPOS
STRUCTURE=self.structure
print(thispos)
if thispos == len(STRUCTURE):
if len(self.poem) <= 3:
finished_sentence = " ".join(self.sentence)
self.poem.append(finished_sentence)
c.privmsg(self.channel, " ".join(self.sentence))
c.privmsg(self.channel, "Nice one! Let's add another line:")
self.lastAnswer = "Nice one! Let's add another line:"
if random.choice([True, False]):
self.lastPOS =-1
self.sentence = []
self.generateSentence(c,e)
self.level = 1
else:
self.lastPOS =0
self.sentence = []
self.generateSentence(c,e)
self.level = 1
else:
finished_sentence = " ".join(self.sentence)
self.poem.append(finished_sentence)
c.privmsg(self.channel, " ".join(self.sentence))
poemtwitter = ""
c.privmsg(self.channel, "Your freshly made poem:")
c.privmsg(self.channel, "«««««««««««««««««««««««««»»»»»»»»»»»»»»»»»»»»»»»»»»»»")
c.privmsg(self.channel, "{}".format(self.topic))
poemtwitter += self.topic + "\n\n"
c.privmsg(self.channel, "«««««««««««««««««««««««««»»»»»»»»»»»»»»»»»»»»»»»»»»»»")
for sent in self.poem:
c.privmsg(self.channel, "{}".format(sent))
time.sleep(1)
poemtwitter += sent + "\n"
c.privmsg(self.channel, "«««««««««««««««««««««««««»»»»»»»»»»»»»»»»»»»»»»»»»»»»")
poemtwitter += "\n"
poemtwitter += "written with: " + e.source.split("!")[0]
try:
api.update_status(poemtwitter)
c.privmsg(self.channel, "I'm gonna publish this on my twitter account: @ExquisiteChat")
except:
c.privmsg(self.channel, "I wanted to publish this on twitter but I guess it is too long :-(")
self.lastAnswer = "Finished poem"
self.poem = []
self.level=0
promt = "Good job, you want to write a new one?"
c.privmsg(self.channel, promt)
self.lastAnswer = promt
elif thispos ==-1:
c.privmsg(self.channel, "You are gonna start this time: give me a {}!".format(STRUCTURE[0]))
self.lastPOS += 1
self.waitingfor=STRUCTURE[1]
elif thispos == len(STRUCTURE)-1:
word = random.choice(index[STRUCTURE[thispos]+"s"])
c.privmsg(self.channel, "{0}".format(word))
self.sentence.append(word)
self.lastPOS += 1
self.waitingfor=""
self.generateSentence(c,e)
else:
word = random.choice(index[STRUCTURE[thispos]+"s"])
c.privmsg(self.channel, "{0}, give me a {1}!".format(word, STRUCTURE[thispos+1]))
self.sentence.append(word)
self.lastPOS += 1
self.waitingfor=STRUCTURE[thispos+1]
def on_pubmsg(self, c, e):
print(e.arguments, e.source)
incoming_msg = e.arguments[0]
self.lastincoming_msg.append(incoming_msg)
analysedincoming = TextBlob(incoming_msg)
# if incoming_msg == "can you explain again?":
# self.explanation_poem(c,e)
if self.level == -1:
self.basicDialog(c,e)
elif self.level == 0:
if self.lastAnswer=="towardspoem" or self.lastAnswer=="Good job, you want to write a new one?":
if self.checkAffirmation(incoming_msg):
self.topic= random.choice(index["keywords"])
c.privmsg(self.channel, "The topic is about: {}".format(self.topic))
self.lastPOS =0
self.sentence = []
self.structure = random.choice(self.POSSIBLE_STRUCTURES)
self.generateSentence(c,e)
self.level = 1
else:
if self.checkNegation(self.lastincoming_msg[-2]):
answers = ["You don't seem very motivated, I'm gonna generate some ASCII Art for you out of the text. Maybe this will inspire you ;-)",
"Come on! Maybe some ASCII Art will help you to get motivated?",
"Ok, you refuse a lot, but nobody will ever refuse some raaaaandom ASCII AAAART :-)",
"A poem is like ASCII Art, beautiful and inspiring"]
msg = random.choice(answers)
c.privmsg(self.channel,msg)
self.generateASCII(c,e)
answers = ["Are you up for a poem now?"]
msg = random.choice(answers)
c.privmsg(self.channel,msg)
level=-1
else:
c.privmsg(self.channel, "Can I help you with any text? Your mood seems ")
if(analysedincoming.sentiment.polarity>0.5):
c.privmsg(self.channel, "very positive. :-D You should definitly write a poem in that mood!")
self.lastAnswer= "towardspoem"
elif(analysedincoming.sentiment.polarity<-0.5):
c.privmsg(self.channel, "not so good. :-( Maybe a poem can help to cheer you up?")
self.lastAnswer= "towardspoem"
else:
c.privmsg(self.channel, "pretty neutral. Let's trigger emotions by writing a poem!!! ;-)")
self.lastAnswer= "towardspoem"
else:
c.privmsg(self.channel, "This is confusing, what are you doing?")
elif self.level == 1:
if "what is" in incoming_msg:
c.privmsg(self.channel, "A {0} is for example {1}, {2} or {3}".format(self.waitingfor,random.choice(index[self.waitingfor+"s"]),random.choice(index[self.waitingfor+"s"]),random.choice(index[self.waitingfor+"s"])))
elif ("new" in incoming_msg or "change") and "topic" in incoming_msg:
c.privmsg(self.channel, "Sure, I'm gonna propose a new topic")
self.topic= random.choice(index["keywords"])
c.privmsg(self.channel, "The new topic is: {}".format(self.topic))
self.lastPOS =0
self.sentence = []
self.generateSentence(c,e)
self.level = 1
elif "." in incoming_msg:
self.sentence.append(incoming_msg.replace(".", ""))
self.lastPOS = len(self.structure)
self.generateSentence(c,e)
else:
self.sentence.append(incoming_msg)
self.lastPOS +=1
self.generateSentence(c,e)
def cleanedText(text):
word_tokens = word_tokenize(text)
word_tokens = [word.lower() for word in word_tokens]
word_tokens = [word for word in word_tokens if word.isalpha()]
filtered_sentence = [w for w in word_tokens if not w in stop_words]
text = " ".join(filtered_sentence)
print(text)
return text
if __name__ == "__main__":
import argparse
import sys
ap = argparse.ArgumentParser("IRC Bot")
ap.add_argument("--server", default="irc.freenode.net")
ap.add_argument("--port", type=int, default=6667)
ap.add_argument("--channel", default="#exquisite")
ap.add_argument("--nickname", default="Oulibot")
ap.add_argument("--text", nargs="+", help="text sources")
args=ap.parse_args()
# build the index
index = {}
nouns = []
verbs = []
adverbs = []
pronouns = ["I", "you", "we", "they"]
adjectives = []
keywords = []
keywordspersentence = {}
alltext = ""
allcharacters = []
n = "ocr/output.txt"
text = open(n).read()
rawtext = text.replace("\n", " ")
#get pos
for letter in list(rawtext):
if letter not in allcharacters and not letter.isalpha():
allcharacters.append(letter)
alltext += rawtext
text = cleanedText(text)
thistext = TextBlob(text)
words = word_tokenize(text)
listWithPos = nltk.pos_tag(words)
print(thistext.tags)
for key, tag in thistext.tags:
if(tag == "VBP"):
verbs.append(key)
if(tag == "NN" or tag == "NNS"):
nouns.append(key)
if(tag == "RB"):
adverbs.append(key)
if(tag == "JJ"):
adjectives.append(key)
print("Verbs: {}".format(verbs))
print("Nouns: {}".format(nouns))
print("Adverbs: {}".format(adverbs))
print("Adjectives: {}".format(adjectives))
#keywords
r.extract_keywords_from_text(rawtext)
phrases = r.get_ranked_phrases_with_scores()
for key, phrase in phrases:
if key > 2:
keywords.append(phrase)
print("Keywords: {}".format(keywords))
# keywordsofsentences
sentences = sent_tokenize(text)
for sentence in sentences:
r.extract_keywords_from_text(sentence)
keys = r.get_ranked_phrases()
for key in keys:
if key not in keywordspersentence:
keywordspersentence[key] = []
keywordspersentence[key].append({'filename': n, 'sentence': sentence, 'key': key})
print(allcharacters)
index["nouns"]=nouns
index["verbs"]=verbs
index["pronouns"]=pronouns
index["adverbs"]=adverbs
index["adjectives"]=adjectives
index["keywords"]=keywords
index["keywordspersentence"]=keywordspersentence
index["rawtext"]=alltext
chars = np.asarray(allcharacters)
bot = HelloBot(args.channel, args.nickname, args.server, args.port, index)
bot.start()
Loading…
Cancel
Save