昨天学习了简单的文本处理,之后在课后的练习中实现了包括了对tf-idf的处理和基于朴素贝叶斯简单的文本分类
基于tf-idf的数据集在出现多个关键词的时候一般能够相对准确对文本进行分类,但是对于相对具有深层含义的内容,例如情感的积极,情感的消息这方面的分类来说,就显得有些乏力的。根据昨天构建的文本分类模型,在训练完消极和积极的评论各1w个之后,对于在淘宝某个商品新获取的评论随机取几个好评和差评进行分类,发现构建的朴素贝叶斯分类器对这些文本的积极和消极不敏感。基本上准确率甚至不足50%。这也就是说,tf-idf+朴素贝叶斯文本分类器的模型基本上在情感的分类上不具有太大的效果。
不具有太大的效果的原因大致为情感的文本分类的过程往往需要考虑到词与词之间的顺序,例如高兴和不高兴这两个词,虽然都出现了高兴,但两者确是表达了完全不一样的意思,而tf-idf并没有考虑到这一点。
今天搜索了网上的一些零碎的知识,了解到了文档向量doc2vec可能对文本的情感处理有较好作用。
在学习文档向量之前,想看看word2vec。
个人的理解的doc和word之前的区别是,doc2vec能够匹配出与其最相似的句子(包含了tf-idf处理的时候未考虑到的词之间的顺序,doc2vec的网络具有适应不定长的文本的能力),而word2vec则能匹配到与之最相近的词。
word2vec是一个可以将词转化为词向量的一个模型。这些模型为浅而双层的神经网络,用来训练以重新建构语言学之词文本。网络以词表现,并且需猜测相邻位置的输入词,在word2vec中词袋模型假设下,词的顺序是不重要的。
word2vec将词转化为独热编码,神经网络模型中经常用到的one-hot编码(简单理解为一个列表中的所有元素,除了某一一个位置为1,其余位置均为0,用来指代某一元素),为何要转化为独热编码处理(将n个特征分割为1个特征的n个元素,能够让模型具有最优的效果),之前这边写的这篇博客有提及到并探索对应的原理:卷积网络识别含义多重性验证
简单地了解了word2vec了之后,可以康康他在python中使用的方法。
python中的gensim中已经为我们提供了word2vec这个模块
因此要使用word2vec的话,安装完gensim后导入word2vec
from gensim.models import Word2Vec
word2vec为我们提供特别简单的训练词向量的方法,只需要输入一堆词,就可以构建出一个词向量的模型。
参数list可以配合jieba对中文进行分词使用。
model = Word2Vec(list)
如何获得对应相似词语的相似列表 返回元组 {词:相似度}
参数word为需要获取对应的相似度的词
model.wv.similar_by_word(word)
那如果要判断两个词语之间的相似度呢 返回相似度
word1和word2分别是两个需要判断相似度的词
model.wv.similarity(word1, word2)
我们现在已经知道如何判别词语之间的相似度了
那如果现在我们不知道模型中有什么词语,想要获取模型中的全部词语呢
执行下面的函数会返回模型的词语列表
model.wv.index2word
获得词向量矩阵(独热编码),即词向量的模型神经网络代入的参数如何获取?返回 词向量矩阵
model.wv.vectors
词向量相似度列表
model.wv.similar_by_vector(word)
预测新词出现列表及其频率
model.predict_output_word([word])
计算新词出现的总概率
total = sum(i[1] for i in model.predict_output_word([word]))