Python Gensim word2vec WMD相似性词典

Python Gensim word2vec WMD相似性词典,python,nlp,word,gensim,word2vec,Python,Nlp,Word,Gensim,Word2vec,我在100万个摘要数据集(20亿字)上使用word2vec。为了找到最相似的文档,我使用了gensim.complications.WmdSimilarity类。当尝试使用wmd\u similarity\u index[query]检索最佳匹配时,计算会花费大部分时间构建字典。这是一根圆木: 2017-08-25 09:45:39,441 : INFO : built Dictionary(127 unique tokens: ['empirical', 'model', 'estimatin

我在100万个摘要数据集(20亿字)上使用word2vec。为了找到最相似的文档,我使用了
gensim.complications.WmdSimilarity
类。当尝试使用
wmd\u similarity\u 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])  
“单词移动器距离”计算相对昂贵——对于每个成对文档比较,它会搜索语义位置的最佳“移动”,而移动本身取决于每个被比较文档中所有单词之间的成对简单距离

也就是说,与两个高维向量之间的简单余弦距离相比,它涉及的计算量要多得多,而且两个文档越长,计算量就越大

文本
语料库中,在查询的单词被知道之前,没有多少可以预先计算的内容。(每个成对计算取决于查询的单词,以及它们到每个语料库文档单词的简单距离。)

也就是说,gensim
wmdsimility
类还没有进行一些优化

最初的WMD论文描述了一种更快的计算方法,这有助于消除语料库文本中不可能出现在最类似WMD结果的前N名中。理论上,gensim
wmdsimility
也可以实现此优化,并给出更快的结果,至少在使用
num_best
参数初始化
wmdsimility
时是如此。(如果没有它,每个查询都会返回所有WMD相似性分数,因此此优化没有帮助。)

另外,目前,
WmdSimilarity
类只调用
KeyedVectors.wmdistance(doc1,doc2)
作为原始文本,用于对语料库文档对的每个查询。因此,每次都将重新计算从所有
doc1
单词到
doc2
单词的成对简单距离,即使许多对在语料库中重复。(也就是说,如果查询中有“apple”,而每个语料库文档中都有“orange”,那么它仍然会重复计算“apple”到“orange”的距离。)

因此,一些临时值的缓存可能有助于提高性能。例如,对于1000个单词的查询,以及所有语料库文档中100000个单词的词汇,可以使用200MB预先计算一次
((1000*100000)/2)
5000万个成对单词的距离,然后由所有后续WMD计算共享。要添加此优化,需要对
WmdSimilarity.get_complications()
keyedvivers.wmdistance()
进行协同重构


最后,Word2Vec/Doc2Vec应用程序不一定需要停止字删除或词干生成,也不会从中获得太多好处。但是,由于大规模杀伤性武器计算的费用随着文档和词汇表的大小而增加,因此任何缩小有效文档大小的措施都可能有助于提高性能。因此,在大型文档集上使用WMD时,丢弃低值单词或合并类似单词的各种方法可能值得考虑

你能添加代码的相关部分吗?@Cedias完成了,训练和得分阶段,回答得好。然后记录的“构建词典”部分就是WMD对正在评分的doc1和doc2的单词进行计数?为了获得良好的评分速度,我首先在整个数据库上使用向量平均余弦距离,然后选择前N个类似文档并对其执行N_余弦,然后减少到前M,最后执行WMD评分。这肯定是危险的,但实际上我得到了一些好的结果……我不确定你的日志行“Build Dictionary”来自哪里——我没有看到匹配的日志记录
相似性/docsim.py
(其中定义了
wmdsimiliariality
)或
模型/keyedvectors.py
(其中定义了
wmdistance()
)源代码。(同时,该代码的输出中没有显示其他信息级别的日志。)您确定这些日志行完全来自显示的代码吗?(如果您需要知道,您可以添加更多的输出上下文,或者更改日志格式化程序以包含源类/方法吗?)使用更粗糙、更快的第一次传递(如所有词向量平均值上的余弦距离),然后仅对该传递的顶部项执行WMD,这与论文的优化类似——很高兴它对您起到了很好的作用。(我认为他们更严格地表明,他们的特定计算为大规模杀伤性武器的距离设定了严格的界限。这样,他们就可以在对这些文件进行大规模杀伤性武器之前,确定某些文件不能排在前N名。)@debzsud你介意分享你的完整代码吗?我使用的是WMDSimilarity gensim,性能非常糟糕。提前谢谢!