一个简单的问答系统

任务目标

  • 基于开源模块进行搭建一个问答系统
    • 能够提取关键词
    • 暂时对性能没有特别高的要求
    • 需要在自定义数据集上测试通过(用户问题是封闭的)
    • 对话语言是中文

任务实现

搭建一个简单的问答系统可以分为以下几个步骤:

  1. 准备数据:收集并准备一个包含问题和答案的自定义数据集。
  2. 关键词提取:使用之前实现的关键词提取功能。
  3. 问答匹配:根据提取的关键词在数据集中查找最佳答案。
  4. 构建问答系统:整合以上功能,实现完整的问答流程。

工具准备

  1. Pycharm
  2. anaconda
    • 相当于集成的python
    • 自带conda 包管理器,可以很方便地安装、更新和管理包和依赖。
    • 虚拟环境:可以创建和管理独立的虚拟环境,解决不同项目间依赖冲突问题

创建虚拟环境

  1. 启动Anaconda Navigator
  2. 在Environments中点击创建
    • 设置虚拟环境名称&语言选择&版本选择
    • 记下Location(需要在PyCharm接入)

PyCharm项目创建

New Project
  • Interpreter type选择Custom environment
  • Enviroment选择Select existing
  • Python path 选择刚刚创建的虚拟环境中Location下的python.exe文件!

在这里插入图片描述

创建src目录
安装必要的包
  • 在Terminal中键入
    1. pip install flask
    2. pip install jieba
  • 成功—>successfully

准备数据

首先,准备一个包含问题和答案的数据集。可以使用 JSON 格式保存,例如:

  {"question": "人工智能是未来科技发展的重要方向。", "answer": "是的,人工智能是未来科技发展的重要方向。"},
  {"question": "什么是机器学习?", "answer": "机器学习是一种通过算法从数据中自动学习并进行预测的技术。"}
]

将数据保存为 qa_data.json 文件。

关键词提取

  1. 在src目录下创建keyword_extraction.py文件

  2. 编写以下代码:

    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)
    
解释代码
  1. 导入 jieba.analyse 模块

    import jieba.analyse
    
  2. 定义关键词提取函数

    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
    
  3. 测试关键词提取功能

    if __name__ == "__main__":
        sample_text = "人工智能是未来科技发展的重要方向。"
        keywords = extract_keywords(sample_text)
        print("提取的关键词:", keywords)
    
  4. 查看输出

  • 在控制台中提取的关键词列表:
提取的关键词: ['人工智能', '未来', '科技', '发展', '重要方向']

构建问答系统

  1. qa_data.json文件(自定义数据集)

  2. 编写问答系统代码:

    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("对不起,我无法回答您的问题。")
    
    
  3. 运行问答系统

    • 在 PyCharm 中运行 qa_system.py,输入问题,系统会根据关键词提取和匹配返回相应的答案。
解释代码
  1. 加载数据集

    def load_qa_data(filepath):
        with open(filepath, 'r', encoding='utf-8') as file:
            data = json.load(file)
        return data
    
  2. 提取关键词

    def extract_keywords(text, top_k=5):
        keywords = jieba.analyse.extract_tags(text, topK=top_k)
        return keywords
    
  3. 查找最佳匹配答案

    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
    
  4. 主程序

    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("对不起,我无法回答您的问题。")
    
    

运行演示

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值