自然语言处理真实项目实战(20170822) (3)

这里的相似度检索是指,给定一个正面的句子,然后检索和其相似度最大的句子。
当然,这里也可以指定一个负面的句子,也就是和这个句子越不相似越好。
这里有一个限制,如果正面的句子和负面的句子,进行分词之后,没有一个词语是被训练过的(被训练过的词语,是指语料库里面存在的词语),则无法进行操作。

具体在求相似度的操作之前,检索用向量需要进行一下处理。
假设positive变量是一个数组,数组里面存放着正面的Token。
corpus[token]表示token的矢量,这里对矢量进行按列求和,结果是一个和token维度一样的矢量。换句话说,就是将多个矢量合并为单个矢量。(Token矢量的求和矢量)
然后将上面那个“Token矢量的求和矢量”,和新的positive的推测矢量进行相加,获得一个新的"求相似度用矢量"

(Negative和Positive类似)

p = np.array([ corpus[token] for token in positive ]).sum(axis=0) p = p + corpus.infer_vector(positive, steps=20) n = np.array([ corpus[token] for token in negative ]).sum(axis=0) n = n + corpus.infer_vector(negative, steps=20)

在语料库对象(Document Model)中有一个很有用的方法infer_vector,这个方法可以基于当前的文档模型快速,将一个文档转换(按照模型推测)成一个矢量。

infer_vector
(doc_words, alpha=0.1, min_alpha=0.0001, steps=5)
Infer a vector for given post-bulk training document.
Document should be a list of (word) tokens.

在机器学习界,有两种机器学习方式,一种是Online的,一种是Offline的。Online的方式,模型可以实时更新,新的样本会被实时进行训练,训练结果也实时反映到模型中去。Offline的方式,如果有新的样本,则需要将新老样本放在一起,重新进行训练。这里的话,模型无法进行Online的训练,所以新的样本,只是基于训练好的模型,被转换(推测 Infer,有些类似于预测Predict)为一个矢量。

相似度计算的核心方法是most_similar

most_similar
(positive=[], negative=[], topn=10, clip_start=0, clip_end=None, indexer=None)
Find the top-N most similar docvecs known from training. Positive docs contribute positively towards the similarity, negative docs negatively.
This method computes cosine similarity between a simple mean of the projection weight vectors of the given docs. Docs may be specified as vectors, integer indexes of trained docvecs, or if the documents were originally presented with string tags, by the corresponding tags.
The ‘clip_start’ and ‘clip_end’ allow limiting results to a particular contiguous range of the underlying doctag_syn0norm vectors. (This may be useful if the ordering there was chosen to be significant, such as more popular tag IDs in lower indexes.)
寻找最相似的N个文档。正面(Positive)文档向相似度贡献正面的值,负面(Negative)文档贡献负面的值。这个方法通过计算给定文章的矢量的加权平均值的余弦相似度来给出结果。可以通过矢量,被训练过的文档矢量的下标,或者原始的字符串标签来指定文档(正面或者负面文档)。
‘clip_start’ 和 ‘clip_end’则是指定了相似度检索的范围。

官方文档其实说明的不是很清楚,很多地方还是不容易理解。
topn这个参数应该没有问题,你想返回最相似的多少个,这里就指定多少即可。
对于positive和nagative的指定,首先明确一下,这里必须是一个数组,即使只有一个值,也必须是数组。
positive和nagative数组里面的值,可以是:
1.具体的文档的矢量
2.被训练过的文档的下标
3.文档的Tag字符。(本项目里面的Tag就是文档的编号)
具体到这个项目中,Positive则是上文提到的"求相似度用矢量"
‘clip_start’ 和 ‘clip_end’则是指定了相似度检索的范围,这个一般是用来限定检索范围,例如只想在1年或者3年的资料中进行检索。

情感模型建立 MiniBatchKMeans

情感分析是建立在文档的聚类基础上的。由于计算量比较巨大,项目使用的是MiniBatchKMeans。
在有效减少计算时间的同时,也能保证计算误差在可接受范围中。
项目中使用的是Leave-One-Out Cross Validation,每次将一个样本作为测试集,一共进行n次交叉验证。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwzjyd.html