Word Mover的距离(WMD)如何使用word2vec嵌入空间?

时间:2017-09-13 15:09:19

标签: nlp nltk gensim word2vec word-embedding

根据WMD paper,它受到word2vec模型的启发,并使用word2vec向量空间将文档1移向文档2(在“地球移动距离”度量标准的上下文中)。来自论文:

Assume we are provided with a word2vec embedding matrix
X ∈ Rd×n for a finite size vocabulary of n words. The 
ith column, xi ∈ Rd, represents the embedding of the ith
word in d-dimensional space. We assume text documents
are represented as normalized bag-of-words (nBOW) vectors,
d ∈ Rn. To be precise, if word i appears ci times in
the document, we denote di = ci/cj (for j=1 to n). An nBOW vector
d is naturally very sparse as most words will not appear in
any given document. (We remove stop words, which are
generally category independent.)

我从文章中理解了这个概念,然而,我无法理解wmd如何在Gensim中使用word2vec嵌入代码中的空间。

有人可以用简单的方式解释一下吗?它是否以不同的方式计算单词向量,因为我无法理解在这个代码中使用word2vec嵌入矩阵的位置?

WMD Fucntion from Gensim:

   def wmdistance(self, document1, document2):
    # Remove out-of-vocabulary words.
    len_pre_oov1 = len(document1)
    len_pre_oov2 = len(document2)
    document1 = [token for token in document1 if token in self]
    document2 = [token for token in document2 if token in self]

    dictionary = Dictionary(documents=[document1, document2])
    vocab_len = len(dictionary)

    # Sets for faster look-up.
    docset1 = set(document1)
    docset2 = set(document2)

    # Compute distance matrix.
    distance_matrix = zeros((vocab_len, vocab_len), dtype=double)
    for i, t1 in dictionary.items():
        for j, t2 in dictionary.items():
            if t1 not in docset1 or t2 not in docset2:
                continue
            # Compute Euclidean distance between word vectors.
            distance_matrix[i, j] = sqrt(np_sum((self[t1] - self[t2])**2))

    def nbow(document):
        d = zeros(vocab_len, dtype=double)
        nbow = dictionary.doc2bow(document)  # Word frequencies.
        doc_len = len(document)
        for idx, freq in nbow:
            d[idx] = freq / float(doc_len)  # Normalized word frequencies.
        return d

    # Compute nBOW representation of documents.
    d1 = nbow(document1)
    d2 = nbow(document2)

    # Compute WMD.
    return emd(d1, d2, distance_matrix)

1 个答案:

答案 0 :(得分:2)

出于大规模杀伤性武器的目的,文本被认为是一堆文字'意义这些桩位于文本词的坐标处 - 这就是为什么WMD计算依赖于来自另一个源的一组词向量的原因。那些向量定位了文本的堆。

然后,大规模杀伤性武器是移动一个文本堆以匹配另一个文本堆所需的最少量的工作。从一堆转移到另一堆所需的工作量度是这些桩坐标之间的欧氏距离。

你可以尝试一下幼稚的移动:看看文字A中的第一个单词,将它移到文本B中的第一个单词,依此类推。但这不太可能是最便宜的转移 - 这可能会尝试匹配更近的词,发送'意思'在最短的路径上。因此,实际计算WMD是一个迭代优化问题 - 比两个点之间的简单欧氏距离或余弦距离明显更昂贵。

优化是在您摘录的代码中的emd()调用内完成的。但优化需要的是文本A中所有单词与文本B中所有单词之间的成对距离 - 因为这些是所有候选路径,意义权重可能会被移位。您可以在代码中计算出成对距离,以使用模型中已加载的字词向量来填充distance_matrix,并可通过self[t1]self[t2]等进行访问。