Turing Test and Eliza
--D. Thiebaut (talk) 21:23, 4 March 2015 (EST)
Contents
Introduction to the Turing Test
Eliza Program
Version 1: Let's start with something very basic
# Eliza1.py
# D. Thiebaut
# A very short beginning program for Eliza
# --------------------------------------------------------------------------
# just print the string to the console
# will be transformed to something better later...
def myprint( string ):
print( string )
# sayGoodBye
# say goodbye to the user.
def sayGoodBye( name ):
myprint( "Good bye " + name )
# isGoodBye
# checks to see if what the user said is one of the keywords for
# ending the conversation.
def isGoodBye( userAnswer ):
if userAnswer.lower().strip() in [ "bye", "goodbye", "ciao" ]:
return True
else:
return False
def greetings():
myprint( "Hello there!" )
myprint( "What is your name?" )
name = input( "> " )
myprint( "Welcome " + name )
return name
# --------------------------------------------------------------------------
# main function
# --------------------------------------------------------------------------
def main():
# greet user and get her name
userName = greetings()
# conversation: get user input, and respond
for i in range( 1000 ):
# get user's statement
userAnswer = input( "> " )
# if it is a goodbye statement, exit the loop
if isGoodBye( userAnswer ) == True:
break
# tell the user to continue speaking
myprint( "Please tell me more..." )
# if we're here, it's because the loop stopped.
# say goodbye to the user
sayGoodBye( userName )
main()
Version 2: Let's randomize the program's prompts
The new code is highlighted.
# Eliza2.py
# D. Thiebaut
# A very short beginning program for Eliza
# with random prompts from the program.
import random
# --------------------------------------------------------------------------
# just print the string to the console
# will be transformed to something better later...
def myprint( string ):
print( string )
# sayGoodBye
# say goodbye to the user.
def sayGoodBye( name ):
myprint( "Good bye " + name )
# isGoodBye
# checks to see if what the user said is one of the keywords for
# ending the conversation.
def isGoodBye( userAnswer ):
if userAnswer.lower().strip() in [ "bye", "goodbye", "ciao" ]:
return True
else:
return False
def greetings():
myprint( "Hello there!" )
myprint( "What is your name?" )
name = input( "> " )
myprint( "Welcome " + name )
return name
# --------------------------------------------------------------------------
# main function
# --------------------------------------------------------------------------
def main():
prompts = ["Please go on...", "Please tell me more...",
"Interesting... Go on, please!", "Yes? Really? Go on",
"Weird... I'm not sure what to think of that..." ]
# greet user and get her name
userName = greetings()
# conversation: get user input, and respond
for i in range( 1000 ):
# get user's statement
userAnswer = input( "> " )
# if it is a goodbye statement, exit the loop
if isGoodBye( userAnswer ) == True:
break
# tell the user to continue speaking
myprint( random.choice( prompts ) )
# if we're here, it's because the loop stopped.
# say goodbye to the user
sayGoodBye( userName )
main()
Version 3: React to Negative User Answers
In this version the program will pick up on the user responding "No", or "Never", and respond differently if this is the case. The highlighted lines show the addition of new code.
# Eliza3.py
# D. Thiebaut
# A very short beginning program for Eliza
# with random prompts from the program.
import random
# --------------------------------------------------------------------------
# just print the string to the console
# will be transformed to something better later...
def myprint( string ):
print( string )
# sayGoodBye
# say goodbye to the user.
def sayGoodBye( name ):
myprint( "Good bye " + name )
# isGoodBye
# checks to see if what the user said is one of the keywords for
# ending the conversation.
def isGoodBye( userAnswer ):
if userAnswer.lower().strip() in [ "bye", "goodbye", "ciao" ]:
return True
else:
return False
# isNegativeAnswer
# returns True if user says a single word such as "no", or "never"
def isNegative( userAnswer ):
if userAnswer.lower().strip() in [ "no", "never" ]:
return True
else:
return False
def greetings():
myprint( "Hello there!" )
myprint( "What is your name?" )
name = input( "> " )
myprint( "Welcome " + name )
return name.capitalize()
# --------------------------------------------------------------------------
# main function
# --------------------------------------------------------------------------
def main():
prompts = ["Please go on...", "Please tell me more...",
"Interesting... Go on, please!", "Yes? Really? Go on",
"Weird... I'm not sure what to think of that..." ]
promptsNegative = [ "Such strong words!", "Really?", "Why?",
"My, we are so negative today!",
"You really think so?", "Why not?" ]
# greet user and get her name
userName = greetings()
# conversation: get user input, and respond
for i in range( 1000 ):
# get user's statement
userAnswer = input( "> " )
# if it is a goodbye statement, exit the loop
if isGoodBye( userAnswer ) == True:
break
# tell the user to continue speaking
if isNegative( userAnswer ) == True:
myprint( random.choice( promptsNegative ) )
else:
myprint( random.choice( prompts ) )
# if we're here, it's because the loop stopped.
# say goodbye to the user
sayGoodBye( userName )
main()
Version 4: Detect Answer Mentioning Family
# Eliza4.py
# D. Thiebaut
# A very short beginning program for Eliza
# with random prompts from the program.
import random
# --------------------------------------------------------------------------
# just print the string to the console
# will be transformed to something better later...
def myprint( string ):
print( string )
# sayGoodBye
# say goodbye to the user.
def sayGoodBye( name ):
myprint( "Good bye " + name )
# isGoodBye
# checks to see if what the user said is one of the keywords for
# ending the conversation.
def isGoodBye( userAnswer ):
if userAnswer.lower().strip() in [ "bye", "goodbye", "ciao" ]:
return True
else:
return False
# isNegativeAnswer
# returns True if user says a single word such as "no", or "never"
def isNegative( userAnswer ):
if userAnswer.lower().strip() in [ "no", "never" ]:
return True
else:
return False
# isFamily
# returns True if the user says something about her family
# returns False otherwise.
def isFamily( userAnswer ):
foundIt = False
for word in ["mother", "father", "mom", "dad", "sister",
"brother" ]:
if userAnswer.lower().find( word ) != -1:
foundIt = True
return foundIt
def greetings():
myprint( "Hello there!" )
myprint( "What is your name?" )
name = input( "> " ).capitalize()
myprint( "Welcome " + name )
return name
# --------------------------------------------------------------------------
# main function
# --------------------------------------------------------------------------
def main():
prompts = ["Please go on...", "Please tell me more...",
"Interesting... Go on, please!", "Yes? Really? Go on",
"Weird... I'm not sure what to think of that..." ]
promptsNegative = [ "Such strong words!", "Really?", "Why?",
"My, we are so negative today!",
"You really think so?", "Why not?" ]
familyPrompts = [ "Tell me more about your family",
"Let's talk more about your parents",
"Do you have brothers or sisters?",
"Interesting how our family comes up in the conversation",
"What about your mother?" ]
# greet user and get her name
userName = greetings()
# conversation: get user input, and respond
for i in range( 1000 ):
# get user's statement
userAnswer = input( "> " )
# if it is a goodbye statement, exit the loop
if isGoodBye( userAnswer ) == True:
break
# tell the user to continue speaking
if isNegative( userAnswer ) == True:
myprint( random.choice( promptsNegative ) )
elif isFamily( userAnswer ) == True:
myprint( random.choice( familyPrompts ) )
else:
myprint( random.choice( prompts ) )
# if we're here, it's because the loop stopped.
# say goodbye to the user
sayGoodBye( userName )
main()
Version 5: Do Reflection on answers of the form "I xxx you"
# Eliza5.py
# D. Thiebaut
# A very short beginning program for Eliza
# with random prompts from the program.
import random
# --------------------------------------------------------------------------
# just print the string to the console
# will be transformed to something better later...
def myprint( string ):
print( string )
# sayGoodBye
# say goodbye to the user.
def sayGoodBye( name ):
myprint( "Good bye " + name )
# isGoodBye
# checks to see if what the user said is one of the keywords for
# ending the conversation.
def isGoodBye( userAnswer ):
if userAnswer.lower().strip() in [ "bye", "goodbye", "ciao" ]:
return True
else:
return False
# isNegativeAnswer
# returns True if user says a single word such as "no", or "never"
def isNegative( userAnswer ):
if userAnswer.lower().strip() in [ "no", "never" ]:
return True
else:
return False
# isFamily
# returns True if the user says something about her family
# returns False otherwise.
def isFamily( userAnswer ):
foundIt = False
for word in ["mother", "father", "mom", "dad", "sister",
"brother" ]:
if userAnswer.lower().find( word ) != -1:
foundIt = True
return foundIt
def greetings():
myprint( "Hello there!" )
myprint( "What is your name?" )
name = input( "> " ).capitalize()
myprint( "Welcome " + name )
return name
# --------------------------------------------------------------------------
# main function
# --------------------------------------------------------------------------
def main():
prompts = ["Please go on...", "Please tell me more...",
"Interesting... Go on, please!", "Yes? Really? Go on",
"Weird... I'm not sure what to think of that..." ]
promptsNegative = [ "Such strong words!", "Really?", "Why?",
"My, we are so negative today!",
"You really think so?", "Why not?" ]
familyPrompts = [ "Tell me more about your family",
"Let's talk more about your parents",
"Do you have brothers or sisters?",
"Interesting how our family comes up in the conversation",
"What about your mother?" ]
# greet user and get her name
userName = greetings()
# conversation: get user input, and respond
for i in range( 1000 ):
# get user's statement
userAnswer = input( "> " )
# split answer into words
words = userAnswer.split( )
# if it is a goodbye statement, exit the loop
if isGoodBye( userAnswer ) == True:
break
# tell the user to continue speaking
if isNegative( userAnswer ) == True:
myprint( random.choice( promptsNegative ) )
elif words[0]=="I" and words[2]=="you":
words[0] = "you"
words[2] = "me"
userAnswer = " ".join( words )
myprint( userAnswer+ "?" )
elif isFamily( userAnswer ) == True:
myprint( random.choice( familyPrompts ) )
else:
myprint( random.choice( prompts ) )
# if we're here, it's because the loop stopped.
# say goodbye to the user
sayGoodBye( userName )
main()