2

根据 WMD论文,它受到 word2vec 模型的启发,并使用 word2vec 向量空间将文档 1 移向文档 2(在 Earth Mover 距离度量的上下文中)。从论文中:

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 嵌入矩阵的位置?

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)
4

1 回答 1

2

就 WMD 而言,文本被认为是一堆意义的“堆”。这些堆被放置在文本单词的坐标处——这就是为什么大规模杀伤性武器的计算依赖于来自另一个来源的一组词向量。这些向量定位文本的堆。

WMD 是移动一个文本的堆以匹配另一个文本的堆所需的最少工作量。从一堆到另一堆所需的工作量度是这些堆坐标之间的欧几里德距离。

您可以尝试简单地转换堆:查看文本 A 中的第一个单词,将其移至文本 B 中的第一个单词,依此类推。但这不太可能是最便宜的转变——它可能会尝试匹配更接近的单词,以尽可能短的路径传递“意义”。所以实际上计算 WMD 是一个迭代优化问题——比简单的欧几里得距离或两点之间的余弦距离要昂贵得多。

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

于 2017-09-14T00:22:47.353 回答