本文目录导读:

我来介绍一个完整的Java问答系统实现方案。
基础数据模型
// 问题类
public class Question {
private String id;
private String content;
private String answer;
private String category;
private List<String> keywords;
private int hitCount; // 命中次数
// 构造方法
public Question(String id, String content, String answer, String category) {
this.id = id;
this.content = content;
this.answer = answer;
this.category = category;
this.keywords = new ArrayList<>();
this.hitCount = 0;
}
// getters and setters
// ...
}
问答引擎核心实现
// 简单问答引擎
public class QASystem {
private List<Question> questionBank;
private Map<String, List<Question>> keywordIndex;
public QASystem() {
this.questionBank = new ArrayList<>();
this.keywordIndex = new HashMap<>();
loadQuestions();
}
// 初始化问答库
private void loadQuestions() {
addQuestion(new Question("001", "什么是Java",
"Java是一种面向对象的编程语言", "编程"));
addQuestion(new Question("002", "Java有哪些特点",
"跨平台、面向对象、安全性高", "编程"));
addQuestion(new Question("003", "什么是数组",
"数组是存储同类型元素的集合", "数据结构"));
}
// 添加问题并建立索引
public void addQuestion(Question q) {
questionBank.add(q);
// 简单分词和索引
String[] words = q.getContent().split("[\\s,,。;;::、??!!]");
for (String word : words) {
if (word.length() > 0) {
keywordIndex.computeIfAbsent(word, k -> new ArrayList<>()).add(q);
}
}
}
// 核心问答方法
public String ask(String question) {
// 1. 精确匹配
Question exactMatch = findExactMatch(question);
if (exactMatch != null) {
exactMatch.setHitCount(exactMatch.getHitCount() + 1);
return exactMatch.getAnswer();
}
// 2. 关键词匹配
String[] words = segment(question);
Map<Question, Integer> scoreMap = new HashMap<>();
for (String word : words) {
List<Question> matches = keywordIndex.get(word);
if (matches != null) {
for (Question q : matches) {
scoreMap.merge(q, 1, Integer::sum);
}
}
}
// 3. 选择最佳匹配
Question bestMatch = null;
int bestScore = 0;
for (Map.Entry<Question, Integer> entry : scoreMap.entrySet()) {
if (entry.getValue() > bestScore) {
bestScore = entry.getValue();
bestMatch = entry.getKey();
}
}
if (bestMatch != null && bestScore >= 1) {
bestMatch.setHitCount(bestMatch.getHitCount() + 1);
return bestMatch.getAnswer();
}
return "抱歉,我没有找到相关答案";
}
// 简单分词
private String[] segment(String text) {
// 简化的分词实现
return text.toLowerCase().split("[\\s,,。;;::、??!!\\s]+");
}
// 精确匹配
private Question findExactMatch(String question) {
for (Question q : questionBank) {
if (q.getContent().equals(question)) {
return q;
}
}
return null;
}
}
高级匹配算法
// 使用TF-IDF进行相似度计算
public class AdvancedMatcher {
// 计算余弦相似度
public double cosineSimilarity(String text1, String text2) {
Map<String, Integer> freq1 = getWordFrequency(text1);
Map<String, Integer> freq2 = getWordFrequency(text2);
// 计算向量点积
double dotProduct = 0;
double norm1 = 0;
double norm2 = 0;
for (String key : freq1.keySet()) {
if (freq2.containsKey(key)) {
dotProduct += freq1.get(key) * freq2.get(key);
}
norm1 += freq1.get(key) * freq1.get(key);
}
for (int value : freq2.values()) {
norm2 += value * value;
}
if (norm1 == 0 || norm2 == 0) return 0;
return dotProduct / (Math.sqrt(norm1) * Math.sqrt(norm2));
}
// 获取词频
private Map<String, Integer> getWordFrequency(String text) {
Map<String, Integer> freq = new HashMap<>();
String[] words = text.toLowerCase().split("\\s+");
for (String word : words) {
freq.merge(word, 1, Integer::sum);
}
return freq;
}
}
完整的问答系统实现
// 完整的问答系统
public class CompleteQASystem {
private QASystem basicEngine;
private AdvancedMatcher matcher;
private Map<String, String> conversationHistory;
public CompleteQASystem() {
this.basicEngine = new QASystem();
this.matcher = new AdvancedMatcher();
this.conversationHistory = new HashMap<>();
initializeKnowledgeBase();
}
// 初始化知识库
private void initializeKnowledgeBase() {
// 添加更多专业领域的问题
addToKnowledgeBase("Java", "编程语言",
"Java是一种广泛使用的计算机编程语言");
addToKnowledgeBase("面向对象编程", "编程概念",
"面向对象编程是一种编程范式,使用对象和类的概念");
addToKnowledgeBase("数据结构", "计算机科学",
"数据结构是计算机中存储、组织数据的方式");
}
private void addToKnowledgeBase(String question, String category, String answer) {
Question q = new Question(
String.valueOf(System.currentTimeMillis()),
question, answer, category);
basicEngine.addQuestion(q);
}
// 智能问答
public String intelligentAsk(String question) {
// 1. 检查是否是上下文相关的问题
if (isFollowUpQuestion(question)) {
return handleFollowUp(question);
}
// 2. 使用基础引擎
String answer = basicEngine.ask(question);
// 3. 如果基础引擎没有找到答案,使用相似度匹配
if (answer.equals("抱歉,我没有找到相关答案")) {
answer = findSimilarAnswer(question);
}
// 4. 记录对话历史
conversationHistory.put(question, answer);
return answer;
}
// 判断是否是后续问题
private boolean isFollowUpQuestion(String question) {
String[] followUpWords = {"它", "这个", "那个", "具体", "为什么", "如何"};
for (String word : followUpWords) {
if (question.contains(word)) {
return true;
}
}
return false;
}
// 处理后续问题
private String handleFollowUp(String question) {
// 简化实现:返回最后一个问答的扩展信息
String lastQuestion = getLastQuestion();
if (lastQuestion != null) {
String lastAnswer = conversationHistory.get(lastQuestion);
return """ + lastQuestion + "\"的更多信息: " + lastAnswer;
}
return "请先提出完整的问题";
}
private String getLastQuestion() {
List<String> questions = new ArrayList<>(conversationHistory.keySet());
if (questions.isEmpty()) return null;
return questions.get(questions.size() - 1);
}
// 相似度匹配
private String findSimilarAnswer(String question) {
double bestScore = 0;
String bestAnswer = "抱歉,我没有找到相关答案";
// 遍历知识库,找最相似的问题
List<Question> allQuestions = new ArrayList<>();
// 获取所有问题的逻辑(简化)
allQuestions.forEach(q -> {
double score = matcher.cosineSimilarity(question, q.getContent());
if (score > bestScore && score > 0.3) { // 阈值0.3
bestScore = score;
bestAnswer = q.getAnswer();
}
});
return bestAnswer;
}
}
用户界面实现
// 命令行界面
public class QAController {
private CompleteQASystem qaSystem;
private Scanner scanner;
public QAController() {
this.qaSystem = new CompleteQASystem();
this.scanner = new Scanner(System.in);
}
public void start() {
System.out.println("=== 智能问答系统 ===");
System.out.println("输入 'quit' 退出系统");
System.out.println("===================\n");
while (true) {
System.out.print("请输入问题: ");
String input = scanner.nextLine().trim();
if (input.equalsIgnoreCase("quit") ||
input.equalsIgnoreCase("exit")) {
System.out.println("感谢使用,再见!");
break;
}
if (input.isEmpty()) continue;
String answer = qaSystem.intelligentAsk(input);
System.out.println("回答: " + answer);
System.out.println();
}
}
public static void main(String[] args) {
QAController controller = new QAController();
controller.start();
}
}
进阶功能扩展
// 支持更多功能的高级版本
public class AdvancedQASystem {
// 1. 支持多个答案
public List<String> getMultipleAnswers(String question, int maxCount) {
// 使用PriorityQueue按得分排序
PriorityQueue<ScoredAnswer> queue = new PriorityQueue<>(
(a, b) -> Double.compare(b.score, a.score));
// 对知识库中的问题评分
// ...
List<String> results = new ArrayList<>();
for (int i = 0; i < maxCount && !queue.isEmpty(); i++) {
results.add(queue.poll().answer);
}
return results;
}
// 2. 问答分析
public Map<String, Object> analyzeQuestions() {
Map<String, Object> analysis = new HashMap<>();
analysis.put("totalQuestions", totalQuestions);
analysis.put("mostAsked", getMostAsked(10));
analysis.put("unansweredCount", getUnansweredCount());
return analysis;
}
// 3. 上下文保持
private Queue<String> recentQuestions = new LinkedList<>();
public String contextualAsk(String question, String context) {
// 使用上下文信息改进匹配
String combinedQuery = question + " " + context;
return intelligentAsk(combinedQuery);
}
}
这个Java问答系统实现了:
- 基础问答功能:精确匹配和关键词匹配
- 智能匹配算法:使用相似度计算
- 上下文理解:处理后续问题
- 知识库管理:动态添加问题
- 用户界面:简单的命令行交互
你可以根据需要扩展更多功能,如:
- 集成中文分词库(如HanLP)
- 使用数据库存储知识库
- 添加Web界面
- 实现机器学习匹配算法