chatterbot问答框架的简单分析

1. chatterbot问答框架的实现原理?

chatterbot的是基于sqlite数据库的,基于字符串相似度的匹配的问答框架。

数据存储方面:sqlite数据库中存放了我们预先设置的很多的问题和答案。对于一个问题用户的提问方式可能是多种多样的情况,我们可以对这个问题在数据库中存放多种变种形式。比如:问题“买车险的流程是怎样的?”,对于这种问题,用户的提问方式可能出现下面几种情况:a. 怎么买车险?b. app上怎么买车险;c. 买车险的操作流程怎么弄?等。其实这些问题是等价的,对于这种等价问题,可以给它设置一个统一个答案。一般设置3-4个就可以了。

字符串匹配方面:chatterbot中默认的字符串相似度的算法是编辑距离算法,它描绘的是将一个字符串传化成另外一个字符串它所需要的最小的编辑次数是多少,非常自然如果两个字符串越相似,完成转化需要的编辑次数就越小。

相似度计算公式:1-(需要操作数 除 maxLen)maxLen表示转化前和转化后的字符串中的最长的字符串的长度。

所以整个问答流程其实是:根据用户输入的问题a找到数据库中存储的相识度最高的问题A, 那么问题A的答案就是返回给用户的答案。

2. 利用chatterbot训练自己的语料库是什么原理?

在利用chatterbot添加自己的语料库的时候,会产生一个db.sqlite文件,这个文件实际上就存放了你添加的问题和答案。训练的过程其实就是数据入库的过程。我们可以使用SQLiteStudio工具来查看新生成的db.sqlite文件,这个文件中会存放我们新添加的语料。

sqlite安装,SQLiteStudio下载,大家可以在网上查找相关的教程。

3. 字符串的相识度计算除了默认的编辑距离算法之外,还有什么其他的算法吗?

synset_distance 计算英文文本间的相似度 利用nltk包中的wordnet实现的
sentiment_comparison 计算文本间的情感相似度  利用nltk包中的vader实现
jaccard_similarity jaccard相识度 计算过程较简单 但是没有考虑词语词之间的顺序 准确率没有编辑距离算法高 
实际运算速度也比编辑距离要慢

 

编辑距离算法,jaccard算法参考博文:

https://www.cnblogs.com/xiaoyulong/p/8846745.html

https://blog.csdn.net/u012836354/article/details/79103099

chatbot框架中是如何实现通过编辑距离求相似度的?

假设有字符串A和字符串B,找到他们的相同的片段,得到片段集合J,将所有的片段的长度相加,就是总的相同的长度L。

相似度 = L*2/(A的长度+B的长度)。

你可能会奇怪编辑距离是哪个值。其实chatbot他转换了下思维,它没有去找编辑距离,而是去找不需要变动的片段长度。

因为就算你找到了编辑距离,再求相似度是,还是要用(字符串平均长度或最长字符串长度-编辑距离)/字符串平均长度或最长字符串长度。而字符串平均长度或最长字符串长度-编辑距离就等于集合J中将所有的片段的长度相加

注意:已经用来比较过的字符是不能再用来比较的。

情感分析

情感分析研究的是什么?研究的是情感的倾向和倾向的程度?可以使用什么算法来研究呢?

情感倾向方向: 用户表达自身观点时所持有的态度,正面情感,负面情感,中性情感。例:赞美,表扬:正面情感。龌龊,丑陋:负面情感。

情感倾向程度:表达情感的强烈程度,往往可以通过感情词,语气词来体现。例,‘敬爱‘’比‘亲爱‘更强烈。‘厌恶’比‘讨厌’更强烈

如何使用SnowNLP进行情感倾向性分析?snowNLP中情感分析的实现原理?

判断词或者句子的情感倾向:

from snownlp import SnowNLP
from snownlp import sentiment
print(SnowNLP("恨").sentiments) #输出一个情感倾向性的评分,越趋向1越正面,越趋向0越负面
训练自己的情感倾向模型
from snownlp import sentiment
sentiment.train('neg.txt', 'pos.txt')
sentiment.save('sentiment.marshal')

原理:

1. 使用贝叶斯的模型进行模型的建立和预测

2. 对输入的训练数据进行分词处理,再进行停词处理(去掉标点符号,代词,数次,专业名词);(概率分析的单元是对词,不是对句子)

3. 形成一个正面词字字典和一个负面词字典(key:词名,value:频率)

4. 训练的过程就是,不断分词,去停词,统计词频率的过程

5.利用朴素贝叶斯的思想进行预测的过程:

通过对词库的统计可以知道,正面词库的先验概率P(pos), 负面词库的先验概率P(neg)。假设当前要判断倾向的句子是x,它由词符[a,b,c]组成,那么P(pos|x) = P(pos,x)/P(x) = P(x|pos)*P(pos)/P(x)=P(a|pos)*P(b|pos)*P(c|pos)*P(pos)/P(a)*P(b)*P(c)

数据来源:用户对产品或者服务的评论和评分(1-3,:负面;4-5:正面)

如何评价该模型:通过准确率,召回率,精确率来判断

贝叶斯公式可以了解一下

还要一种方法可以用来判断语句的情感倾向:将词转化为词向量,利用神经网络来分类。

可能很多人都知道,词向量的方式可以衡量词与词之间语义的相识度?为什么呢?

举个例子,花是植物;树是植物。花和树是输入,输出都是“植物”。输出的类别相同,那么他们的输入一定是相近的。所以花和树转换成词向量之后,他们的空间距离是相近的。

如何计算情感倾向的程度大小呢?

使用行业标准的情感词典——玻森情感词典。

使用方式:将玻森情感词典,加载到内存当中,形成一个字典结构A。对需要进行情感判断的句子进行分词,对分词后的结果,在A索引它的情感评分。所有词的情感评分累加就是最后的那句话的情感评分。但是上面的说法忽略了两个重要的问题:1. 没有考虑否定词对词语情感产生的影响,2.没有考虑程度副词对对情感的加权。如果将以上两点考虑进去,那么情感计算公式就应该是:情感值*(-1,如果有否定词修饰)*程度副词的权重w。需要的材料:否定词集,程度副词词集,情感词集,停词词集(可要可不要)

还有什么其他可以使用的情感词典吗?清华大学的,台湾大学的

可以考虑使用神经网络的方式来解决情感倾向的方向判断,优点在哪里呢?

鲁棒性好,对于没有训练过的词汇依然可以判断情感的倾向性。理由:经过词向量化后,语义相识的词,距离上是相近的。

word2vec的必知点:

1. 为什么语义相近的词,会相近。比如,花是植物,树是植物。花和树都用来预测植物,所以反推花和树的词向量表示应该是相近的。

2. 如何理解nce损失: 通过负例采样的方式,将多分类问题装化成二分类问题。输入的input如果在选取的负例中,那么标签就是0,如果不在负例中标签就是1。最后通过logistic函数来求损失。logistic的计算公式如下:

 

存在问题

1. 效率存在很大问题。如果想做到及时响应的话(1秒左右响应),数据库智能存放1000个左右的问题。当问题在2000左右的时候可能就需要3-4秒的时间了。

经过分析:大部分的时间消耗在数据查询方面,真正计算相识度方面消耗的时间不多。

解决方案:用其他的数据库如mysql来代替原始的sqlite

思考:如果问题真的很多,导致计算相识度所花的时间变多,这个应该怎么解决。

答:1.通过分主题,分表的方式缩小数据范围;2. 利用多线程并发处理,通过threadpoolExcutor的方式来开启。

提交任务:pool.submit; 获取任务返回值:future.result(), 这个方法有阻塞主线程的作用 

2. 同义词问题。相同的意思不同的词,没有办法找到合适的答案。

3. 如何基于情感的考虑来选择合适的回答?如何构建自己的情感词库

4.如何利用局部敏感哈希来加快字符串匹配的速度?

 

 

 

 

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值