在gensim中,我有一个训练有素的doc2vec模型,如果我有一个文档以及一个单词或两个单词或三个单词,那么计算单词与文档相似度的最佳方法是什么?
我是否只是像它们是2个文档那样在它们之间进行标准余弦相似度?还是有比较好的方法将小字符串与文档进行比较?
首先想到的是,我可以从1-3个单词的字符串中的每个单词和文档中的每个单词取平均值取余弦相似度,但是我不知道这样做的效果如何。
答案 0 :(得分:3)
有很多可能的方法,最好的方法可能取决于训练数据的类型/质量和最终目标。
对于任何Doc2Vec
模型,您都可以通过infer_vector()
方法为包含已知单词(甚至是单个单词的文本)的新文本推断向量。但是,通常像Doc2Vec
一样,这对于至少包含几十个单词(最好是数百个单词)的文档更有效。 (微小的1-3个单词的文档似乎特别有可能会获得一些特殊/极端的推断向量,尤其是如果模型/训练数据一开始的能力不足。)
请注意,infer_vector()
会忽略未知单词,因此,如果向其提供3个单词的文档,而其中两个单词未知,则实际上只是基于一个已知单词进行推断。而且,如果只给它输入未知单词,它将返回一个随机的,温和的初始化向量,该向量不会进行推理调整。 (所有推理/训练总是从这样的随机向量开始的,如果没有已知的单词,您只需将其取回来即可。)
仍然,这可能值得尝试,您可以通过余弦相似度直接比较来自微小文档和巨型文档的推断向量。
许多Doc2Vec
模式都训练doc向量和兼容的词向量。如果添加了可选的交错词向量训练(dm=1
),则默认的PV-DM模式(dm=0
)或PV-DBOW(dbow_words=1
)执行此操作。 (如果您使用dm=0, dbow_words=0
,则会获得快速的培训,而且通常会获得很好的文档向量,但是单词向量根本不会经过训练-因此,您不想查找这样的词向量。出于任何目的直接使用模型的单词向量。)
使用这样的Doc2Vec
模型,其中包括有效的单词向量,您还可以通过单个单词的向量来分析1-3个简短的单词文档。您可以根据完整文档的向量单独检查每个单词,也可以根据完整文档的向量使用简短文档单词的平均值。
再次,最好的情况可能取决于您需要的其他细节。例如,如果短文档是一个查询,而您要列出多个结果,则查询结果可能会有所不同–通过显示一些确实与查询中的单个单词接近的匹配,即使不与查询中的单词接近完整查询–对用户而言,与接近完整查询的文档一样有价值。
另一个值得一看的度量是“移词器的距离”,它与文本单词的单词向量一起工作,就好像它们是较长文本的“意思堆”一样。这有点像您遇到的每个单词对每个单词的方法,但是要努力在比较文本中将单词与其最接近的类似词进行匹配。计算起来可能会非常昂贵(尤其是在较长的文本上),但是有时在将使用不同单词的替代文本进行关联以达到相似效果时,有时会产生令人印象深刻的结果。