昨天在情感处理的学习中了解到了关于word2vec的用法,今天我们继续康康doc2vec究竟在情感分类的过程中是如何使用的。

doc2vec,也就是常说的文档向量,根据网上查阅到的零碎的资料,大概可以了解到,文档向量其实是词向量的拓宽层面上的应用,是词向量的基础上进行延伸的一种应用方式。文档向量能够识别的是一串不定长分开了之后的句子之间的相似程度,或者说一个经过分词了之后的句子究竟是归属到那一个类别上的

与传统的朴素贝叶斯文本分类的效果不同的是,他能够给出对应分类的所属类型的置信度,因为doc2vec的模型在训练的时候依然是应用到了神经网络的模型,这个模型在运算的过程中能够得到其置信度。因此在对应与之相关的句子或者句子所属的类别的判断、推荐层面有着比传统朴素贝叶斯的分类更加明显的效果(能够做相似性的句子、文章推荐)。

再者,因为tf-idf在判断上仅仅考虑到词在文章或句子中的出现频率并没有考虑到词与词之间的顺序(例如昨天所说的高兴和不高兴,两者就多了一个不,但是二者的含义(情感)是完全不同的),而文档向量中的分词之间考虑到顺序,在处理过程中能正堆不定长的分词后的列表进行对应模型的构建,相对来说,文档向量在对情感分类的任务上拥有比朴素贝叶斯的分类更加优秀的效果。

多说无益,用一个实际的例子来看看文档向量在情感分类上的效果吧。

昨天的学习进度中就提及到原本只有两个分类的消极和积极的文本中,消极和积极的带有情感的文本经过构建的tf-idf+朴素贝叶斯分类准确率不足50%!!而随机数命中消极和积极的概率都有50%,这从某种层面上说,这个tf-idf+朴素贝叶斯基本不具有对情感分类的能力。

接下来看看文档向量对于同样的数据进行训练了之后,情感分类的能力如何。

先提供我在训练的时候所用的两个情感分类的训练集:积极消极情感训练集

在使用doc2vec之前,先简单了解python中doc2vec的基本用法。

doc2vec在gensim中就已经给我们提供了模块,使我们在使用doc2vec的时候变得特别简单

安装完gensim后,导入对应模块即可

from gensim.models import Doc2Vec
import gensim.models.doc2vec as docvec

训练模型及其模型参数说明,其中x_train是指代入模型中训练的数据

# 模型参数说明:
# 1.dm=1 PV-DM  dm=0 PV-DBOW。
# 2.size 所得向量的维度。
# 3.window 上下文词语离当前词语的最大距离。
# 4.alpha 初始学习率,在训练中会下降到min_alpha。
# 5.min_count 词频小于min_count的词会被忽略。
# 6.max_vocab_size 最大词汇表size,每一百万词会需要1GB的内存,默认没有限制。
# 7.sample 下采样比例。
# 8.iter 在整个语料上的迭代次数(epochs),推荐10到20。
# 9.hs=1 hierarchical softmax ,hs=0(default) negative sampling。
# 10.dm_mean=0(default) 上下文向量取综合,dm_mean=1 上下文向量取均值。
# 11.dbow_words:1训练词向量,0只训练doc向量。

model=Doc2Vec(x_train,dm=1, min_count=1, window=3, vector_size=size, sample=1e-3, negative=5,workers=4)
model.train(x_train, total_examples=model.corpus_count, epochs=200)

那么如何构建一个代入模型训练的数据x_train呢?

首先,我们需要一个分词好的句子的列表,还有一个这个列表所对应的标签。

然后我们利用这些句子和标签构成的x_train,代入上述的训练过程中就可以构建出对应的文档向量模型model了。

其中 

split_sentences是指用jieba分词好的句子的列表 格式有点像[['不','高兴'],['很','开心']]
labels则是指的对应的分词前的句子所对应的句子类型,如对应上述的['消极','积极']
TaggedDocument=docvec.TaggedDocument
x_train=[]
for i,one in enumerate(split_sentences):
    document=TaggedDocument(one,[labels[i]])
    x_train.append(document)

经过了这个步骤后,就得到了对应的训练数据 x_train了

接着了解一下其他函数,保存好训练的模型

model.save(path)

加载训练模型

model = Doc2Vec.load(path)

根据text来推理分词向量

vector = model.infer_vector(fc.cutstring(text,stopwordfile=None,cut_all=True),alpha=0.025,steps=500)

最后就是最常用的一个函数,也就是根据模型来推断与句子最相似的类型

其中sims包含了由对应的句子类型(也就是上面的labels对应的标签)和置信度所构成的列表。

其中vector就是根据上面的text来推理的分词向量
topn就是取多少个依照从大到小的置信度排行的类别
sims = model.docvecs.most_similar([vector], topn=topn)

根据上面对于doc2vec的一些简单的了解了之后,构建出上面提供的积极和消极情感文本训练集的一个文档向量的模型后

在淘宝上,搜索随便一个产品对应的好评和差评,看看其效果如何。

 

第一次测试:

衣服收到了,大小合适穿着很舒服的,面料舒服柔软,物美价廉值得购买。

期待的结果应该是:pos    (积极)

我们来看看最终的结果是什么:

pos 0.7829157114028931
neg 0.5710924863815308

可以看到此次识别结果是pos 符合期待结果

 

第二次测试:

衣服质量不错!自己喜欢的款式! 适合胖胖的我! 物美廉价!会推荐给身边的姐妹的 值得关注的店铺奥大爱 顾虑衣服刚刚收到就穿在身上有点褶皱

期待的结果应该是:pos    (积极)

最终的结果:

pos 0.7631765007972717
neg 0.5995559692382812

可以看到此次识别结果是pos 符合期待结果

 

第三次测试:

真的货不对版! 袖长不够 衣长不够 就连领子的开口大小都不对… 好评都是买的吧? 后悔死了 简直气死了… 要不是我收了没看就出国了 早就退了!!骗子啊!!

期待的结果应该是:neg    (消极)

最终的结果:

neg 0.6845046281814575
pos 0.29343491792678833

可以看到此次识别结果是neg 符合期待结果

 

第四次测试

太薄了,一件毛衣还不如一个秋衣重,质量太差了

期待的结果应该是:neg    (消极)

最终的结果:

neg 0.7289400696754456
pos 0.583489179611206

可以看到此次识别结果是neg 符合期待结果

 

第五次测试

之前买的蓝色,今天收到鸵色的,两件衣服一个码,长短差一公分多,有点离谱

期待的结果应该是:neg    (消极)

最终的结果:

neg 0.78685462474823
pos 0.5400851368904114

可以看到此次识别结果是neg 符合期待结果

 

第六次测试

这个价格能买到这质量值了,很柔软贴肤,舒适,颜色也正,准备再买件!

期待的结果应该是:pos    (积极)

最终的结果:

pos 0.7345569133758545
neg 0.5632465481758118

可以看到此次识别结果是pos 符合期待结果

 

在淘宝上随机选6个评论后,文本分类均符合对应的情感分类

结论:文档向量在情感分类上具有强大的作用,6次随机取样情感分类结果均正确

 

情感分类篇 完...