当前位置: 首页 > news >正文

【自然语言处理】实验三:新冠病毒的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 问答系统。该系统实现了文本预处理、向量化、相似度计算等核心功能,能够有效地为用户提供相关的答案。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Golang | Leetcode Golang题解之第406题根据身高重建队列
  • linux服务器配置及服务器资源命令使用查看
  • 【鸿蒙应用】总结一下ArkUI
  • 力扣题解2848
  • 【C语言】分支和循环(下)
  • C语言指针和数组梳理
  • opencv之图像轮廓(三)--凸包
  • Unity SRP 可编程渲染管线的基本用法
  • Python——俄罗斯方块
  • 『功能项目』切换职业面板【48】
  • 笔试强训day13
  • MySQL索引-聚簇索引和非聚簇索引
  • Android 11 FileProvider的使用和限制
  • URL的执行流程
  • 【C-项目】网盘(一期,线程池版)
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • Android交互
  • DataBase in Android
  • egg(89)--egg之redis的发布和订阅
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Java Agent 学习笔记
  • Java到底能干嘛?
  • k8s 面向应用开发者的基础命令
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 老板让我十分钟上手nx-admin
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 算法---两个栈实现一个队列
  • 微信小程序设置上一页数据
  • ​卜东波研究员:高观点下的少儿计算思维
  • #100天计划# 2013年9月29日
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (3)选择元素——(17)练习(Exercises)
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (算法)求1到1亿间的质数或素数
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)四层和七层负载均衡的区别
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .net Stream篇(六)
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • /usr/bin/env: node: No such file or directory
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • [000-01-022].第03节:RabbitMQ环境搭建
  • [AI 大模型] 百度 文心一言
  • [Algorithm][综合训练][拜访][买卖股票的最好时机(四)]详细讲解
  • [C#]手把手教你打造Socket的TCP通讯连接(一)
  • [CISCN2021 Quals]upload(PNG-IDAT块嵌入马)
  • [Datawhale AI夏令营 2024 第四期] 从零入门大模型微调之旅的总结
  • [IDF]摩斯密码
  • [IE编程] WebBrowser控件中设置页面的缩放