ELIZA: Everything You've Always Wanted a
Therapist to Be
Created by: Kathy Lo
Updated by: Tanya
Holger H. Hoos
Comments to: Holger H. Hoos
Wouldn't it be great if computers could understand
what we say? What about the ability to have an actual conversation with a
computer? What if a computer could take the place of a psychologist,
saving patients hundreds of dollars in fees? Can computers be taught to
think? In this lab you will observe the behavior of a working model of
ELIZA and build your own version as well.
Before the Lab
Read through the lab, and any class notes
related to the lab. You should have experience using a text editor,
such as Notepad or WordPad, and a web browser, for example, Firefox or Internet Explorer.
ELIZA was invented in the early 1960s at MIT by Joseph Weizenbaum.
The name "Eliza" comes from the play Pygmalion, in which a
woman named Eliza Doolittle was taught to act and speak like an aristocrat
without truly understanding what she was saying. ELIZA attempts to
emulate a Rogerian psychologist by taking a patient's answers and reformulating
them as questions. When it was first released, many people confided their
deepest secrets to this computer program, believing it to be human, and some
psychologists believed that ELIZA could be used in place of a real
psychologist! Surprisingly enough, the technology behind ELIZA was not
very advanced, as you will see!
ELIZA is a classic example of natural language processing (NLP). This
field of computing science / psychology / linguistics studies how computers can be
taught to understand natural language (such as English) through text or speech,
or even how to translate a text into another language. There are many
versions of ELIZA out there, some more "intelligent" than others, but
they all rely on one principle: pattern matching.
But what is a pattern? A pattern is a specification of what should
appear and in what order. For example,
<letter><number><number><letter> is a pattern.
Strings that match this pattern include strings like "c67r" and
"p98t". Strings that don't match this pattern are
strings like "he39" and "699s". In ELIZA, a pattern
might look like <anything><" mother
"><anything>. Strings that match this pattern include
strings like "I talked to my mother today" and "My mother bought
me a pair of shoes", but not "I find him very
mothering". Why? Note the space before and after the word
"mother" in the pattern.
In this lab you will be able to observe this pattern
matching in action, as well as write some patterns of your own.
During the Lab
Part I: Ready-made Eliza
- Open a
web browser (Firefox or Internet Explorer) and go to
to Eliza by typing your text in the Input field and pressing Enter. Type the following phrases
(pressing Enter after each one) and note the response that Eliza gives
you. Based on what you know about pattern matching from above, how do you
think Eliza arrived at giving you the response you got?
Eliza. I am feeling very
Respond to Eliza
and continue the conversation for a few question / answer exchanges. What do you notice?
Eliza in the second person. Ask her questions about herself. (For example, ask how she is, how
much she charges, etc.).
about something in your life.
How does Eliza react?
Eliza about your family.
in nonsense of some sort.
How does Eliza respond?
your imagination! This is a "wildcard" question - type in anything
you want and note the response as before. Feel free to continue the
conversation you start as you would with a person.
another "wildcard" question and continue the conversation for a few
question / answer exchanges as you did in part (f).
Part II: Simple Eliza
Windows Explorer to create a new folder called eliza in your home
click on this folder to open it.
of this folder, create another folder called two. Any work
associated with this part of the lab should be saved in this directory.
the following files into your eliza/two subdirectory:
a Command Prompt window using the Start Menu. (Click on Start, then
Programs, then Accessories, then Command Prompt).
"javac *.java". (Note there is a space between
"javac" and the asterisk.)
up Firefox or Internet Explorer
and open the file eliza.html. This is the Eliza applet
that you are going to modify! Try it out - you'll note that it is very
use your favourite text editor to open MyEliza.java.
the initial greeting:
first thing you will do is modify the initial greeting when you first
open up Eliza. Study the code. Remember the first response you saw when you
opened up eliza.html? Can you find it? If you have trouble, use a
"search" or "find" command, which you can usually
find in the menus of your text editor.
this greeting string. Use your imagination! Remember that your string
should be in quotes, and that there should be a "\n" before
the last quotation mark and a semicolon after the last quotation
this\n"; (The "\n" is a special character
meaning "new line" (it has the same effect as pressing Enter)
so that your conversation is easier to read).
the same part of the file you will see a list of phrases such as "I
don't understand what you're getting at". These are the responses that
Eliza uses when it doesn't know how to respond to what you say (to hide
the fact that it actually didn't know what you were talking about). Add at
least three more responses:
do this, position your cursor at the end of the last response, past the
in another phrase in quotation marks.
the second and third phrases and beyond, repeat steps (a) to (d)
you are going to expand Eliza's vocabulary. MyEliza.java has one hashtable called qa with
keywords and some canned responses to those keywords. For the purpose of this lab, think
of a hashtable as a lookup table that contains keywords and associated
responses. When the user enters
a phrase, Eliza will take words from that phrase, and search the
keywords of the hashtable to see if any of these words is contained in
the hashtable. If the word is
found as a keyword in the hashtable, Eliza will use the response
that is associated with that keyword.
For example, try to visualize the
following associated keywords and phrases:
me more about your family.”
appears you have some issues with school.”
Now, assume that the user responds to Eliza with the
statement “My mother drives me crazy!”.
Eliza will search the keywords of the hashtable, and recognize the word
“mother” as a keyword that the table contains. As a result, Eliza will respond with the phrase associated
with this keyword, which is “Tell me more about your family.”.
(You will notice that if Eliza is unable to find a
word in the hashtable’s list of keywords, it will respond with a randomly
chosen general phrase, such as “Please elaborate on that a little more."
or "Please, do go on.")
Try adding at least five more pairs of keywords and associated
responses to the hashtable:
the lines of code that begin with qa.put
to this pattern to add more pairs to the hashtable underneath the lines
of code that are already there: qa.put("yourkeyword",
"your canned response"); . Keywords must not contain
spaces and must be in lowercase.
To test your modified version of Eliza, enter any sentence containing the
word "mother" into the text field and see what Eliza replies. (In fact, the "mother"
on its own will do the same thing.) Do the same for "class".
Note how the qa.put(...) statements in the code relate to this behaviour.
forget to save and re-compile to see your results (see step 3).
Close your browser window, and reopen the eliza.html page.
Part III: More Complicated Eliza
a new folder inside of your eliza folder and name it three.
All your work associated with this part of the lab should be saved in this
the following files into eliza/three:
the Java files (see part II, step 3).
Firefox or Internet Explorer to open eliza.html. Try it out.
This version of Eliza is a little bit more complex - it looks for phrases
as keyword instead of single words. For example, try out "I
have a problem with you".
your favourite text editor to open MyEliza.java. If you like, you
may modify the greeting and the list of "phrases used to feign
intelligence" as you did in Part II (step #7). To do this, open eliza/two/MyEliza.java
in another window and copy and paste your modifications into this file.
version of Eliza has two hashtables. The keywords hashtable contains pairs of keywords. For example, "classes" is associated with
"school". This table is there so that Eliza seems
intelligent by asking about school when you talk about your
classes. Just as you did in
Part II, add at least five new keyword pairs to this hashtable (do
not use the same additions you used in Part II). You may want to read through the next step as well before adding your keyword pairs.
second hashtable, startPhrases, is a list of pairs of phrases, sometimes containing the
Rather than search for a
keyword and respond with the corresponding phrase, this time Eliza searches
through a list of phrases, not words, which we will refer to as patterns. If the pattern is found in the
hashtable, Eliza responds with the corresponding phrase. We will refer to these pairs of phrases
as pattern-response pairs.
Visualizing this table (as in Part II step 8), our Keyword is now a
pattern, and the Phrase is now called the Response.
“I hate *KEYWORD*” “Why
do you hate *KEYWORD*?”
So, when a user tells Eliza “I hate you”, Eliza looks up and
finds the phrase “I hate *KEYWORD*” in the hashtable, and recognizes that the
corresponding response is “Why do you hate *KEYWORD*?”. Because the user has typed “you” as the
*KEYWORD* in the pattern, Eliza refers to first hashtable of keyword pairs, and
recognizes that the keyword associated with “you” is “me”, and therefore uses
“me” in place of the *KEYWORD* in the Response. Thus, Eliza responds to “I hate you” with “Why do you hate
Add at least five more patterns
that Eliza should watch out for. The patterns (that is, the left
side of the pattern-response pair) must abide by the following rules.
you choose to use any punctuation marks in your pattern, put a space
between the punctuation mark and any neighbouring characters like this
! (notice the space between "this" and the exclamation
patterns must be in lowercase.
pattern does not have to contain a "*KEYWORD*". If you would like it to scan for
a specific sentence such as "i feel blah today", go for it.
An example of an acceptable
pattern would be startPhrases.put("this part has to be in lowercase
with a space around *KEYWORD* ", "This part cAn bE wRiTten HOWEVER
(see part II) and Refresh your browser to see your results. If necessary, close and re-open
Show your TA:
- Your code for Part II. Open eliza.html (from your eliza/two
directory) in a web browser to demonstrate the additions
you have made to MyEliza.java to your TA.
- Your code for Part III. Open eliza.html (from your eliza/three
directory) in a web browser to demonstrate the additions
you have made to MyEliza.java to your TA.
For Part II: modified greeting as in step 6 (1 mark), three new
phrases as in step 7 (1.5 marks), five keyword-response phrases as in step 8
(2.5 marks). For Part III: five additional new keywords as in
step 4 (2.5 marks), and 5 pattern-response phrases as in step 5 (2.5 marks)
Be prepared to discuss your observations from Part I.
Check out http://en.wikipedia.org/wiki/Eliza
for more information on Eliza and http://en.wikipedia.org/wiki/Loebner_prize
for pointers to related, somewhat more advanced efforts.