赞
踩
信息检索、搜索 (简单,效果一般,对数据问答对的要求高)
关键词:tfidf、SVM、朴素贝叶斯、RNN、CNN
知识图谱(相对复杂,效果好,很多论文)
在图形数据库中存储知识和知识间的关系、把问答转化为查询语句、能够实现推理
从{位置}到{位置}的票
2个位置的参考地址:https://juejin.im/entry/59e96f946fb9a04510499c7f
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IcEKvmYW-1630157499067)(…/images/2.1/小蜜的交互过程.png)]
从图可以看出:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-33VrNWeK-1630157499069)(…/images/2.1/小蜜的架构.png)]
可以看出其流程为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7EnRpq3z-1630157499070)(…/images/2.1/小蜜的检索流程.png)]
通过上图可知,小蜜的检索式回答的流程大致为:
参考地址:http://www.6aiq.com/article/1536149308075?p=1&m=0
58的客服主要用户为公司端和个人端,智能客服主要实现自动回答,如果回答不好会转到人工客服,其中自动回答需要覆盖的问题包括:业务咨询、投诉建议等
整体来看,58的客服架构分为三个部分
KB-bot的流程大致为:
在问答模型的深度网络模型中使用了多套模型进行融合来获取结果
通过以上两个模型来组合获取相似的问题,返回相似问题ID对应的答案
58同城的闲聊机器人使用三种方法包括:
智能客服解决不了的可以使用人工客服来实现
在黑马头条的小智同学板块实现聊天机器人,能够起到智能客服
的效果,能够为使用app的用户解决基础的问题,而不用额外的人力。
但是由于语料的限制,所以这里使用了编程相关的问题,能够回答类似:python是什么
,python有什么优势
等问题
整个流程的描述如下:
闲聊模型使用了seq2seq模型实现
包含:
问答模型使用了召回和排序的机制来实现,保证获取的速度的同时保证了准确率
下载地址:https://mirror.tuna.tsinghua.edu.cn/help/anaconda/
下载对应电脑版本软件,安装
添加到环境变量
export PATH="/root/miniconda3/bin:$PATH"
创建虚拟环境
conda create -n 名字 python=3.6(版本)
conda env list
切换到虚拟环境
conda activate 名字
退出虚拟环境
conda deactivate 名字
文档地址:https://fasttext.cc/docs/en/support.html
github地址:<https://github.com/facebookresearch/fastText
安装步骤:
git clone https://github.com/facebookresearch/fastText.git
cd fastText
python setup.py install
文档地址:https://github.com/facebookresearch/pysparnn
安装步骤:
git clone https://github.com/facebookresearch/pysparnn.git
python setupy.py install
最终词典的格式:
词语 词性(不要和jieba默认的词性重复)
各种输入法的词典
例如:https://pinyin.sogou.com/dict/cate/index/97?rf=dictindex
例如:https://shurufa.baidu.com/dict_list?cid=211
手动收集,根据目前的需求,我们可以手动收集如下词典
传智
,传智播客
,黑马程序员
python
,人工智能+python
,c++
等输入法的词典都是特殊格式,需要使用特殊的工具才能够把它转化为文本格式
工具名称:深蓝词库转换.exe
下载地址:https://github.com/studyzy/imewlconverter
下载使用不同平台的多个词典之后,把所有的txt文件合并到一起供之后使用
对句子进行分词之后,句子中不重要的词
常用停用词下载地址:https://github.com/goto456/stopwords
对于停用词的具体内容,不同场景下可能需要保留和去除的词语不一样
比如:词语哪个
,很多场景可以删除,但是在判断语义的时候则不行
问答对有两部分,一部分是咨询老师整理的问答对,一部分是excel中的问答对,
最终我们需要把问答对分别整理到两个txt文档中,如下图(左边是问题,右边是答案):
Excel中的问答对如下图:
Excel中的问答对直接使用pandas就能够处理
python_qa_path = "./data/Python短问答-11月汇总.xlsx"
def load_duanwenda():
import pandas as pd
ret = pd.read_excel(python_qa_path)
column_list = ret.columns
assert '问题' in column_list and "答案" in column_list,"excel 中必须包含问题和答案"
for q,a in zip(ret["问题"],ret["答案"]):
q = re.sub("\s+"," ",q)
q = q.strip()
print(q,a)
后续在判断问题相似度的时候,需要有语料用来进行模型的训练,输入两个句子,输出相似度,这个语料不好获取,所以决定从百度知道入手,采集百度知道上面的相似问题,如下图所示:
上面采集的数据会存在部分噪声,部分问题搜索到的结果语义上并不是太相似
根据前面的问答对的内容,把问题大致分为了若干类型,对不同类型的问题设计模板,然后构造问题,问题模块如下:
templete = [ #概念 ["{kc}","什么是{kc}","{kc}是什么","给我介绍一下{kc}","{kc}可以干什么","能简单说下什么是{kc}吗","我想了解{kc}"], #课程优势 ["{kc}课程有什么特点","{jgmc}的{kc}课程有什么特点","{jgmc}的{kc}课程有什么优势","为什么我要来{jgmc}学习{kc}","{jgmc}的{kc}课程有什么优势","为什么要到{jgmc}学习{kc}","{jgmc}的{kc}跟其他机构有什么区别?","为什么选择{jgmc}来学习{kc}?"], #语言优势 #["{kc}","什么是{kc}","{kc}是什么","给我介绍一下{kc}","{kc}可以干什么","能简单说下什么是{kc}吗"], #特点 ["{kc}有什么特点","{kc}有什么优势","{kc}有什么亮点","{kc}有那些亮点","{kc}有那些优势","{kc}有那些特点","{kc}的亮点是什么","{kc}的优势是什么","{kc}的特点是什么"], #发展前景 ["{kc}的发展怎么样?","{kc}的前景怎么样?","{kc}的发展前景如何?","{kc}的未来怎样","{kc}的前景好么" ], #就业 ["{kc}好就业么","{kc}就业机会多么","{kc}的岗位多吗","{kc}工作好找吗","{kc}的市场需求怎么样","{kc}的就业环境怎么样"], #就业方向 ["{kc}学完以后能具体从事哪方面工作?","{kc}的就业岗位有哪些?","{kc}课程学完应聘哪方面工作?","{kc}可以从事哪方面工作?",], #用途 ["{kc}学完可以做什么","{kc}能干什么","学{kc}能干什么","能举例说下{kc}能做什么吗?","{kc}毕业了能干什么","{kc}主要应用在什么领域"], #就业薪资 ["{kc}学完工资多少","学完{kc}能拿多少钱","{kc}的就业薪资多少","{kc}就业的平均是工资多少"], #学习难度 ["{kc}简单么","{kc}容易么","{kc}课程容易么","{kc}上手快么","{kc}课程难么"], #校区 ["在那些城市开设了{kc}","哪里可以学习{kc}","学习{kc}可以去那些城市","{kc}在哪里开班了"], #学费 ["{kc}学费","{kc}多少钱","{kc}的学费多少","{kc}是怎么收费的?","学习{kc}要花多少钱","{kc}是怎么收费的","{kc}课程的价格","{kc}课程的价格是多少"], #适合人群 ["什么人可以学{kc}","哪些人可以学{kc}","学习{kc}有什么要求","学习{kc}需要那些条件","没有基础可以学{kc}吗","学历低可以学习{kc}吗?","成绩不好可以学习{kc}吗?","什么样的人适合学习{kc}?"], #学习时间 ["{kc}需要学多久","{kc}需要多久才能就业","{kc}需要学习多长时间","{kc}的学时是多少","{kc}的课时是多少","{kc}课时","{kc}课时长度","{kc}的课程周期?","0基础学{kc}多久能才就业"], #学习内容 ["{kc}学什么","{kc}学习那些内容","我们在{kc}中学习那些内容","在{kc}中大致都学习什么内容"], #项目内容 ["{kc}的项目有哪些","{kc}有哪些项目","{kc}上课都有哪些实战","{kc}做什么项目?","{kc}项目有多少个?","{kc}课程中有项目吗?"], #学习某课程的好处 ["为什么要学习{kc}?","学习{kc}有哪些好处?","学习{kc}的理由?","为什么我要来学习{kc}"], #上课时间 ["上课时间","你们那边每天的上课时间是怎样的呢?"], #英语要求 ["学习{kc}对英语有要求么","来{jgmc}学习对英语有要求吗?"] ]
其中大括号的内容kc
表示课程,jgmc
表示机构名称
接下来,需要完成两件事
stopwords = set([i.strip() for i in open(config.stopwords_path).readlines()])
def _cut_by_word(sentence): # 对中文按照字进行处理,对英文不分为字母 sentence = re.sub("\s+"," ",sentence) sentence = sentence.strip() result = [] temp = "" for word in sentence: if word.lower() in letters: temp += word.lower() else: if temp != "": #不是字母 result.append(temp) temp = "" if word.strip() in filters: #标点符号 continue else: #是单个字 result.append(word) if temp != "": #最后的temp中包含字母 result.append(temp) return result
lib 下创建cut_sentence.py
文件,完成分词方法的构建
import logging import jieba import jieba.posseg as psg import config import re import string #关闭jieba log输出 jieba.setLogLevel(logging.INFO) #加载词典 jieba.load_userdict(config.keywords_path) #单字分割,英文部分 letters = string.ascii_lowercase #单字分割 去除的标点 filters= [",","-","."," "] #停用词 stopwords = set([i.strip() for i in open(config.stopwords_path).readlines()]) def cut(sentence,by_word=False,use_stopwords=False,with_sg=False): assert by_word!=True or with_sg!=True,"根据word切分时候无法返回词性" if by_word: return _cut_by_word(sentence) else: ret = psg.lcut(sentence) if use_stopwords: ret = [(i.word,i.flag) for i in ret if i.word not in stopwords] if not with_sg: ret = [i.word for i in ret] return ret def _cut_by_word(sentence): # 对中文按照字进行处理,对英文不分为字母 sentence = re.sub("\s+"," ",sentence) sentence = sentence.strip() result = [] temp = "" for word in sentence: if word.lower() in letters: temp += word.lower() else: if temp != "": #不是字母 result.append(temp) temp = "" if word.strip() in filters: #标点符号 continue else: #是单个字 result.append(word) if temp != "": #最后的temp中包含字母 result.append(temp) return result
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。