【自然语言处理】实验三:新冠病毒的FAQ问答系统

目录

前言

1.新建data_process.py

1.1导入包并定义功能模块1用来读取问题和答案FAQ的文件

1.2功能模块2:进行问题/问题列表处理(正则化,分词)

1.3功能模块3:处理输入的问题

1.4功能模块4:计算输入问题与问题列表之间的余弦相似度,选出相似度最大的问题的索引

2.新建faq_test.py

2.1获取问题列表和答案列表并对问题列表进行预处理

2.2进行FAQ问答系统测试

2.3结果展示

总结


🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。

💡本文由Filotimo__✍️原创,首发于CSDN📚。

📣如需转载,请事先与我联系以获得授权⚠️。

🎁欢迎大家给我点赞👍、收藏⭐️,并在留言区📝与我互动,这些都是我前进的动力!

🌟我的格言:森林草木都有自己认为对的角度🌟。

前言

在信息时代,智能问答系统的应用越来越广泛,尤其是在疫情信息传播中,这类系统的作用尤为重要。


实验步骤:(新冠病毒的FAQ问答系统源码以及配套文件资源已上传)

1.新建data_process.py

1.1导入包并定义功能模块1用来读取问题和答案FAQ的文件
import re
import jieba
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
def read_corpus(file):with open(file, encoding='utf-8') as f:list = []lines = f.readlines()for i in lines:list.append(i)return list

`read_corpus` 函数负责从指定的文件中读取问题或答案。我们利用 `open` 函数打开文件,并逐行读取内容。每行内容被添加到列表中并最终返回。这一模块的功能比较简单,但它为后续的数据处理奠定了基础。

1.2功能模块2:进行问题/问题列表处理(正则化,分词)
def get_question_list(questions):if len(questions) == 1:  new_sent = re.sub(r'[^\w]', '', questions[0])new_sent = ''.join(e for e in new_sent if e.isalnum())new_sent = ' '.join(jieba.lcut(new_sent))return new_sentelse:question_list = []for sentence in questions:  new_sent = re.sub(r'[^\w]', '', sentence)new_sent = ''.join(e for e in new_sent if e.isalnum())seg_list = ' '.join(jieba.lcut(new_sent))question_list.append(seg_list)return question_list

`get_question_list` 函数负责对问题进行正则化和分词处理。正则化过程主要是去除标点符号和非字母数字字符。分词则是将连续的文本拆分成有意义的词汇,这里使用了 `jieba` 库进行中文分词处理。根据输入的参数,函数可以处理单个问题或多个问题列表。

1.3功能模块3:处理输入的问题
def input_question_process(questions_list, input_ques):questions_list_use = questions_list.copy()input_ques = [input_ques]input_question = get_question_list(input_ques)questions_list_use.append(input_question)vectorizer = TfidfVectorizer()vectorizer_related_ques = vectorizer.fit_transform(questions_list_use)return vectorizer_related_ques

在 `input_question_process` 函数中,我们首先将用户输入的问题与已有的问题列表进行整合。然后使用 `TfidfVectorizer` 将文本转化为 TF-IDF 向量表示。TF-IDF(Term Frequency-Inverse Document Frequency)是一种常用的文本特征提取方法,它可以反映词汇在文档中的重要性。

1.4功能模块4:计算输入问题与问题列表之间的余弦相似度,选出相似度最大的问题的索引
def ques_idx_cosine_sim(input_ques, questions):score = []input_ques = (input_ques.toarray())[0]for question in questions:question = question.toarray()num = float(np.matmul(question, input_ques))denom = np.linalg.norm(question) * np.linalg.norm(input_ques)cos = num / (denom + 1e-3)score.append(cos)if max(score) < 0.1:print('对不起,本FAQ库中暂时没有与您的提问相关的内容,我们将努力改进!')else:best_idx = score.index(max(score))return best_idx

`ques_idx_cosine_sim` 函数计算用户输入的问题与问题列表中所有问题之间的余弦相似度。余弦相似度是衡量两个向量相似度的一种方法,它值域在 [-1, 1] 之间,值越大表示相似度越高。我们使用 `numpy` 库中的线性代数操作计算相似度,并从中选择最相似的问题索引。

2.新建faq_test.py

在faq_test.py部分,会将前面的功能模块整合,完成了一个简单的 FAQ 问答系统。系统的运行步骤如下:

1. 从文件中读取问题和答案。
2. 对问题进行预处理,得到处理后的问题列表。
3. 循环接收用户输入的问题,对输入问题进行处理,并计算其与 FAQ 问题的相似度。
4. 根据相似度选择最匹配的问题,并输出对应的答案。

2.1获取问题列表和答案列表并对问题列表进行预处理
questions = read_corpus('./data/questions.txt')
answers = read_corpus('./data/answers.txt')questions_list = get_question_list(questions)
2.2进行FAQ问答系统测试
print('欢迎您使用FAQ问答系统...')
while True:input_ques = input('请输入您需要了解的新冠病毒问题(输入q退出系统):\n')if input_ques == 'q':print('谢谢您的关注!')breakelse:ques_process = input_question_process(questions_list, input_ques)print('正在FAQ库中寻找答案,请稍等...')answer_idx = ques_idx_cosine_sim(ques_process[-1], ques_process[0:-1])if answer_idx is not None:print('亲,我们给您找到的答案如下: \n', answers[answer_idx])print('FAQ库中相似的问题:', questions[answer_idx])
2.3结果展示


总结

通过此次实验,我们成功构建了一个基于 Python 的新冠病毒 FAQ 问答系统。该系统实现了文本预处理、向量化、相似度计算等核心功能,能够有效地为用户提供相关的答案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1535726.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Python | Leetcode Python题解之第405题数字转换为十六进制数

题目&#xff1a; 题解&#xff1a; CONV "0123456789abcdef" class Solution:def toHex(self, num: int) -> str:ans []# 32位2进制数&#xff0c;转换成16进制 -> 4个一组&#xff0c;一共八组for _ in range(8):ans.append(num%16)num // 16if not num:b…

Python实用的27个实例,涵盖从基础到进阶的所有领域!

Python 是一种广泛使用的高级编程语言&#xff0c;以其简洁的语法和丰富的库支持而受到开发者们的喜爱。以下列出了 27 个实用的 Python 实例&#xff0c;涵盖从基础到进阶的不同领域&#xff0c;帮助你提升编程技能。 1. 打印 "Hello, World!" print("Hello,…

预训练发展

预训练发展 1.ELMo2.GPT3.Bert3.1Ernie-baidu3.2Ernie- Tsinghua 4.GPT25.UNILM6.Transformer-XL & XLNet6.1方案一6.2方案三 7.Roberta8.SpanBert8.1SBO简介&#xff1a; 9.ALBERT9.1方案一9.2方案二9.3方案三 10.T511.GPT312.从"续写"到"回答"12.1SF…

可解释性机器学习中的局部解释

可解释性机器学习可以被分成两大类&#xff0c;第一大类叫做局部的解释&#xff0c;第二大类叫做全局的 解释&#xff0c;如图 1 所示。局部的解释是&#xff0c;比如有一个图像分类器&#xff0c;输入一张图片&#xff0c;它会判断出 是一只猫&#xff0c;机器要回答问题是为什…

浅谈Spring Cloud:认识微服务

SpringCloud就是分布式微服务架构的一站式解决方案&#xff0c;是微服务架构落地的多种技术的集合。 目录 微服务远程调用 Eureka注册中心 搭建Eureka Server 注册组件 服务拉取 当各种各样的服务越来越多&#xff0c;拆分的也越来越细&#xff0c;此时就会出现一个服务集…

速通GPT:《Improving Language Understanding by Generative Pre-Training》全文解读

文章目录 速通GPT系列几个重要概念1、微调的具体做法2、任务感知输入变换3、判别式训练模型 Abstract概括分析和观点1. 自然语言理解中的数据问题2. 生成预训练和监督微调的结合3. 任务感知输入变换4. 模型的强大性能 Introduction概括分析和观点1. 自然语言理解的挑战在于对标…

Android源码导入Android Studio

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 前言 需要先把 Android 源码编译一遍 然后执行下面指令就可以导入android源码了 关于 Android 源码编译可以参考这篇文章【LineageOS源码下载和编译&#xf…

【检索快,IEEE独立出版】2024年第四届电子信息工程与计算机科学国际会议(EIECS 2024)

大会简介&#xff1a; 2024年第四届电子信息工程与计算机科学国际会议&#xff08;EIECS 2024&#xff09;将于2024年9月27日至29日在中国延吉举行。会议由长春理工大学主办&#xff0c;延边大学、长春理工大学电子信息工程学院、长春理工大学计算机科学技术学院、长春理工大学…

蛋白质原子坐标平移、旋转、缩放示例代码

在处理蛋白质结构时,常常需要对原子的坐标进行几何变换,如平移、旋转和缩放。这些变换在模拟、可视化和结构比较中非常有用。 以下是对这些操作的介绍以及示例代码。 1. 平移 (Translation) 平移就是将所有原子的坐标沿着某个方向进行移动。平移可以通过向每个原子的坐标加…

解锁4款专业的中英翻译工具,让你畅行双语世界。

中英翻译工具在国际化交流越来越频繁的今天还是起着巨大的作用的&#xff0c;它能够促进很多知识的传播和共享&#xff0c;也能够便利大家的工作&#xff0c;学习和生活。今天我就要跟大家分享4个我一直都在用的中英翻译工具。 1、福昕中英翻译网站 直达&#xff1a;https://f…

LeetCode 第415场周赛个人题解

目录 Q1. 数字小镇中的捣蛋鬼 原题链接 思路分析 AC代码 Q2. 最高乘法得分 原题链接 思路分析 AC代码 Q3. 形成目标字符串需要的最少字符串数 I 原题链接 思路分析 AC代码 Q4. 形成目标字符串需要的最少字符串数 II 原题链接 思路分析 AC代码 Q1. 数字小镇中的捣…

数据库全攻略:从类型到安全与优化

数据库全攻略&#xff1a;从类型到安全与优化 一、数据库类型大观 &#xff08;一&#xff09;关系型数据库 关系型数据库以表格形式存储数据&#xff0c;通过 SQL 语言进行操作&#xff0c;数据之间存在关联关系&#xff0c;适合复杂查询和事务处理。常见的关系型数据库有 …

springboot瑜伽课约课小程序-计算机毕业设计源码87936

摘要 本文详细阐述了一个基于SpringBoot框架的瑜伽课约课小程序的设计与实现过程。随着现代生活节奏的加快&#xff0c;越来越多的人开始关注身心健康&#xff0c;瑜伽作为一种集健身、放松、减压于一体的运动方式&#xff0c;受到了广泛的欢迎。为满足瑜伽爱好者的课程预约和学…

Ubuntu 22.04.5 LTS 发布下载 - 现代化的企业与开源 Linux

Ubuntu 22.04.5 LTS (Jammy Jellyfish) - 现代化的企业与开源 Linux Ubuntu 22.04.5 发布&#xff0c;配备 Linux 内核 6.8 请访问原文链接&#xff1a;https://sysin.org/blog/ubuntu-2204/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xf…

Recyclerview实现滑动居中缩放菜单

最近项目中需要的一个滑动菜单效果:要求当前居中选项放大、滑动时有缩放效果、点击两边的选项滑动到屏幕中央、停止滑动选项停留在屏幕中间(类似viewPager的效果),为了直观,先上最终实现效果图: 大体思路: Recyclerview item头尾添加空数据,让第一个和最后一个item也能…

c++题目_【模板】最小生成树Prim

题目描述 这是一道最小生成树Prim的模板题&#xff0c;本题与【模板】最小生成树Kruskal&#xff0c;仅仅只有nn和mm的大小不同 给出一个无向图&#xff0c;求出最小生成树&#xff0c;如果该图不连通&#xff0c;则输出orz 输入 第一行输入2个正整数n,mn,m&#xff0c;代表…

数据可视化pyecharts——数据分析(柱状图、折线图、饼图)

安装 首先确保已经安装了pyecharts库&#xff0c;如果没有&#xff0c;可以通过pip install pyecharts进行安装。 柱状图 从pyecharts.charts导入Bar&#xff0c;从pyecharts导入options。准备数据&#xff08;如类别数据x_data和对应的数值数据y_data&#xff09;。创建Bar对…

解决win11 使用wsl工具,不能使用systemctl

使用systemctl命令出现报错&#xff1a; System has not been booted with systemd as init system (PID 1). Can‘t operate. 默认情况下并不启用 systemd&#xff0c;而是使用了其他轻量级的初始化系统&#xff08;SysV init初始化系统&#xff09;。这导致一些需要 system…

力扣最热一百题——螺旋矩阵

目录 题目链接&#xff1a;54. 螺旋矩阵 - 力扣&#xff08;LeetCode&#xff09; 题目描述 示例 提示&#xff1a; 解法一&#xff1a;模拟 1. 边界初始化 2. 循环遍历矩阵 3. 从左到右遍历上边界 4. 从上到下遍历右边界 5. 从右到左遍历下边界 6. 从下到上遍历左边…

【GPU版】Windows下PyTorch入门深度学习环境安装与配置

如果电脑有NVIDIA GPU显卡&#xff0c;看【GPU版本】&#xff1b;否则&#xff0c;看【CPU版本】 聊聊PyTorch和Tensorflow 它们都是python的库/包 pip3是给python3使用的&#xff0c;由于现在用的python基本上都是3以上版本&#xff0c;所以pip和pip3没有区别 聊聊Anacond…