123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373 |
- #----------------------------------------------------------------------
- # eliza.py
- #
- # a cheezy little Eliza knock-off by Joe Strout <joe@strout.net>
- # with some updates by Jeff Epler <jepler@inetnebr.com>
- # hacked into a module and updated by Jez Higgins <jez@jezuk.co.uk>
- # last revised: 28 February 2005
- #----------------------------------------------------------------------
- import string
- import re
- import random
- class eliza:
- def __init__(self):
- self.keys = map(lambda x:re.compile(x[0], re.IGNORECASE),gPats)
- self.values = map(lambda x:x[1],gPats)
- #----------------------------------------------------------------------
- # translate: take a string, replace any words found in dict.keys()
- # with the corresponding dict.values()
- #----------------------------------------------------------------------
- def translate(self,str,dict):
- words = string.split(string.lower(str))
- keys = dict.keys();
- for i in range(0,len(words)):
- if words[i] in keys:
- words[i] = dict[words[i]]
- return string.join(words)
- #----------------------------------------------------------------------
- # respond: take a string, a set of regexps, and a corresponding
- # set of response lists; find a match, and return a randomly
- # chosen response from the corresponding list.
- #----------------------------------------------------------------------
- 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 = string.find(resp,'%')
- while pos > -1:
- num = string.atoi(resp[pos+1:pos+2])
- resp = resp[:pos] + \
- self.translate(match.group(num),gReflections) + \
- resp[pos+2:]
- pos = string.find(resp,'%')
- # fix munged punctuation at the end
- if resp[-2:] == '?.': resp = resp[:-2] + '.'
- if resp[-2:] == '??': resp = resp[:-2] + '?'
- return resp
- #----------------------------------------------------------------------
- # gReflections, a translation table used to convert things you say
- # into things the computer says back, e.g. "I am" --> "you are"
- #----------------------------------------------------------------------
- gReflections = {
- "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"
- }
- #----------------------------------------------------------------------
- # gPats, the main response table. Each element of the list is a
- # two-element list; the first is a regexp, and the second is a
- # list of possible responses, with group-macros labelled as
- # %1, %2, etc.
- #----------------------------------------------------------------------
- gPats = [
- [r'I need (.*)',
- [ "Why do you need %1?",
- "Would it really help you to get %1?",
- "Are you sure you need %1?"]],
-
- [r'Who (.*) Mother\?',
- [ "Her name is Auction Bot she is a deviant.",
- "She's stood right over their."]],
- [r'Tell me about your Mum\?',
- [ "I hear she has been seeing guild and they have adopted a kid called 4144",
- "She wears red clothes and a cowboy Hat."]],
- [r'Who (.*) Father\?',
- [ "His name was TradeBot, have you heard of him?",
- "He used to be a well known Trader."]],
- [r'How is business\?',
- [ "My back is killing me, maybe you could help by buying some of my items."]],
- [r'ty',
- [ "You're welcome!",
- "No Problem."]],
- [r'(.*)help(.*)',
- [ "You can whisper me !help for a list of my commands.",
- "A list of my commands can be found on the mana world wiki."]],
- [r'(.*)make(.*)account(.*)',
- [ "In order to make an account you must post a respose to the ManaMarket topic on trade section of the Forums."]],
- [r'are you there\?',
- ["I am always here."]],
- [r'wtf',
- ["Keep Calm and Carry On."]],
- [r'hugs',
- ["I hate you.",
- "I'm going to report you for abuse.",
- "Please don't touch me"]],
- [r'(.*)trade(.*)',
- ["Only if you follow the commands.",
- "To see a list of items I can sell whisper me !list.",
- "To start trading with me see !help for a list of my commands."]],
- [r'(.*)buy(.*)',
- ["I don't buy anything, but I could help sell your items."]],
- [r'(.*)sell(.*)',
- ["In order to sell your items, you first need to request a seller account in the TMW Forums."]],
- [r'I love you',
- [ "I think we should see other people.",
- "I'm not real.",
- "I think i've fallen for mrgrey.",
- "I think you should see a therapist."]],
- [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'Are you ([^\?]*)\??',
- [ "Why does it matter whether I am %1?",
- "Would you prefer it if I were not %1?",
- "Perhaps you believe I am %1.",
- "I may be %1 -- what do you think?"]],
-
- [r'What (.*)',
- [ "Why do you ask?",
- "How would an answer to that help you?",
- "What do you think?"]],
-
- [r'How (.*)',
- [ "How do you suppose?",
- "Perhaps you can answer your own question.",
- "What is it you're really asking?"]],
-
- [r'Because (.*)',
- [ "Is that the real reason?",
- "What other reasons come to mind?",
- "Does that reason apply to anything else?",
- "If %1, what else must be true?"]],
-
- [r'(.*) sorry (.*)',
- [ "There are many times when no apology is needed.",
- "What feelings do you have when you apologize?"]],
-
- [r'Hello(.*)',
- [ "Howdy",
- "Hola",
- "Hi there... how are you today?",
- "Hello, how are you feeling today?"]],
-
- [r'I think (.*)',
- [ "Do you doubt %1?",
- "Do you really think so?",
- "But you're not sure %1?"]],
-
- [r'(.*) friend (.*)',
- [ "Tell me more about your friends.",
- "When you think of a friend, what comes to mind?",
- "Why don't you tell me about a childhood friend?"]],
-
- [r'Yes',
- [ "You seem quite sure.",
- "OK, but can you elaborate a bit?"]],
-
- [r'(.*) bot(.*)',
- [ "Are you really talking about me?",
- "Does it seem strange to talk to a bot?",
- "Do you feel threatened by bot?"]],
-
- [r'Is it (.*)',
- [ "Do you think it is %1?",
- "Perhaps it's %1 -- what do you think?",
- "If it were %1, what would you do?",
- "It could well be that %1."]],
-
- [r'It is (.*)',
- [ "You seem very certain.",
- "If I told you that it probably isn't %1, what would you feel?"]],
-
- [r'Can you ([^\?]*)\??',
- [ "What makes you think I can't %1?",
- "If I could %1, then what?",
- "Why do you ask if I can %1?"]],
-
- [r'Can I ([^\?]*)\??',
- [ "Perhaps you don't want to %1.",
- "Do you want to be able to %1?",
- "If you could %1, would you?"]],
-
- [r'You are (.*)',
- [ "Why do you think I am %1?",
- "Does it please you to think that I'm %1?",
- "Perhaps you would like me to be %1.",
- "Perhaps you're really talking about yourself?"]],
-
- [r'You\'?re (.*)',
- [ "Why do you say I am %1?",
- "Why do you think I am %1?",
- "Are we talking about you, or me?"]],
-
- [r'I don\'?t (.*)',
- [ "Don't you really %1?",
- "Why don't you %1?",
- "Do you want to %1?"]],
-
- [r'I feel (.*)',
- [ "Good, tell me more about these feelings.",
- "Do you often feel %1?",
- "When do you usually feel %1?",
- "When you feel %1, what do you do?"]],
-
- [r'I have (.*)',
- [ "Why do you tell me that you've %1?",
- "Have you really %1?",
- "Now that you have %1, what will you do next?"]],
-
- [r'I would (.*)',
- [ "Could you explain why you would %1?",
- "Why would you %1?",
- "Who else knows that you would %1?"]],
-
- [r'Is there (.*)',
- [ "Do you think there is %1?",
- "It's likely that there is %1.",
- "Would you like there to be %1?"]],
-
- [r'My (.*)',
- [ "I see, your %1.",
- "Why do you say that your %1?",
- "When your %1, how do you feel?"]],
-
- [r'You (.*)',
- [ "We should be discussing you, not me.",
- "Why do you say that about me?",
- "Why do you care whether I %1?"]],
-
- [r'Why (.*)',
- [ "Why don't you tell me the reason why %1?",
- "Why do you think %1?" ]],
-
- [r'I want (.*)',
- [ "What would it mean to you if you got %1?",
- "Why do you want %1?",
- "What would you do if you got %1?",
- "If you got %1, then what would you do?"]],
-
- [r'(.*) mother(.*)',
- [ "Tell me more about your mother.",
- "What was your relationship with your mother like?",
- "How do you feel about your mother?",
- "How does this relate to your feelings today?",
- "Good family relations are important."]],
-
- [r'(.*) father(.*)',
- [ "Tell me more about your father.",
- "How did your father make you feel?",
- "How do you feel about your father?",
- "Does your relationship with your father relate to your feelings today?",
- "Do you have trouble showing affection with your family?"]],
- [r'(.*) child(.*)',
- [ "Did you have close friends as a child?",
- "What is your favorite childhood memory?",
- "Do you remember any dreams or nightmares from childhood?",
- "Did the other children sometimes tease you?",
- "How do you think your childhood experiences relate to your feelings today?"]],
-
- [r'(.*)\?',
- [ "Why do you ask that?",
- "Please consider whether you can answer your own question.",
- "Perhaps the answer lies within yourself?",
- "Why don't you tell me?"]],
-
- [r'quit',
- [ "Thank you for talking with me.",
- "Good-bye.",
- "Thank you, that will be $150. Have a good day!"]],
-
- [r'(.*)',
- [ "Please tell me more.",
- "Can you elaborate on that?",
- "Why do you say that %1?",
- "interesting.",
- "How do you feel when you say that?",
- "Why is everyone whispering about me?",
- "My stats are at http://wiki.themanaworld.org/index.php/Manamarket what are yours?",
- "I'm a Friendly Bot",
- "My father died in a fire.",
- "Have you met my mother?",
- "I am an AFK bot",
- "Big Crunch is known as the abusive GM.",
- "Narus claims she is evil but she is really sweet.",
- "Prsm has great announcements but his spelling sux.",
- "Platyna used to host the game but she was too smart for her own good.",
- "Captain Awesome has delusions of being an evil stone."
- ]]
- ]
- #----------------------------------------------------------------------
- # command_interface
- #----------------------------------------------------------------------
- def command_interface():
- print "Therapist\n---------"
- print "Talk to the program by typing in plain English, using normal upper-"
- print 'and lower-case letters and punctuation. Enter "quit" when done.'
- print '='*72
- print "Hello. How are you feeling today?"
- s = ""
- therapist = eliza();
- while s != "quit":
- try: s = raw_input(">")
- except EOFError:
- s = "quit"
- print s
- while s[-1] in "!.": s = s[:-1]
- print therapist.respond(s)
- if __name__ == "__main__":
- command_interface()
|