Difference between revisions of "CSC111 Eliza 1"
Line 2: | Line 2: | ||
---- | ---- | ||
+ | =Newer Version (with functions) = | ||
+ | <br /> | ||
+ | <source lang="python"> | ||
+ | # Eliza1.py | ||
+ | # D. Thiebaut | ||
+ | # | ||
+ | # a very simple beginning for an eliza-like program | ||
+ | # | ||
+ | # 1) greet user | ||
+ | # 2) repeat a huge number of times: | ||
+ | # 2.1) get user's statement about life | ||
+ | # 2.2) do a reflexion first to second person | ||
+ | # by replacing I by you, me by you, | ||
+ | # mine by yours, my by your, etc... | ||
+ | # and also 2nd to first person | ||
+ | # 2.3) figure out what to print | ||
+ | # if the sentence was reflected, then print it | ||
+ | # if the sentence contained no or never, then | ||
+ | # react to it | ||
+ | # otherwise, just a random canned sentence | ||
+ | # | ||
+ | |||
+ | import random | ||
+ | |||
+ | # canned answers that the program will use to get the | ||
+ | # user to keep the conversation going... | ||
+ | canned = [ "\nPlease tell me more", | ||
+ | "\nI see...", | ||
+ | "\nGo on...", | ||
+ | "\nTell me more", | ||
+ | "\nWhy do you say that?", | ||
+ | "\nIn what way?", | ||
+ | "\nI am listening..." ] | ||
+ | |||
+ | # canned answers that the program will use when the | ||
+ | # user is responding in the negative ("no", or "never") | ||
+ | cannedNegative = [ "\nMy, my, so negative!", | ||
+ | "\nNo?", | ||
+ | "\nIsn't that a bit strong?", | ||
+ | "\nReally?", | ||
+ | "\nYou really think so?", | ||
+ | "\nWhy not?" ] | ||
+ | |||
+ | # -------------------------------------------------------------------------- | ||
+ | # Greetings(): greets the user and explains how to stop program | ||
+ | # -------------------------------------------------------------------------- | ||
+ | def Greetings(): | ||
+ | print( "Welcome. Please tell me of your problems: " ) | ||
+ | print( '(You may quit at any time by answering "bye")' ) | ||
+ | |||
+ | def isGoodBye( reply ): | ||
+ | if reply.lower().strip() in ["bye", "cia", "au revoir", "i'm done" ]: | ||
+ | return True | ||
+ | return False | ||
+ | |||
+ | # -------------------------------------------------------------------------- | ||
+ | # doReflection( words, newWords ). replaces I by you and you by I, including | ||
+ | # pronouns such as mine and yours. The reflected words are stored in newWords | ||
+ | # -------------------------------------------------------------------------- | ||
+ | def doReflection( words, newWords ): | ||
+ | for i in range( len( words ) ): | ||
+ | # replace 1st by 2nd person | ||
+ | if words[i] == "I" : newWords[i] = "you" | ||
+ | if words[i] == "I'm" : newWords[i] = "you're" | ||
+ | if words[i] == "I've": newWords[i] = "you've" | ||
+ | if words[i] == "am" : newWords[i] = "are" | ||
+ | if words[i] == "was" : newWords[i] = "were" | ||
+ | if words[i] == "my" : newWords[i] = "your" | ||
+ | if words[i] == "mine": newWords[i] = "yours" | ||
+ | if words[i] == "me" : newWords[i] = "you" | ||
+ | |||
+ | # replace 2nd by 1st person | ||
+ | if words[i] == "you" : newWords[i] = "me" | ||
+ | if words[i] == "your" : newWords[i] = "my" | ||
+ | if words[i] == "yours" : newWords[i]= "mine" | ||
+ | |||
+ | # if we changed something, return True, otherwise return False | ||
+ | return words != newWords | ||
+ | |||
+ | # -------------------------------------------------------------------------- | ||
+ | # isNegativeStatement( words ) | ||
+ | # return True if one of the words is a negative word, such as no, not, never. | ||
+ | # -------------------------------------------------------------------------- | ||
+ | def isNegativeStatement( words ): | ||
+ | if len( words ) < 1: | ||
+ | return False | ||
+ | for word in words: | ||
+ | if word.lower() in [ "no", "not", "never", "nein", "jamais" ]: | ||
+ | return True | ||
+ | return False | ||
+ | |||
+ | # -------------------------------------------------------------------------- | ||
+ | # main function | ||
+ | # -------------------------------------------------------------------------- | ||
+ | def main(): | ||
+ | |||
+ | # 1) greet user | ||
+ | Greetings() | ||
+ | |||
+ | # 2) repeat a huge number of times | ||
+ | for i in range( 10000 ): | ||
+ | # --------------------------------------------- | ||
+ | # 2.1) get user's statement about life | ||
+ | # --------------------------------------------- | ||
+ | user = input( "\n> " ) | ||
+ | |||
+ | if isGoodBye( user ): | ||
+ | break | ||
+ | |||
+ | # --------------------------------------------- | ||
+ | # 2.2) do a reflection | ||
+ | # --------------------------------------------- | ||
+ | words = user.split( ) # get individual words | ||
+ | newWords = words[:] # create new list with the same words | ||
+ | |||
+ | isAReflection = doReflection( words, newWords ) | ||
+ | |||
+ | # --------------------------------------------- | ||
+ | # 2.3) figure out what to print | ||
+ | # --------------------------------------------- | ||
+ | if isAReflection: | ||
+ | # it's a reflection. Add a question mark and print | ||
+ | newWords[-1] = newWords[-1]+"?" | ||
+ | print( ' '.join( newWords ) ) | ||
+ | |||
+ | else: | ||
+ | # figure out if it's a regular canned answer or a negative canned answer | ||
+ | if isNegativeStatement( words ): | ||
+ | index = random.randrange( len( cannedNegative ) ) | ||
+ | print( cannedNegative[ index ] ) | ||
+ | else: | ||
+ | index = random.randrange( len( canned ) ) | ||
+ | print( canned[ index ] ) | ||
+ | |||
+ | main() | ||
+ | |||
+ | </source> | ||
+ | <br /> | ||
+ | =Old Version (no functions) = | ||
<source lang="python"> | <source lang="python"> | ||
# Eliza1.py | # Eliza1.py |
Revision as of 11:49, 26 March 2014
--D. Thiebaut 00:09, 11 March 2010 (UTC)
Newer Version (with functions)
# Eliza1.py
# D. Thiebaut
#
# a very simple beginning for an eliza-like program
#
# 1) greet user
# 2) repeat a huge number of times:
# 2.1) get user's statement about life
# 2.2) do a reflexion first to second person
# by replacing I by you, me by you,
# mine by yours, my by your, etc...
# and also 2nd to first person
# 2.3) figure out what to print
# if the sentence was reflected, then print it
# if the sentence contained no or never, then
# react to it
# otherwise, just a random canned sentence
#
import random
# canned answers that the program will use to get the
# user to keep the conversation going...
canned = [ "\nPlease tell me more",
"\nI see...",
"\nGo on...",
"\nTell me more",
"\nWhy do you say that?",
"\nIn what way?",
"\nI am listening..." ]
# canned answers that the program will use when the
# user is responding in the negative ("no", or "never")
cannedNegative = [ "\nMy, my, so negative!",
"\nNo?",
"\nIsn't that a bit strong?",
"\nReally?",
"\nYou really think so?",
"\nWhy not?" ]
# --------------------------------------------------------------------------
# Greetings(): greets the user and explains how to stop program
# --------------------------------------------------------------------------
def Greetings():
print( "Welcome. Please tell me of your problems: " )
print( '(You may quit at any time by answering "bye")' )
def isGoodBye( reply ):
if reply.lower().strip() in ["bye", "cia", "au revoir", "i'm done" ]:
return True
return False
# --------------------------------------------------------------------------
# doReflection( words, newWords ). replaces I by you and you by I, including
# pronouns such as mine and yours. The reflected words are stored in newWords
# --------------------------------------------------------------------------
def doReflection( words, newWords ):
for i in range( len( words ) ):
# replace 1st by 2nd person
if words[i] == "I" : newWords[i] = "you"
if words[i] == "I'm" : newWords[i] = "you're"
if words[i] == "I've": newWords[i] = "you've"
if words[i] == "am" : newWords[i] = "are"
if words[i] == "was" : newWords[i] = "were"
if words[i] == "my" : newWords[i] = "your"
if words[i] == "mine": newWords[i] = "yours"
if words[i] == "me" : newWords[i] = "you"
# replace 2nd by 1st person
if words[i] == "you" : newWords[i] = "me"
if words[i] == "your" : newWords[i] = "my"
if words[i] == "yours" : newWords[i]= "mine"
# if we changed something, return True, otherwise return False
return words != newWords
# --------------------------------------------------------------------------
# isNegativeStatement( words )
# return True if one of the words is a negative word, such as no, not, never.
# --------------------------------------------------------------------------
def isNegativeStatement( words ):
if len( words ) < 1:
return False
for word in words:
if word.lower() in [ "no", "not", "never", "nein", "jamais" ]:
return True
return False
# --------------------------------------------------------------------------
# main function
# --------------------------------------------------------------------------
def main():
# 1) greet user
Greetings()
# 2) repeat a huge number of times
for i in range( 10000 ):
# ---------------------------------------------
# 2.1) get user's statement about life
# ---------------------------------------------
user = input( "\n> " )
if isGoodBye( user ):
break
# ---------------------------------------------
# 2.2) do a reflection
# ---------------------------------------------
words = user.split( ) # get individual words
newWords = words[:] # create new list with the same words
isAReflection = doReflection( words, newWords )
# ---------------------------------------------
# 2.3) figure out what to print
# ---------------------------------------------
if isAReflection:
# it's a reflection. Add a question mark and print
newWords[-1] = newWords[-1]+"?"
print( ' '.join( newWords ) )
else:
# figure out if it's a regular canned answer or a negative canned answer
if isNegativeStatement( words ):
index = random.randrange( len( cannedNegative ) )
print( cannedNegative[ index ] )
else:
index = random.randrange( len( canned ) )
print( canned[ index ] )
main()
Old Version (no functions)
# Eliza1.py
# D. Thiebaut
#
# a very simple beginning for an eliza-like program
#
# 1) greet user
# 2) repeat a huge number of times:
# 2.1) get user's statement about life
# 2.2) do a reflexion first to second person
# by replacing I by you, me by you,
# mine by yours, my by your, etc...
# and also 2nd to first person
# 2.3) figure out what to print
# if the sentence was reflected, then print it
# if the sentence contained no or never, then
# react to it
# otherwise, just a random canned sentence
#
import random
from logging111 import Print
from logging111 import Raw_input
# canned answers that the program will use to get the
# user to keep the conversation going...
canned = [ "\nPlease tell me more",
"\nI see...",
"\nGo on...",
"\nTell me more",
"\nWhy do you say that?",
"\nIn what way?",
"\nI am listening..." ]
# canned answers that the program will use when the
# user is responding in the negative ("no", or "never")
cannedNegative = [ "\nMy, my, so negative!",
"\nNo?",
"\nIsn't that a bit strong?",
"\nReally?",
"\nYou really think so?",
"\nWhy not?" ]
# --------------------------------------------------------------------------
# main function
# --------------------------------------------------------------------------
def main():
# 1) greet user
Print( "Welcome. Please tell me of your problems: " )
Print( '(You may quit at any time by answering "bye")' )
# 2) repeat a huge number of times
for i in range( 10000 ):
# ---------------------------------------------
# 2.1) get user's statement about life
# ---------------------------------------------
user = Raw_input( "\n> " )
if ( user.lower() == "bye" ):
break
# ---------------------------------------------
# 2.2) do a reflection
# ---------------------------------------------
words = user.split( ) # get individual words
newWords = words[:] # create new list with the same words
for i in range( len( words ) ):
# replace 1st by 2nd person
if words[i] == "I" : newWords[i] = "you"
if words[i] == "I'm" : newWords[i] = "you're"
if words[i] == "I've": newWords[i] = "you've"
if words[i] == "am" : newWords[i] = "are"
if words[i] == "was" : newWords[i] = "were"
if words[i] == "my" : newWords[i] = "your"
if words[i] == "mine": newWords[i] = "yours"
if words[i] == "me" : newWords[i] = "you"
# replace 2nd by 1st person
if words[i] == "you" : newWords[i] = "me"
if words[i] == "your" : newWords[i] = "my"
if words[i] == "yours" : newWords[i]= "mine"
# ---------------------------------------------
# 2.3) figure out what to print
# ---------------------------------------------
if ( words != newWords ):
# it's a reflection. Add a question mark and print
newWords[-1] = newWords[-1]+"?"
Print( ' '.join( newWords ) )
else:
# figure out if it's a regular canned answer or a negative canned answer
if len( words )==1 and ( words[0].lower()=="no" or words[0].lower()=="never" ):
index = random.randrange( len( cannedNegative ) )
Print( cannedNegative[ index ] )
else:
index = random.randrange( len( canned ) )
Print( canned[ index ] )
main()