【问题标题】:Optimizing Gensim word mover's distance function for speed (wmdistance)优化 Gensim word mover 的速度距离函数(wmdistance)
【发布时间】:2017-08-30 12:38:55
【问题描述】:

我正在使用 gensim wmdistance 来计算参考句子和 1000 个其他句子之间的相似度。

    model = gensim.models.KeyedVectors.load_word2vec_format(
     'GoogleNews-vectors-negative300.bin', binary=True)
    model.init_sims(replace=True)  

    reference_sentence = "it is a reference sentence"
    other_sentences = [1000 sentences]
    index = 0
    for sentence in other_sentences: 
      distance [index] = model.wmdistance(refrence_sentence, other_sentences)
      index = index + 1

根据gensimsource codemodel.wmdistance返回如下:

emd(d1, d2, distance_matrix)

在哪里

d1 =  # Compute nBOW representation of reference_setence.
d2 =  # Compute nBOW representation of other_sentence (one by one).
distance_matrix = see the source code as its a bit too much to paste it here.

对于我的用例,这段代码在两个方面效率低下。

1)对于参考句,它是重复计算距离函数emd(d1, d2, distance_matrix)的d1(1000次)。

2) 这个距离函数被多个用户从不同的点调用,它们对相同的 other_sentences 重复model.wmdistance(doc1, doc2) 的整个过程,并且计算量很大。对于这 1000 次比较,大约需要 7-8 秒。

因此,我想隔离这两个任务。距离的最终计算:emd(d1, d2, distance_matrix) 并准备这些输入:d1、d2 和距离矩阵。由于距离矩阵取决于两者,因此至少其输入准备应与最终矩阵计算隔离。

我最初的计划是创建三个自定义函数:

d1 = prepared1(reference_sentence)
d2 = prepared2(other_sentence)
distance_matrix inputs = prepare inputs 

是否可以使用 gensim 函数来执行此操作,或者我应该使用自己的自定义版本?有什么想法和解决方案可以更好地解决这个问题吗?

【问题讨论】:

  • 您是否编写了自定义解决方案?

标签: python nlp nltk gensim word2vec


【解决方案1】:

您可以正确地观察到此代码可以重构和优化以避免重复操作,尤其是在针对大量文档评估一个参考/查询文档的常见情况下。 (任何此类改进也将是对 gensim 的可喜贡献。)

在计算之外仅准备单个文档可能不会节省大量费用;在每种情况下,都必须计算两个文档之间的所有单词到单词的距离。预先计算一个更大的distance_matrix(在相关词汇表和系统内存允许的范围内)可能是有意义的,其中包括许多成对 WMD 计算所需的所有单词。

(尽管预先计算所有单词到单词的距离可能很诱人,像GoogleNews 向量集这样包含 300 万个单词的词汇表,以及仅仅 4 字节的浮点距离,存储它们都需要至少 18TB。因此,在可管理的文档批次上计算相关单词的距离可能更有意义。)

一种可能的开始方法是创建wmdistance() 的变体,它明确地适用于一个文档而不是一组文档,因此可以结合创建直方图/距离矩阵一次进行许多比较。

对于不需要 所有 WMD 值的常见情况,只需要前 N 个最接近的结果,原始 WMD 论文中描述了一种优化,其中另一个更快的计算(称为“RWMD” ) 可用于推断文档不可能出现在前 N 个结果中的情况,从而完全跳过这些文档的完整 WMD 计算。

【讨论】:

  • 那我来探讨一下RWMD的选项。那么WmdSimilarity(wmd_corpus, model, num_best=10) 和RWMD不一样吗?
  • 您必须查看论文以了解其对 RWMD 的定义。虽然已经开始了一些工作,但我认为 gensim 代码还没有执行该优化。为了找到最接近的 10 个项目,它会计算 所有 个项目的 WMD,没有捷径/优化,然后排序以仅返回 10 个最小距离。
  • 啊,好吧。我将修改它,以便在单独的函数中为单个文档计算单词向量和 nbow 向量。当我将数千个项目与一个参考进行比较时,它应该可以节省我很多时间。如果您希望它作为 gensim 中的 wmdistance 变体,我可以将问题作为功能请求开始。
猜你喜欢
  • 2017-09-12
  • 2020-04-22
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
  • 2019-02-13
  • 2018-02-22
  • 2019-12-25
  • 2011-02-19
相关资源
最近更新 更多