当我回答“是”以确认我确实要聊天后,此后每个响应都将得到“ null”。
没有尝试太多。在我尝试添加iFeelGenericResponse之前,代码是很棒的,所以我会说那里可能有问题。我还应该提到我只是从这个开始,所以这可能是一些明显的错误。我感谢所有帮助!
/*
Program: Eliza
Author: J. Gurka
Date: August 2019
Description: This program "talks" to a human in a fashion similar to a psychologist.
Reference: Based on the original Eliza program by Joseph Weisenbaum. See "Eliza" on
Wikipedia for history of the program and its importance in AI.
Assumptions and limitations:
1. Many limitations due to the complexity of natural language processing.
2. Punctuation is not handled well.
3. Contractions can cause problems.
4. Eliza doesn't "know" anything.
*/
import java.io.File;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Random;
public class Eliza {
private boolean talkSessionRequested;
private Scanner talkScanner;
private ArrayList<String> genericAnswers, iFeelGenericAnswers;
private int genericCount;
private Random randomGenerator;
private String userName, userAnswer, ElizaAnswer;
public Eliza () {
// set-up
genericAnswers = new ArrayList<String>(20);
genericCount = 0;
randomGenerator = new Random();
loadGenericAnswers();
talkScanner = new Scanner(System.in);
// "i feel" generic answers
iFeelGenericAnswers = new ArrayList<String>(20);
loadIFeelGenericAnswers();
}
private void loadGenericAnswers() {
// read answers for Eliza responses
Scanner genericScanner = null;
try {
genericScanner = new Scanner(new File("generic_answers.txt"));
while (genericScanner.hasNext()) {
genericAnswers.add(genericScanner.nextLine());
genericCount++;
}
}
catch (Exception ex) {
System.out.println("Error reading generic answers, program ending.");
System.exit(1);
}
genericScanner.close();
}
private void loadIFeelGenericAnswers() {
// read answers for Eliza responses
Scanner iFeelGenericScanner = null;
try {
iFeelGenericScanner = new Scanner(new File("i_feel_generic_answers.txt"));
while (iFeelGenericScanner.hasNext()) {
iFeelGenericAnswers.add(iFeelGenericScanner.nextLine());
genericCount++;
}
}
catch (Exception ex) {
System.out.println("Error reading i feel generic answers, program ending.");
System.exit(1);
}
iFeelGenericScanner.close();
}
public void introduceEliza() {
System.out.println("-----------\n");
System.out.println("Welcome to Eliza, one of the earliest programs to talk to the user.");
System.out.println("It was first written in the 1960's by Joseph Weisenbaum\n"
+ "to investigate AI and natural language processing.\n");
System.out.println("Eliza is designed to interact with a user like a psychologist,");
System.out.println("asking questions and responding to the answers.\n");
System.out.println("Is Eliza intelligent? You decide ...");
System.out.println("\n-----------\n");
}
public void startConversation() {
boolean talkRequested;
System.out.println("Hi, I'm Eliza. What's your name?");
System.out.print("You > ");
userName = talkScanner.nextLine();
System.out.println("Hi, " + userName + "! Want to chat for awhile?");
System.out.print(userName + " > ");
userAnswer = talkScanner.nextLine();
if ((userAnswer.length() >=3 &&
userAnswer.substring(0, 3).equalsIgnoreCase("yes")) ||
(userAnswer.length() >=2 &&
userAnswer.substring(0, 2).equalsIgnoreCase("ok"))) {
talkSessionRequested = true;
}
else {
talkSessionRequested = false;
}
}
public void talk () {
System.out.println("Eliza > How are you today?");
System.out.print(userName + " > ");
userAnswer = talkScanner.nextLine();
do {
// parse user answer and respond appropriately
if (userAnswer.length() >= 4 &&
userAnswer.substring(0,4).equalsIgnoreCase("I am")) {
ElizaAnswer = "Why are you " + userAnswer.substring(5) + "?";
}
else if (userAnswer.contains("sister") ||
userAnswer.contains("brother") ||
userAnswer.contains("mother") ||
userAnswer.contains("father") ) {
ElizaAnswer = "Tell me more about your family.";
}
else if (userAnswer.length() >= 2 &&
userAnswer.substring(0,2).equalsIgnoreCase("no")) {
ElizaAnswer = "Don't be so negative.";
}
else if (userAnswer.length() >= 3 &&
userAnswer.substring(0,3).equalsIgnoreCase("yes")) {
ElizaAnswer = "Good, you are being positive.";
}
else if (userAnswer.length() >= 6 &&
userAnswer.substring(0,6).equalsIgnoreCase("I want")) {
ElizaAnswer = "Why do you want " + userAnswer.substring(7) + "?";
}
else if (userAnswer.length() >= 7 &&
userAnswer.substring(0,7).equalsIgnoreCase("I think")) {
ElizaAnswer = "Why do you think " + userAnswer.substring(8) + "?";
}
else if (userAnswer.contains("job") ||
userAnswer.contains("work") ||
userAnswer.contains("occupation") ||
userAnswer.contains("profession") ) {
ElizaAnswer = "Tell me more about your job.";
}
else if (userAnswer.length() >= 6 &&
userAnswer.substring(0,6).equalsIgnoreCase("I feel")) {
ElizaAnswer = iFeelGenericAnswers.get(randomGenerator.nextInt(genericCount));
}
else {
}
if (!userAnswer.equalsIgnoreCase("bye")) {
System.out.println("Eliza > " + ElizaAnswer);
System.out.print(userName + " > ");
userAnswer = talkScanner.nextLine();
}
} while (!userAnswer.equalsIgnoreCase("bye")); // end main talk loop
System.out.println("Eliza > See you later ...");
} // end talk method
public static void main (String args[]) {
Eliza myEliza = new Eliza();
myEliza.introduceEliza();
myEliza.startConversation();
if (myEliza.talkSessionRequested) {
myEliza.talk();
}
else {
System.out.println("Eliza > OK, maybe tomorrow. Bye, bye!");
}
} // end main method
} // end Eliza