The Loebner Prize Competition is held every year to evaluate artificial intelligence chat programs using the Turing Test. In 1950, Alan Turing proposed a test to measure the intelligence of computers. In the Turing, test a subject has a text chat with either a person in another room or with a computer (the subject does not know which). There are no limits to what the subject can chat about, but when done chatting the subject must choose whether they think they were talking to a real person or to a computer. The more frequently a the computer computer is labeled as human, the more intelligent the computer is, according to the test. (Whether the Turing test is actually a measure of intelligence is debatable, but one interesting thing to consider is, what if a computer was labeled as human more than an actual human?) One simple artificial intelligence chat algorithm is to just repeat what other people have said previously in the same context.
Write a simple artificial intelligence chat program. The program should use a dictionary to associate phrases with responses. When a user types a phrase into a prompt the program should check if there is an entry for the phrase. If there is an entry it should print it, if there is not, then it should print a response for a random phrase in the dictionary. Note, the dictionary must be initialized with at least one phrase and response or else it will not be able to select a random phrase. After printing the response the program should repeat. The program should repeat a large fixed number of times and it should inform that user that pressing ctl-c will quit the program.
The chat will be very boring unless the program’s response dictionary is updated. The program should add the users input as a new response to the last phrase the program printed. That is, the program’s last output is the new key, and the user’s last input is the new value. The key should be stripped of all non-alphabetic characters to prevent capitalization and punctuation from affecting the look-up. If the key is already in the dictionary, the value should be overwritten with the new response.
Submission: Submit your code as a zip file on the course Inquire site by 5PM on Friday November 16th.
The test data for the program should consist of two text files. One text file should contain the input to the program, and the other text file should contain the expected output. The input file should consist of multiple lines of text, where each line is what the user of the program will enter into the program after each prompt. The output file should also consist of multiple lines of text, where each line is the program’s response to the corresponding line in the input file. Creating a test output file for this program is difficult because it sometimes randomly generates phrases. For the purposes of testing assume the program prints, “I’m speechless.” whenever it can not find a phrase in the dictionary.
Submission: Submit your test data as a zip file on the course Inquire site by 9AM on Monday November 12th.
Long Term Memory: The longer a person chats with the program the better it will be become. However, the program will lose all of this progress unless the program is able to remember phrases and responses from previous conversations. When the program first starts it should load the dictionary from a file using the pickle module. If the file does not exist, the program should start with an empty dictionary. To test if a file exists use the
os.path.isfile() function in the os module. The dictionary should also be written to a file whenever the dictionary is updated.
A Better Bot: One problem with the chat function is that it forgets previous (and perhaps better responses) when it encounters the same phrase twice. A better chat program would store a list of responses in each dictionary entry. When looking up a phrase the function should choose randomly from all of the phrases stored in the list. An even better chat program would also store how frequently each of the phrases in a list has been encountered and weight the random selection to favor of the more frequently encountered phrases.