我在一百万个摘要数据集(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])
答案 0 :(得分:8)
“Word Mover的距离”计算相对昂贵 - 对于每个成对文档比较,它搜索语义位置的最佳“移位”,并且移位本身取决于每个比较的所有单词之间的成对简单距离文献。
也就是说,它涉及比两个高维向量之间的简单余弦距离更多的计算,并且它涉及更多的计算,两个文档的时间越长。
从texts
语料库中可以预先计算的数据不多,直到查询的单词已知。 (每个成对计算取决于查询的单词,以及它们与每个语料库文档的单词的简单距离。)
也就是说,gensim WmdSimilarity
类尚未进行一些优化。
最初的大规模杀伤性武器论文描述了一种更快的计算,可以帮助消除不可能在前N个最类似WMD的结果中的语料库文本。从理论上讲,gensim WmdSimilarity
也可以实现此优化,并提供更快的结果,至少在使用WmdSimilarity
参数初始化num_best
时。 (没有它,每个查询都会返回所有WMD相似性得分,因此这种优化不会有帮助。)
此外,目前WmdSimilarity
类仅为每个查询到语料库文档对调用KeyedVectors.wmdistance(doc1, doc2)
作为原始文本。因此,每次重新计算从所有doc1
个词到doc2
个词的成对简单距离,即使许多对在语料库中重复。 (也就是说,如果'apple'在查询中并且'orange'在每个语料库文档中,它仍将重复计算'apple'-to'orange'距离。)
因此,一些临时值的缓存可能有助于提高性能。例如,对于所有语料库文档中的1000个单词的查询和100,000个单词的词汇表,((1000 * 100,000) / 2)
5000万个成对单词距离可以使用200MB预先计算一次,然后由所有后续WMD计算共享。要添加此优化,需要合作重构WmdSimilarity.get_similarities()
和KeyedVectors.wmdistance()
。
最后,Word2Vec / Doc2Vec应用程序不一定需要停止词或删除词或从中获益。但是,由于WMD计算的费用随着文档和词汇量的增加而增加,任何缩小有效文档大小的内容都可以帮助提高性能。因此,在大型文档集上使用WMD时,可能需要考虑各种丢弃低价值单词或合并相似单词的方法。