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 computer is thought to be more intelligent if it is more frequently able to fool the human tester into labelling it as a human. (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.
This is an individual assignment!
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 converted to lowercase and 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.
Each week, additional exercises related to the assignment will be provided at the end. These exercises are typically more challenging than the regular assignment. Bonus points will be provided to students who complete any of the "Hacker" level assignments.
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.
Loebner Competition: It's time to put your thinking caps on! We will run our own version of the Loebner competition in class. During the competition, you will get paired with either another student in the class, or one of your fellow classmates chatbot program. Your goal in class is to discover as many chatbots as possible. Your goal when writing the assignment is to fool as many of your peers as possible. The program which fools the most people will be awarded additional bonus points.
The assignment will be graded on the following requirements according to the course’s programming assignment rubric.
Functionality (75%): A functional program will:
- have a loop that repeatedly prompts the user for input and prints a response.
- look up the user's input in the dictionary and print the associated value as a response if it exists.
- print a random value from the dictionary if the user's input is not in the dictionary.
- add the user's last input and the program's last output as a new entry in the dictionary.
- ignore capital letters and non-alphabetic characters when looking up responses in the dictionary and preserves capital letters and non-alphabetic characters when printing responses.
Style (25%): A program with good style will:
- include a header comment signifying the authors of the file,
- avoid magic numbers (literal primitive numbers),
- use meaningful names for variables and functions,
- have statements that are small (80 characters or less including leading space) and do one thing,
- have functions that are small (40 lines or less including comments) and do one thing
- have a comment above functions that includes the purpose, the pre-conditions, and the post-conditions of the function.
- have spaces after commas in argument lists and spaces on both sides of binary operators (=, +, -, *, etc.).
Submit your program as a .py file on the course Inquire page before class on Monday November 28th.