python简单的问答系统

目录

一,项目背景

二,目的

三,框架使用

四,完整代码解析

1.1 读取学习数据

1.2 根据问题生成答案

1.3 完整代码

五,HTML

六,学习总结


本文文章链接:python简单的问答系统-CSDN博客

一,项目背景

主要源于人们对快速、准确地从海量信息中获取信息的需求。随着互联网的飞速发展,网络上的信息呈现爆炸式增长,用户在面对如此庞大的信息海洋时,往往难以迅速找到所需信息。传统的搜索引擎虽然能够返回与关键词相关的网页,但用户仍需花费大量时间浏览不相关的内容,导致信息检索效率低下。

在这种背景下,问答系统应运而生。问答系统是一种信息检索系统的高级形式,它能够通过自然语言与用户进行交互,直接回答用户用自然语言提出的问题。问答系统的出现,不仅提高了信息检索的效率,还使得信息的获取更加便捷和智能化。

二,目的

其主要目的是通过自然语言与用户进行交互,快速、准确地回答用户提出的问题。问答系统可以根据用户输入的问题,自动输出答案,无需人工干预,部分问答系统支持语音输入,用户可以通过语音与系统进行交互,这进一步提高了系统的便捷性,实现人机交互的基础。

三,框架使用

环境准备:首先,确保你已经安装了Flask。如果没有,可以通过pip来安装:

pip install flask

导入必要的模块

from flask import Flask, request, jsonify, render_template

首先,我们导入了Flask框架,并创建了一个名为app的Flask应用实例。这里,我们指定了模板文件夹的路径为当前目录(.),意味着Flask将在当前目录下查找HTML模板文件。Flask应用通过路由函数来处理用户请求。

app = Flask(__name__, template_folder='.')

在这个示例中,我们定义了两个路由函数:indexget_response

1.index路由

@app.route('/')  
def index():  
    return render_template('index.html')

当用户访问应用的根URL(/)时,index函数会被调用。这个函数使用render_template函数来渲染一个名为index.html的HTML模板,并将其返回给用户。这个模板可能包含一个表单,允许用户输入问题并提交给服务器。

2.get_response路由

当用户通过GET请求访问/get_response URL时,get_response函数会被调用。这个函数首先从请求中获取名为question的查询参数(默认为空字符串),然后调用respond_to_question函数来生成对应的答案。最后,它使用jsonify函数将答案包装为一个JSON对象,并返回给客户端。

@app.route('/get_response', methods=['GET'])  
def get_response():  
    question = request.args.get('question', '')  
    answer = respond_to_question(question)  
    return jsonify({'answer': answer})

四,完整代码解析

我们来一起探讨如何使用Flask框架快速搭建一个简单的问答系统。这个系统基于一个文本文件来存储问题和答案的配对数据,并通过Web界面与用户进行交互。

1.1 读取学习数据

我们定义了一个名为learning_data_file的变量,它指向一个名为learning_data.txt的文本文件。这个文件包含了问题和答案的配对数据,每行一个配对,格式为“问题|答案”。

learning_data_file = 'learning_data.txt'  
  
def load_learning_data(file_path):  
    with open(file_path, 'r', encoding='utf-8') as file:  
        lines = file.readlines()  
    learning_data = [line.strip() for line in lines]  
    return learning_data  
  
learning_data = load_learning_data(learning_data_file)

我们编写了一个名为load_learning_data的函数,用于读取这个文件并将其内容加载到一个列表中。这个函数使用with语句打开文件,并逐行读取内容,然后去除每行末尾的换行符或其他空白字符,最后返回处理后的列表。

1.2 根据问题生成答案

respond_to_question函数负责根据用户的问题生成对应的答案。它遍历learning_data列表中的每个条目,并检查用户的问题是否包含在条目中。如果找到匹配的问题,就使用split('|')[1]将条目分割成两部分(问题和答案),并返回答案部分。如果在整个列表中都没有找到匹配的问题,函数会返回一个默认的消息:“对不起,我还不能理解这个问题。”

def respond_to_question(question):  
    for data in learning_data:  
        if question in data:  
            return data.split('|')[1]  # 假设数据格式为问题|答案  
    return "对不起,我还不能理解这个问题。"

1.3 完整代码
from flask import Flask, request, jsonify, render_template

app = Flask(__name__, template_folder='.')

# 读取学习数据
learning_data_file = 'learning_data.txt'

def load_learning_data(file_path):
    with open(file_path, 'r', encoding='utf-8') as file:
        lines = file.readlines()
    learning_data = [line.strip() for line in lines]
    return learning_data

learning_data = load_learning_data(learning_data_file)

# 处理用户请求
@app.route('/')
def index():
    return render_template('index.html')

@app.route('/get_response', methods=['GET'])
def get_response():
    question = request.args.get('question', '')
    answer = respond_to_question(question)
    return jsonify({'answer': answer})

# 根据问题生成回答
def respond_to_question(question):
    for data in learning_data:
        if question in data:
            return data.split('|')[1]  # 假设数据格式为问题|答案
    return "对不起,我还不能理解这个问题。"

if __name__ == '__main__':
    app.run(debug=True)

总结:这个简单的问答系统展示了如何使用Flask框架来创建一个基本的Web应用。它读取一个文本文件中的数据,并根据用户通过HTTP GET请求发送的问题来返回相应的答案。虽然这个系统非常简单,但它为更复杂的Web应用提供了一个很好的起点。你可以根据自己的需求来扩展它,比如添加更多的路由和视图函数、使用数据库来存储数据、添加用户认证等等。

五,HTML

这是一个简单的HTML页面的代码,用于模拟一个问答系统的前端界面。这个HTML页面提供了一个简单的问答系统界面,用户可以在输入框中输入问题,并通过点击按钮发送问题。然而,这个界面仅包含了前端部分,实际的问答逻辑和与后端服务器的通信需要在JavaScript中实现。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>问答系统</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f2f2f2;
            padding: 20px;
            max-width: 600px;
            margin: 0 auto;
        }
        h1 {
            text-align: center;
            color: #333;
        }
        p {
            margin-bottom: 10px;
        }
        input[type="text"] {
            width: calc(100% - 90px);
            padding: 10px;
            font-size: 16px;
            border: 1px solid #ccc;
            border-radius: 4px;
            margin-right: 10px;
        }
        button {
            padding: 10px 20px;
            font-size: 16px;
            background-color: #007bff;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        button:hover {
            background-color: #0056b3;
        }
        #chat-container {
            background-color: #fff;
            border: 1px solid #ccc;
            border-radius: 4px;
            padding: 10px;
            margin-top: 20px;
            max-height: 300px;
            overflow-y: auto;
        }
        #chat-log p {
            margin: 5px 0;
            padding: 5px 10px;
            border-radius: 4px;
        }
        #chat-log p:nth-child(even) {
            background-color: #f2f2f2;
        }
        #chat-log p:nth-child(odd) {
            background-color: #e2e2e2;
        }
    </style>
</head>
<body>
    <h1>问答系统</h1>
    <p>请在下方输入您的问题:</p>
    <div>
        <input type="text" id="user_input" placeholder="请输入问题...">
        <button onclick="askQuestion()">发送</button>
    </div>
    <div id="chat-container">
        <div id="chat-log"></div>
    </div>

    <script>
        async function askQuestion() {
            const userQuestion = document.getElementById('user_input').value.trim();
            if (userQuestion === '') return;

            addToChatLog('你', userQuestion);

            try {
                const response = await fetch(`/get_response?question=${encodeURIComponent(userQuestion)}`);
                if (!response.ok) throw new Error('网络请求失败');
                const data = await response.json();
                addToChatLog('机器人', data.answer);
            } catch (error) {
                console.error('获取回复失败:', error.message);
                addToChatLog('机器人', '抱歉,发生了错误。请稍后再试。');
            }

            document.getElementById('user_input').value = '';
        }

        function addToChatLog(sender, message) {
            const chatLog = document.getElementById('chat-log');
            const chatEntry = document.createElement('p');
            chatEntry.innerHTML = `<strong>${sender}:</strong> ${message}`;
            chatLog.appendChild(chatEntry);

            chatLog.scrollTop = chatLog.scrollHeight;
        }
    </script>
</body>
</html>

六,学习总结

  1. 理论与实践相结合:在学习问答系统的过程中,我深刻体会到理论与实践相结合的重要性。只有将理论知识应用到实践中,才能更好地理解和掌握问答系统的实现方法。学习了如何收集和整理问答系统的数据,包括问题-答案对、领域知识等。
  2. 深入学习:在未来的学习中,我将继续深入学习问答系统的相关知识和技术,包括深度学习在问答系统中的应用、多模态问答系统等。
  3. 实践应用:我将尝试将所学的问答系统技术应用到实际项目中,如智能客服、在线教育等领域,以提高项目的智能化水平。
  4. 持续关注新技术:我将持续关注人工智能领域的新技术和发展趋势,了解新技术在问答系统中的应用,以不断提升自己的技术水平和竞争力。
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于知识图谱的心理咨询智能问答系统python源码+项目说明+数据.zip #### 知识图谱实体类型 | 实体类型 | 中文含义 | 举例 | | :---------------- | :------: | :------------------------------------- | | disease | 疾病名称 | 广泛性焦虑障碍 | | alternate_name | 疾病别称 | 泛化性焦虑症, 广泛焦虑障碍, 广泛焦虑症 | | pathogenic_site | 病发部位 | 全身 | | department | 科室 | 精神病科, 心理咨询科 | | symptom | 症状 | 心烦、头痛、坐立不安、惊恐伤肾阳痿... | | check | 检查项目 | 心理咨询 | | susceptible_crowd | 易感人群 | 成年人 | #### 知识图谱实体关系类型 | 实体关系类型 | 中文含义 | 举例 | | :---------------------- | :----------: | :--------------------------------- | | disease_alternate_name | 疾病别名 | <广泛性焦虑障碍,别称,泛化性焦虑症> | | disease_pathogenic_site | 疾病感染部位 | <广泛性焦虑障碍,感染部位,全身> | | disease_symptom | 疾病症状 | <广泛性焦虑障碍,症状,惊恐伤肾阳痿> | | disease_check | 疾病所需检查 | <广泛性焦虑障碍,检查,心理咨询> | | disease_department | 疾病所属科室 | <广泛性焦虑障碍,科室,心理咨询科> | | disease_complication | 并发症 | <广泛性焦虑障碍,并发症,强迫症> | | disease_confusable | 易混淆病症 | <广泛性焦虑障碍,易混淆病症,抑郁症> | | disease_crowd | 疾病易感人群 | <广泛性焦虑障碍,易感人群,成年人> | #### 知识图谱属性类型 | 属性类型 | 中文含义 | 举例 | | :------------ | :------: | :---------------------------------------------------------: | | expert_remind | 专家建议 | 患者忌吃带有刺激性的食物和烟酒,多吃些海产品、豆类、牛奶... | | infectivity | 传染性 | 该病不具有传染性 | | heredity | 遗传性 | 不遗传 | .......
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值