背景
工作中要做一个某项业务的备注描述信息的文本分类,试图通过这个文本找到对应的分类。 分类大概有10来种,由于没人给打标注,我只好自己写了一个正则来搞定。 然后觉得,可以尝试用短文本分类再搞一遍,看看,是否可以提高泛化能力。
尝试几种方法:
第一种方法 第三方词向量+朴素贝叶斯
用别人的词向量,https://github.com/Embedding/Chinese-Word-Vectors。
我的都是短文本,处理的时候也没啥特殊的,首先每句话,都分词,去掉乱七八糟的东西,然后得到每个词的词向量,wordVector = w2v[word]
, 每个样本都是一个长度不等的词向量数组。长度不等,那怎么办训练啊?
截断和补pad。
截断是找一个平均长度,用
cat result.csv|awk '{print NF}'|sort|uniq -c|sort
然后发现,最长的29个字,数量最多的3个字10333个,最少的1个29个字的,字数比较少的,一般都在1000+,长句的都是几百,大致这样一个分布。我拍脑袋给了一个15,作为长度的超参。
加载词向量的时候,出现了这个提示,我估计是词向量里面有重复的,不管了。。。
2018-12-29 16:58:07,014 : WARNING : duplicate word '..................................................................................................' in word2vec/sgns.financial.word, ignoring all but first
2018-12-29 16:59:22,847 : INFO : duplicate words detected, shrinking matrix size from 467370 to 467322
2018-12-29 16:59:22,847 : INFO : loaded (467322, 300) matrix from word2vec/sgns.financial.word
然后试了一下,朴素贝叶斯,得用高斯朴素贝叶斯,为何?
当特征是连续变量的时候,运用多项式模型就会导致很多$P\(xi\|yk\)=0$(不做平滑的情况下),此时即使做平滑,所得到的条件概率也难以描述真实情况。所以处理连续的特征变量,应该采用高斯模型。
原因就是没法算某个属性的概率值,但是用了高斯,就可以先把这列的值做一个高斯模拟,比如身高这列,变成一个高斯分布,就可以算任一点的概率值了。
然后,我尝试了5.7万的result.csv,正确率下来了,72%。诡异哈。
加工语料:耗时52.473868秒
2018-12-29 18:28:45,114 : INFO : 高斯朴素贝叶斯分类器(正确率): 0.720000%
2018-12-29 18:28:45,122 : INFO : 高斯朴素贝叶斯模型已经保存!
训练:耗时22.911388秒
2018-12-29 18:28:45,224 : ERROR : 一共有22388个词没有在word2vec表中找到!
对了,词表长度是467322,46万个,2.2万,大概于是5%不到的词找不到,那怎么办?忽略呗。