与使用 doc2vec 模型的文档相比,我如何计算一个词或几个词的相似度?

How do I calculate the similarity of a word or couple of words compared to a document using a doc2vec model?

在 gensim 中,我有一个经过训练的 doc2vec 模型,如果我有一个文档和一个单词或两三个单词,计算单词与文档相似度的最佳方法是什么?

我是否只计算它们之间的标准余弦相似度,就好像它们是 2 个文档一样?或者是否有更好的方法将小字符串与文档进行比较?

一开始以为可以求出1-3字串中的每个词和文档中的每个词取平均值的余弦相似度,但不知道效果如何。

有多种可能的方法,最好的方法可能取决于 kind/quality 您的训练数据和最终目标。

使用任何 Doc2Vec 模型,您都可以通过 infer_vector() 方法为包含已知单词的新文本(甚至是单个单词文本)推断出向量。但是,与 Doc2Vec 通常一样,这往往适用于至少几十个单词的文档,最好是数百个单词。 (微小的 1-3 字文档似乎特别有可能得到某种程度的 peculiar/extreme 推断向量,特别是如果 model/training-data 一开始就不够强大。)

注意未知词会被 infer_vector() 忽略,所以如果你给它一个 3 词的文档,其中两个词是未知的,它实际上只是根据一个已知词进行推断。如果你只给它输入未知单词,它会 return 一个随机的、温和的初始化向量,没有经过推理调整。 (所有 inference/training 总是以这样一个随机向量开始,如果没有已知单词,你就把它取回来。)

不过,这可能值得一试,您可以通过余弦相似度直接比较来自小型文档和大型文档的推断向量。

许多 Doc2Vec 模式训练文档向量和兼容的词向量。默认的 PV-DM 模式(dm=1)执行此操作,或者如果您添加可选的交错字向量训练(dbow_words=1),则使用 PV-DBOW(dm=0)。 (如果你使用 dm=0, dbow_words=0,你会得到快速的训练,并且通常是非常好的文档向量,但是词向量根本不会被训练 - 所以你不会想要查找这样的直接用于任何目的的模型的词向量。)

有了这样一个包含有效词向量的 Doc2Vec 模型,您还可以通过它们各自的词向量来分析您的简短的 1-3 词文档。您可以根据完整文档的向量单独检查每个单词,或者使用短文档单词的平均值与完整文档的向量进行比较。

同样,最好的可能取决于您需要的其他细节。例如,如果短文档是一个查询,并且您列出了多个结果,则查询结果可能会有所不同——通过显示一些非常接近查询中单个单词的命中,即使不接近完整查询——对用户来说与接近完整查询的文档一样有价值。

另一个值得关注的度量是 "Word Mover's Distance",它仅适用于文本单词的词向量,就好像它们 "piles of meaning" 用于较长的文本一样。这有点像您喜欢的逐字逐句的方法——但要努力将单词与比较文本中最接近的类似物进行匹配。计算起来可能非常昂贵(尤其是在较长的文本上)——但有时可以在将使用不同单词的替代文本关联到相似效果时给出令人印象深刻的结果。