我在一百万个抽象数据集(20亿字)上使用word2vec。为了找到大多数相似的文档,我使用gensim.similarities.WmdSimilarity类。当试图使用wmd_similarity_index[query]检索最佳匹配时,计算将花费大部分时间构建字典。这是一块木头:

2017-08-25 09:45:39,441 : INFO : built Dictionary(127 unique tokens: ['empirical', 'model', 'estimating', 'vertical', 'concentration']...) from 2 documents (total 175 corpus positions)
2017-08-25 09:45:39,445 : INFO : adding document #0 to Dictionary(0 unique tokens: [])

这部分是什么?是否取决于查询?有没有办法一劳永逸地做这些计算?
编辑:我的代码中的培训和评分阶段:
培训并保存到磁盘:
w2v_size = 300
word2vec = gensim.models.Word2Vec(texts, size=w2v_size, window=9, min_count=5, workers=1, sg=1, hs=1, iter=20) # sg=1 means skip gram is used 
word2vec.save(utils.paths.PATH_DATA_GENSIM_WORD2VEC)
corpus_w2v_wmd_index = gensim.similarities.WmdSimilarity(texts, word2vec.wv)
corpus_w2v_wmd_index.save(utils.paths.PATH_DATA_GENSIM_CORPUS_WORD2VEC_WMD_INDEX)

加载和评分:
w2v = gensim.models.Word2Vec.load(utils.paths.PATH_DATA_GENSIM_WORD2VEC)
words = [t for t in proc_text if t in w2v.wv]
corpus_w2v_wmd_index = gensim.similarities.docsim.Similarity.load(utils.paths.PATH_DATA_GENSIM_CORPUS_WORD2VEC_WMD_INDEX)
scores_w2v = np.array(corpus_w2v_wmd_index[words])

最佳答案

“单词移动器的距离”计算相对昂贵——对于每一个成对文档比较,它会搜索语义位置的最佳“移动”,而这种移动本身取决于每个被比较文档的所有单词之间的成对简单距离。
也就是说,它比两个高维向量之间的简单余弦距离要复杂得多,而且两个文档越长,它涉及的计算就越多。
texts语料库中,在知道查询的单词之前,没有多少可以预先计算的。(每个成对计算依赖于查询的单词,以及它们到每个语料库文档单词的简单距离。)
也就是说,gensimWmdSimilarity类还没有做一些优化。
最初的大规模杀伤性武器论文描述了一种更快的计算方法,可以帮助消除不可能出现在大规模杀伤性武器最相似结果前N名的语料库文本。理论上,gensimWmdSimilarity也可以实现这种优化,并给出更快的结果,至少在使用WmdSimilarity参数初始化num_best时是这样。(如果没有它,每个查询都会返回所有大规模杀伤性武器相似性得分,因此这种优化不会有帮助。)
而且,现在WmdSimilarity类只是将KeyedVectors.wmdistance(doc1, doc2)作为原始文本调用给每个对语料库文档的查询。因此,从所有doc1单词到doc2单词的成对简单距离将每次重新计算,即使在整个语料库中有许多对重复(也就是说,如果查询中有“apple”,并且每个语料库文档中都有“orange”,那么它仍然会重复计算“apple”到“orange”的距离。)
因此,一些中间值的缓存可能有助于提高性能。例如,通过查询1000个单词,在所有语料库文档中使用100000个单词,可以预先计算一次((1000 * 100,000) / 2)5000万个成对单词的距离,使用200MB,然后由所有后续的大规模杀伤性武器计算共享。要添加这种优化,需要WmdSimilarity.get_similarities()KeyedVectors.wmdistance()的协同重构。
最后,word2vec/doc2vec应用程序不一定需要停止删除或词干,也不一定从中受益。但是,由于大规模杀伤性武器的计算费用随着文档和词汇表的大小而增长,任何缩小有效文档大小的方法都有助于提高性能。因此,在大型文档集上使用wmd时,丢弃低值单词或合并类似单词的各种方法可能值得考虑。

08-25 03:22