任务目标
- 基于开源模块进行搭建一个问答系统
- 能够提取关键词
- 暂时对性能没有特别高的要求
- 需要在自定义数据集上测试通过(用户问题是封闭的)
- 对话语言是中文
任务实现
搭建一个简单的问答系统可以分为以下几个步骤:
- 准备数据:收集并准备一个包含问题和答案的自定义数据集。
- 关键词提取:使用之前实现的关键词提取功能。
- 问答匹配:根据提取的关键词在数据集中查找最佳答案。
- 构建问答系统:整合以上功能,实现完整的问答流程。
工具准备
- Pycharm
- anaconda
- 相当于集成的python
- 自带
conda
包管理器,可以很方便地安装、更新和管理包和依赖。 - 虚拟环境:可以创建和管理独立的虚拟环境,解决不同项目间依赖冲突问题
创建虚拟环境
- 启动Anaconda Navigator
- 在Environments中点击创建
- 设置虚拟环境名称&语言选择&版本选择
- 记下Location(需要在PyCharm接入)
PyCharm项目创建
New Project
- Interpreter type选择Custom environment
- Enviroment选择Select existing
- Python path 选择刚刚创建的虚拟环境中Location下的python.exe文件!
创建src目录
安装必要的包
- 在Terminal中键入
- pip install flask
- pip install jieba
- 成功—>successfully
准备数据
首先,准备一个包含问题和答案的数据集。可以使用 JSON 格式保存,例如:
{"question": "人工智能是未来科技发展的重要方向。", "answer": "是的,人工智能是未来科技发展的重要方向。"},
{"question": "什么是机器学习?", "answer": "机器学习是一种通过算法从数据中自动学习并进行预测的技术。"}
]
将数据保存为 qa_data.json
文件。
关键词提取
-
在src目录下创建keyword_extraction.py文件
-
编写以下代码:
import jieba.analyse def extract_keywords(text, top_k=5): """ 使用 jieba 提取文本中的关键词 :param text: 输入的文本 :param top_k: 提取的关键词数量 :return: 关键词列表 """ keywords = jieba.analyse.extract_tags(text, topK=top_k) return keywords if __name__ == "__main__": sample_text = "人工智能是未来科技发展的重要方向。" keywords = extract_keywords(sample_text) print("提取的关键词:", keywords)
解释代码
-
导入
jieba.analyse
模块:import jieba.analyse
-
定义关键词提取函数:
def extract_keywords(text, top_k=5): """ 使用 jieba 提取文本中的关键词 :param text: 输入的文本 :param top_k: 提取的关键词数量 :return: 关键词列表 """ keywords = jieba.analyse.extract_tags(text, topK=top_k) return keywords
-
测试关键词提取功能:
if __name__ == "__main__": sample_text = "人工智能是未来科技发展的重要方向。" keywords = extract_keywords(sample_text) print("提取的关键词:", keywords)
-
查看输出
- 在控制台中提取的关键词列表:
提取的关键词: ['人工智能', '未来', '科技', '发展', '重要方向']
构建问答系统
-
qa_data.json文件(自定义数据集)
-
编写问答系统代码:
import json import jieba.analyse # 读取数据集 def load_qa_data(filepath): with open(filepath, 'r', encoding='utf-8') as file: data = json.load(file) return data # 提取关键词 def extract_keywords(text, top_k=5): keywords = jieba.analyse.extract_tags(text, topK=top_k) return keywords # 查找最佳匹配答案 def find_best_answer(question, qa_data): question_keywords = extract_keywords(question) best_match = None max_overlap = 0 for entry in qa_data: entry_keywords = extract_keywords(entry['question']) overlap = len(set(question_keywords) & set(entry_keywords)) if overlap > max_overlap: max_overlap = overlap best_match = entry['answer'] return best_match if __name__ == "__main__": qa_data = load_qa_data('qa_data.json') while True: user_question = input("请输入您的问题(或输入'退出'结束程序):") if user_question.lower() in ['退出', 'exit', 'quit']: print("感谢您的使用,再见!") break answer = find_best_answer(user_question, qa_data) if answer: print("答案:", answer) else: print("对不起,我无法回答您的问题。")
-
运行问答系统
- 在 PyCharm 中运行
qa_system.py
,输入问题,系统会根据关键词提取和匹配返回相应的答案。
- 在 PyCharm 中运行
解释代码
-
加载数据集:
def load_qa_data(filepath): with open(filepath, 'r', encoding='utf-8') as file: data = json.load(file) return data
-
提取关键词:
def extract_keywords(text, top_k=5): keywords = jieba.analyse.extract_tags(text, topK=top_k) return keywords
-
查找最佳匹配答案:
def find_best_answer(question, qa_data): question_keywords = extract_keywords(question) best_match = None max_overlap = 0 for entry in qa_data: entry_keywords = extract_keywords(entry['question']) overlap = len(set(question_keywords) & set(entry_keywords)) if overlap > max_overlap: max_overlap = overlap best_match = entry['answer'] return best_match
-
主程序:
if __name__ == "__main__": qa_data = load_qa_data('qa_data.json') while True: user_question = input("请输入您的问题(或输入'退出'结束程序):") if user_question.lower() in ['退出', 'exit', 'quit']: print("感谢您的使用,再见!") break answer = find_best_answer(user_question, qa_data) if answer: print("答案:", answer) else: print("对不起,我无法回答您的问题。")