现在的智能问答系统的应用是非常普遍的,比如说客服,前台机器人,讲解机器人等很多场景都可能会用到FAQ问答系统,所谓的FAQ就是 frequently asked questions,也就是说在某个场景下,比较常见的一些问题。
首先我们来看看整体的FAQ流程,我们需要对输入的问题进行预处理,比如去停,分词等;然后需要对预处理之后的语料进行向量化,这里向量化的方法很多,也不拘泥于一种,常见的向量化方法有词频向量化、word2vec、tf-idf 等方法;向量化之后,就可以进行文本相似度计算了然后我们可以选取相似度最高的问题答案输出就可以了。
整个处理的流程图如下所示:

好了,明白了整个流程了之后,我们就可以开始搭建问答系统了。首先,是创建问答库,这里我们就创建一个十来个问题的问题库和答案库,顺序要一一对应起来:
问题库:

答案库:

好了,问答库弄好了之后,我们要对问题库进行预处理操作,主要就是进行分词操作,代码如下所示:

import jiebadef stopword_list():stopwords = [line.strip() for line in open('stopword.txt', encoding='utf-8').readlines()]return stopwordsdef seg_with_stop(sentence):sentence_seg = jieba.cut(sentence.strip())stopwords = stopword_list()out_string = ''for word in sentence_seg:if word not in stopwords:if word != '\t':out_string += wordout_string += " "return out_stringdef segmentation(sentence):sentence_seg = jieba.cut(sentence.strip())out_string = ''for word in sentence_seg:out_string += wordout_string += " "return out_stringinputQ = open('Question.txt', 'r', encoding='gbk')
outputQ = open('QuestionSeg.txt', 'w', encoding='gbk')
inputA = open('Answer.txt', 'r', encoding='gbk')
outputA = open('AnswerSeg.txt', 'w', encoding='gbk')for line in inputQ:line_seg = segmentation(line)outputQ.write(line_seg + '\n')outputQ.close()
inputQ.close()for line in inputA:line_seg = segmentation(line)outputA.write(line_seg + '\n')outputA.close()
inputA.close()

我们逐行对问题库进行了分词操作,然后输出。接下来我们就可以进行输入问题 query 进行向量化,然后和问题库中的问题向量进行相似度计算,这里我们用的是余弦相似度算法,然后取相似度最高的问题相对应的答案输出即可,其实流程是比较简单的。代码如下所示:

from sklearn.feature_extraction.text import CountVectorizer
import math
from segmentation import segmentationcount_vec = CountVectorizer()def count_cos_similarity(vec_1, vec_2):if len(vec_1) != len(vec_2):return 0s = sum(vec_1[i] * vec_2[i] for i in range(len(vec_2)))den1 = math.sqrt(sum([pow(number, 2) for number in vec_1]))den2 = math.sqrt(sum([pow(number, 2) for number in vec_2]))return s / (den1 * den2)def cos_sim(sentence1, sentence2):sentences = [sentence1, sentence2]# print(count_vec.fit_transform(sentences).toarray())  # 输出特征向量化后的表示# print(count_vec.get_feature_names())  # 输出的是切分的词, 输出向量各个维度的特征含义vec_1 = count_vec.fit_transform(sentences).toarray()[0]vec_2 = count_vec.fit_transform(sentences).toarray()[1]# print(len(vec_1), len(vec_2))return count_cos_similarity(vec_1, vec_2)def get_answer(sentence1):sentence1 = segmentation(sentence1)score = []for idx, sentence2 in enumerate(open('QuestionSeg.txt', 'r')):# print('idx: {}, sentence2: {}'.format(idx, sentence2))# print('idx: {}, cos_sim: {}'.format(idx, cos_sim(sentence1, sentence2)))score.append(cos_sim(sentence1, sentence2))if len(set(score)) == 1:print('暂时无法找到您想要的答案。')else:index = score.index(max(score))file = open('Answer.txt', 'r').readlines()print(file[index])while True:sentence1 = input('请输入您需要问的问题(输入q退出):\n')if sentence1 == 'q':breakelse:get_answer(sentence1)

好了,我们可以试试效果如何:

仅仅通过余弦相似度匹配,我们就可以有一个不错的效果了,这就是一个简单的问答系统搭建。希望能让大家对QA系统有一个初步的了解,如有纰漏之处,也请大家不吝指教,代码详情请见 GitHub,谢谢。

搭建一个简单的FAQ系统相关推荐

  1. SpringBoot搭建一个简单的天气预报系统(一)

    章节目录 1. 前言 2. 数据来源 3. 实战 3.1 开发环境 3.2 功能需求 3.3 手动编码 3.3.1 vo层 3.3.2 service层 3.3.3 controller层 3.3.4 ...

  2. 在kaldi工具包使用小数字语料库创建一个简单的ASR系统(番外篇)

    相信很多人已经看过kaldi英文官网上关于该系统的搭建流程.虽然官方已经写的很通俗易懂,但是第一次接触的话还是不可避免的会碰到许多坑.恰巧最近实践了一下,把整个实践过程写了下来.一是方便自己后续回顾本 ...

  3. 怎样用python搭建简单的系统_如何用Python搭建一个简单的推荐系统?

    推荐系统的相关知识我们已在前文中提到,在这篇文章中,我们会介绍如何用Python来搭建一个简单的推荐系统. 本文使用的数据集是MovieLens数据集,该数据集由明尼苏达大学的Grouplens研究小 ...

  4. 1-3.Win10系统利用Pycharm社区版安装Django搭建一个简单Python Web项目的步骤之三

    在1-1.Win10系统利用Pycharm社区版安装Django搭建一个简单Python Web项目的步骤之一 基础上进行如下操作: 所有路由不能全部都在myDjango下的urls.py路由文件中, ...

  5. iris流程图_如何搭建一个简单的机器学习流水线?

    阅读此分步教程,学会通过导入scikit-learn包来搭建一个简单的机器学习流水线(pipeline) 一个机器学习模型中,有很多可移动的组件需要被组合在一起,模型才能被执行并成功的得到结果.把机器 ...

  6. python旅游推荐系统_如何用Python搭建一个简单的推荐系统?

    推荐系统的相关知识我们已在前文中提到,在这篇文章中,我们会介绍如何用Python来搭建一个简单的推荐系统. 本文使用的数据集是MovieLens数据集,该数据集由明尼苏达大学的Grouplens研究小 ...

  7. eclipse maven项目 class类部署不到tomcat下_Springboot介绍以及用Eclipse搭建一个简单的Springboot项目教程

    简述 本文主要介绍Springboot以及用Eclipse搭建一个简单的Springboot项目. Springboot简介 Springboot是由Pivotal团队提供的全新框架,其设计目的是用来 ...

  8. 我的Serverless实战—基于Serverless搭建一个简单的WordPress个人博客图文详解-JJZ

    文正在参与 "100%有奖 | 我的Serverless 实战"征稿活动 活动链接:https://marketing.csdn.net/p/15940c87f66c68188cf ...

  9. 使用eNSP搭建一个简单的网络

    使用eNSP搭建一个简单的网络 第一次使用eNSP搭建一个简单的网络,在师傅的耐心讲解及自己的慢慢摸索下最终使得3台PC之间通过静态路由实现了互通. 一.前言 华为现在不知道是在eNSP进行优化还是咋 ...

最新文章

  1. c++ using namespace std; - 海明威 - 博客园
  2. 阿里广告技术最新突破:全链路联动-面向最终目标的全链路一致性建模
  3. Java集合之LinkedList
  4. winpe装双系统linux_使用syslinux在u盘安装pubbylinux和winpe双系统
  5. 单手撸了个springboot+mybatis+druid 1
  6. 产品需求文档写作方法(一)写前准备+梳理需求
  7. react native 之setState
  8. python里的正则表达式
  9. 设计模式详解——模版方法模式
  10. 计算机设计大赛的感悟,计算机设计大赛含金量
  11. 瀚高数据库命令备份还原
  12. GitHub代码,资源下载慢?怎么办?
  13. 淘宝开源深度学习端侧推理引擎 MNN
  14. PostgreSQL 一复合查询SQL优化例子 - (多个exists , 范围检索 , IN检索 , 模糊检索 组合)...
  15. Daily English-问爱好
  16. Python自动化办公:ppt文件操作教程
  17. 浅谈 Android 的安全启动和完整性保护
  18. Eastmoney-Spyder:股吧网页数据抓取分析(一)
  19. Python自然语言处理实战(1):NLP基础
  20. (附源码)python主机硬件配置推荐系统 毕业设计 231155

热门文章

  1. 黄油相机如何为视频添加贴纸 黄油相机为视频新增贴纸方法
  2. Bootstrap 响应式开发(2021.10.13)
  3. 青岛理工大学计算机基础考试,学校召开2019年下半年全国计算机等级考试考务协调会...
  4. 人民网报道金雅福集团董事长黄仕坤
  5. leetcode28.实现strStr()--简单词学KPM算法
  6. 60个实用Android框架
  7. MTTR和MTBF两个指标的简单介绍
  8. 时间序列数据分析与预测之Python工具汇总
  9. android短彩信相关
  10. 组件 :normal ordered local Broadcasts