业务背景:
随着技术业务的产品化,用户对技术产品的使用过程中存在很多疑问,我们组织应运而生,主要负责技术产品日常过程中的答疑;在答疑过程中会遇到很多对产品有抱怨的用户,这些用户比较大的特征是在会话语料、咨询频次、满意度方面;其他数据层还好,在语料层机器比较难识别,在我所处的案例过程中,我一开始用的是开源的NLP包,snownlp,但是snownlp的切词不够强大,而我们业务过程中又会存在很多的专有名词,仅凭市场上的词典无法很好的做切词处理,需要自己建立词典,所以我这边整合了jieba的切词,和snownlp所用到的贝叶斯分类器对文本进行分类。
数据链路:
文本切词 -> 去stop word -> 用bag of word模型映射成为词向量 -> 基于朴素贝叶斯的句子分类计算
原理似乎很简单。。。但是在此之前我干了啥。。。因为我是冷场王,发起语料收集之后没人鸟我。。。
1.不断地从语料里找专有名词
2.不断地在语料里找各个分类的句子,直到形成每个库都有上千行的语料。。。
成果:

技术点:
· 切词 ---- 一个反复而又繁琐的过程
这个基本是调用jieba的接口就ok,jieba库支持自己定制词语,然后程序启动的时候load进来就好。
词典有三列,自己定义的名词,权重,词性
然后调用jieba的cut方法即可
mvn 100 n
git 100 n
· 训练贝叶斯分类器
这个训练过程干了什么事情:1.生成词语图谱向量 2.把切好的词映射成词向量 3.生成分类向量和各个大类的概率 p0V, p1V, pAb(这三个东西组成了分类器的核心)
解释一下这三个变量背后所代表的意义:
p1V、p0V(词典里的每个词属于某个类的概率向量)
pAb(词典里某个类出现的概率)
· 朴素贝叶斯分类预测
有了各个分类向量和分类概率,在加上词典,就可以进行分类预测了嘿嘿
基于贝叶斯条件概率,加上朴素假设(每个词都是独立变量,这个是简化计算)

def classifyNB(self, vec2Classify):
if sum(vec2Classify) < 2: # 这里我基于业务做了过滤,因为用户如果只说了一句话,一般不足以构成abusive,当然也会出现用户爆粗的时候只说了一句话,这样的话他前后也会提供了一些abusive的词,所以也不影响预测,这个只是经验处理
return 0
# 这两行就是基于条件概率的预测,取log是对概率预测做了平滑处理,以防概率为0和概率太小导致的算法预测失效的情况
p1 = sum(vec2Classify * self.p1Vec) + log(self.pClass1)
p0 = sum(vec2Classify * self.p0Vec) + log(1.0 - self.pClass1)
if p1 > p0:
return 1
else:
return 0
网友评论