网站建设的技术体会,做推广的网站有哪些,网站开发工作要求,成都网站关键字优化目录 前言 1.新建data_process.py 1.1导入包并定义功能模块1用来读取问题和答案FAQ的文件 1.2功能模块2#xff1a;进行问题/问题列表处理#xff08;正则化#xff0c;分词#xff09; 1.3功能模块3#xff1a;处理输入的问题 1.4功能模块4#xff1a;计算输入问题与问题… 目录 前言 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, encodingutf-8) as f:list []lines f.readlines()for i in lines:list.append(i)return listread_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-IDFTerm 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 问答系统。该系统实现了文本预处理、向量化、相似度计算等核心功能能够有效地为用户提供相关的答案。