doc2vec 从向量中推断单词
doc2vec infer words from vectors
我正在聚类评论。
对文本进行预处理和矢量化后,我从我的 doc2vec 模型中推断出矢量并应用了 kmeans。
之后,我想将聚类质心向量转换为单词,以了解聚类的语义核心。可能吗?
编辑:我使用 python/gensim。
您可以尝试多种可能的方法,看看哪种方法可以满足您的需求。
首先也是最重要的,一些 Gensim Doc2Vec
模式 co-train word-vectors 进入与 doc-vectors 相同的坐标系 - 允许直接比较单词和文档,有时甚至达到组合 'vector-arithmetic' 的水平(如著名的 word2vec analogy-solving 示例)。
您可以在论文 "Document Embedding with Paragraph Vectors" 中看到讨论的这种潜力。
默认PV-DM模式(参数dm=1
)自动co-trains words and docs in the same space。您还可以通过添加可选参数 dbow_words=1
.
将交错 word-vector skip-gram 训练添加到其他 PV-DBOW dm=0
模式中
虽然情况仍然如此 d2v_model.dv.most_similar(docvec_or_doctag)
只会 return doc-vector 结果,而 d2v_model.wv.most_similar(wordvec_or_word_token)
只会 return word-vector 结果,你绝对可以提供一个文档的原始向量到 word-vectors 的集合,或者一个 word-vector 到 doc-vectors 的集合,以获得另一种类型的 nearest-neighbors .
因此,在这些模式之一中,使用 doc-vector,您可以使用...
d2v_model.wv.most_simlar(positive=[doc_vector])
...获得最接近 doc-vector 的 list-of-words。它们是否具有足够的代表性将因许多因素而异。 (如果它们看起来完全是随机的,则您的 data-sufficiency 或过程可能存在其他问题,或者您可能使用 dm=0, dbow_words=0
模式,使单词随机且未经训练。)
您可以在集群的质心上使用它 - 但请注意,质心可能会隐藏许多更大的分组,其中可能包括文档 not质心周围紧 'ball'。因此,您也可以在集群中的 all 文档上使用它,以获得与每个文档最接近的 top-N 个词——然后将集群总结为最常出现在这些文档中的词top-N 列表,或大多数 独特地 出现在那些 top-N 列表中(相对于其他集群的 top-N 列表)。这可能描述了更多的完整集群。
另外,还有一个来自 Gensim 的 Word2Vec
、predict_output_word()
, which vaguely simulates the word2vec training-predictions to give a ranked list of predictions of a word from its surrounding words. The same code could be generalized to predict document-words from a doc-vector – there's an open pending issue to do so 的方法,虽然 no-one 已经解决了它,但它只是一些简单的编码。 (这是对 Gensim 项目的第一个贡献,很受欢迎,也很容易。)
另外:在建立了聚类后,你甚至可以将Doc2Vec
模型放在一边,使用更传统的直接counting/frequency方法来挑选每个聚类中的most-salient词.例如,将每个聚类变成一个单一的合成伪文档。与其他集群伪文档相比,将里面的单词排名 TF-IDF。 (或者,获取每个原始文档的前 TF-IDF 个术语;通过所有集群文档中统计的 most-often-relevant 个词来描述每个集群。)
尽管 gojomo 的回答非常有道理,但我决定采用分类而非聚类的另一种方式。我发现有关图书馆的文章很有用:
https://towardsdatascience.com/unsupervised-text-classification-with-lbl2vec-6c5e040354de]
我正在聚类评论。
对文本进行预处理和矢量化后,我从我的 doc2vec 模型中推断出矢量并应用了 kmeans。
之后,我想将聚类质心向量转换为单词,以了解聚类的语义核心。可能吗?
编辑:我使用 python/gensim。
您可以尝试多种可能的方法,看看哪种方法可以满足您的需求。
首先也是最重要的,一些 Gensim Doc2Vec
模式 co-train word-vectors 进入与 doc-vectors 相同的坐标系 - 允许直接比较单词和文档,有时甚至达到组合 'vector-arithmetic' 的水平(如著名的 word2vec analogy-solving 示例)。
您可以在论文 "Document Embedding with Paragraph Vectors" 中看到讨论的这种潜力。
默认PV-DM模式(参数dm=1
)自动co-trains words and docs in the same space。您还可以通过添加可选参数 dbow_words=1
.
dm=0
模式中
虽然情况仍然如此 d2v_model.dv.most_similar(docvec_or_doctag)
只会 return doc-vector 结果,而 d2v_model.wv.most_similar(wordvec_or_word_token)
只会 return word-vector 结果,你绝对可以提供一个文档的原始向量到 word-vectors 的集合,或者一个 word-vector 到 doc-vectors 的集合,以获得另一种类型的 nearest-neighbors .
因此,在这些模式之一中,使用 doc-vector,您可以使用...
d2v_model.wv.most_simlar(positive=[doc_vector])
...获得最接近 doc-vector 的 list-of-words。它们是否具有足够的代表性将因许多因素而异。 (如果它们看起来完全是随机的,则您的 data-sufficiency 或过程可能存在其他问题,或者您可能使用 dm=0, dbow_words=0
模式,使单词随机且未经训练。)
您可以在集群的质心上使用它 - 但请注意,质心可能会隐藏许多更大的分组,其中可能包括文档 not质心周围紧 'ball'。因此,您也可以在集群中的 all 文档上使用它,以获得与每个文档最接近的 top-N 个词——然后将集群总结为最常出现在这些文档中的词top-N 列表,或大多数 独特地 出现在那些 top-N 列表中(相对于其他集群的 top-N 列表)。这可能描述了更多的完整集群。
另外,还有一个来自 Gensim 的 Word2Vec
、predict_output_word()
, which vaguely simulates the word2vec training-predictions to give a ranked list of predictions of a word from its surrounding words. The same code could be generalized to predict document-words from a doc-vector – there's an open pending issue to do so 的方法,虽然 no-one 已经解决了它,但它只是一些简单的编码。 (这是对 Gensim 项目的第一个贡献,很受欢迎,也很容易。)
另外:在建立了聚类后,你甚至可以将Doc2Vec
模型放在一边,使用更传统的直接counting/frequency方法来挑选每个聚类中的most-salient词.例如,将每个聚类变成一个单一的合成伪文档。与其他集群伪文档相比,将里面的单词排名 TF-IDF。 (或者,获取每个原始文档的前 TF-IDF 个术语;通过所有集群文档中统计的 most-often-relevant 个词来描述每个集群。)
尽管 gojomo 的回答非常有道理,但我决定采用分类而非聚类的另一种方式。我发现有关图书馆的文章很有用:
https://towardsdatascience.com/unsupervised-text-classification-with-lbl2vec-6c5e040354de]