Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何计算一个单词或几个单词与使用doc2vec模型的文档的相似性?_Python_Gensim_Doc2vec - Fatal编程技术网

Python 如何计算一个单词或几个单词与使用doc2vec模型的文档的相似性?

Python 如何计算一个单词或几个单词与使用doc2vec模型的文档的相似性?,python,gensim,doc2vec,Python,Gensim,Doc2vec,在gensim中,我有一个经过训练的doc2vec模型,如果我有一个文档,并且有一个单词或两个三个单词,那么计算单词与文档的相似性的最佳方法是什么 我是不是把它们当作两个文档来做标准的余弦相似性呢?还是有更好的方法将小字符串与文档进行比较 一开始我以为我可以从1-3个单词串中的每个单词和文档中的每个单词中得到余弦相似性,并取平均值,但我不知道这会有多有效。有很多可能的方法,最好的方法可能取决于您的训练数据的种类/质量和最终目标 使用任何Doc2Vec模型,您都可以通过expert_vector(

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

我是不是把它们当作两个文档来做标准的余弦相似性呢?还是有更好的方法将小字符串与文档进行比较


一开始我以为我可以从1-3个单词串中的每个单词和文档中的每个单词中得到余弦相似性,并取平均值,但我不知道这会有多有效。

有很多可能的方法,最好的方法可能取决于您的训练数据的种类/质量和最终目标

使用任何
Doc2Vec
模型,您都可以通过
expert_vector()
方法为包含已知单词的新文本(甚至是单个单词文本)推断向量。但是,一般来说,与
Doc2Vec
一样,对于至少有几十个单词(最好是几百个单词)的文档,这种方法更为有效。(微小的1-3个单词的文档似乎特别可能得到某种特殊/极端的推断向量,尤其是在模型/训练数据一开始动力不足的情况下。)

请注意,
expert_vector()
会忽略未知单词,因此,如果您为它提供了一个三个单词的文档,其中两个单词是未知的,那么它实际上只是基于一个已知单词进行推断。如果你只给它输入未知的单词,它将返回一个随机的,温和的初始化向量,没有经过任何推理调整。(所有的推理/训练都是从这样一个随机向量开始的,如果没有已知的单词,你就可以得到它。)

不过,这可能值得一试,您可以通过余弦相似性直接比较从微小和巨大文档中推断出的向量

许多
Doc2Vec
模式同时训练文档向量和兼容字向量。默认的PV-DM模式(
DM=1
)会执行此操作,如果添加可选的交错字向量训练(
DBOW\u words=1
),则默认的PV-DBOW模式(
DM=0
)。(如果您使用
dm=0,dbow_words=0
,您将得到快速的训练,而且通常是非常好的文档向量,但是这些词向量根本没有经过训练-因此您不希望出于任何目的直接查找此类模型的词向量。)

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

再说一次,哪一个最好取决于你需要的其他细节。例如,如果短文档是一个查询,并且您列出了多个结果,那么可能会出现这样的情况,即查询结果的多样性——通过在查询中显示一些非常接近单个单词的点击,即使不接近完整查询——对于用户来说与接近完整查询的文档一样有价值


另一个值得关注的指标是“单词移动距离”,它只适用于文本单词的单词向量,就好像它们是较长文本的“意义堆”。这有点像你所采用的“逐字逐句”的方法——但要在对比文本中努力将单词与其最接近的类似词进行匹配。计算起来可能非常昂贵(特别是在较长的文本上)——但有时会在关联使用不同单词的替代文本时产生令人印象深刻的效果。

我在维基百科语料库上训练了我的模型,最初,我试图直接比较大小文档的向量,这可能就是为什么根据您的解释,结果不如我希望的那么好。我确实将我的设置设置为dbow_words=1,因此我将研究WMD,并将单个单词向量与文档向量进行比较,但在将单个单词向量与总体文档向量进行比较时,您是否建议我将文档拆分为段落,并对每个段落向量进行分析,或者这不会产生明显的影响效果?你还提到了未知词有随机向量,这些词向量是如何抵消的?e、 g.doc2vecmodel['pineapple']其中菠萝是一个未知词?如果比较小文档和大文档向量效果不好,可能有很多原因-可能是因为小文档可能无法获得好的向量(你是如何创建小文档向量的?),但也可能是其他的事情——如果没有看到更多的设置,很难猜测。(例如,大文档与大文档的比较是否更有效?)将文档拆分为更小的块是否有帮助取决于您的实际目标和实验——您是否需要段落而不是完整的文档结果?“最佳段落”匹配是否比完整文档匹配对您的用户更有用?未知单词-根本没有出现在训练语料库中-没有随机词向量,它们根本没有词向量。如果尝试
doc2vecmodel.wv.['spineapple']
并且“spineapple”不在训练数据中,您将得到一个错误。另一方面,如果“苹果”在训练数据中,那么对于某些模式,
doc2vecmodel.wv.['apple']
将返回一个有用的训练词向量,但是普通的PV-DBOW(
dm=0,DBOW\u words=0
)模型只会返回一个弱的随机未训练词向量,它真的不应该用于任何东西。我实际上已经解决了这个问题,我犯了一个错误,没有对我的小文档进行预处理,这大大提高了我的准确性。我仍然打算研究平均词向量,看看这是否对准确性有有用的影响。谢谢你的帮助,顺便说一句,你回答了gensim的每一个问题,真是太棒了。