【问题标题】:Gensim word2vec WMD similarity dictionaryGensim word2vec 大规模杀伤性武器相似度词典
【发布时间】:2023-03-19 03:47:01
【问题描述】:

我在 100 万个摘要数据集(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])  

【问题讨论】:

  • 您能添加代码的相关部分吗?
  • @Cedias 完成,训练和评分阶段

标签: python nlp word gensim word2vec


【解决方案1】:

“Word Mover 的距离”计算相对昂贵 - 对于每个成对文档比较,它会搜索语义位置的最佳“移动”,并且该移动本身取决于每个比较的所有单词之间的成对简单距离文档。

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

texts 语料库中可以预先计算的内容不多,直到知道查询的单词为止。 (每个成对计算取决于查询的单词,以及它们与每个语料库文档单词的简单距离。)

也就是说,gensim WmdSimilarity 类还没有做一些优化。

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

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

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

最后,Word2Vec/Doc2Vec 应用程序不一定需要或从停用词删除或词干提取中受益很多。但是因为大规模杀伤性武器计算的费用随着文档和词汇量的增加而增加,任何缩小有效文档大小的方法都可以提高性能。因此,在大型文档集上使用 WMD 时,可能值得考虑各种丢弃低价值词或合并相似词的方法。

【讨论】:

  • 谢谢,很好的答案。那么记录的“构建字典”部分只是 WMD 对 doc1 和 doc2 的单词进行计数?
  • 为了获得良好的评分速度,我首先在整个数据库上使用vectors表示余弦距离,然后选择top N相似的文档并对其进行n_cosinus,然后减少到top M,最后进行WMD评分。这绝对是危险的,但我实际上得到了一些好的结果......
  • 我不确定您的日志行“构建字典”来自哪里——我看不到匹配的日志记录 similiarities/docsim.py(其中定义了 WmdSimiliarity)或 models/keyedvectors.py(其中wmdistance() 已定义)源代码。 (同时,该代码确实在您的输出中未显示其他 INFO 级别的日志记录。)您确定这些日志行完全来自显示的代码吗? (如果您需要知道,您可以添加更多输出上下文,或者更改日志格式化程序以包含源类/方法吗?)
  • 使用更粗略、更快的第一次通过(如所有单词向量均值上的余弦距离),然后仅对该通过的顶部项目执行 WMD,类似于论文的优化——很高兴它对你很有效。 (我认为他们更严格地表明,他们的具体计算为 WMD 距离设定了坚实的界限。这样,他们可以确定某些文档在对这些文档进行 WMD 之前不能位于前 N 位。)
  • @debzsud 你介意分享你的完整代码吗?我正在使用 WMDSimilarity gensim,性能很糟糕。提前致谢!
猜你喜欢
  • 2010-11-18
  • 2010-12-30
  • 2011-02-16
  • 2010-11-10
  • 2019-07-02
  • 2010-12-04
  • 2016-09-21
  • 2015-10-10
  • 2010-12-10
相关资源
最近更新 更多