我正在使用word2vec算法来检测文档中最重要的单词,我的问题是如何使用从doc2vec获得的向量来计算重要单词的权重,我的代码是这样的:
model = Doc2Vec.load(fname)
word=["suddenly"]
vectors=model.infer_vector(word)
谢谢你的考虑。
答案 0 :(得分:0)
假设您可以使用doc2vec找到与整个文档相对应的向量R
。我们还假设使用word2vec,您也可以找到与任何单词v
对应的向量w
。最后,让我们假设R
和v
位于相同的 N维空间中。
假设所有这些,您可以使用普通的老向量算法找出R
和v
之间的一些相关性。
对于初学者,您可以将v
标准化。毕竟,归一化只是将每个维度除以v
的大小。 (即|v|
)让我们将v
的规范化版本称为v_normal
。
然后,您可以将v_normal
投影到向量R
所代表的行上。该投影操作只是找到v_normal
和R
的点积,对吗?我们将点积的标量结果称为len_projection
。好吧,您可以将len_projection / |v_normal|
视为 parallel 单词的上下文与整个文档的上下文的对比。事实上,只考虑len_projection
就足够了,因为在这种情况下,v_normal
被归一化,|v_normal| == 1
。
现在,您可以将此过程应用于文档中的所有单词,并将导致最大len_projection
值的单词视为该文档中最重要的单词。
请注意,此方法最终可能会找到常用字词,例如“I”,或“和”作为文档中最重要的字词,就像这样的字词出现在许多不同的背景下。如果这是您想要解决的问题,您可能需要执行后处理步骤来过滤此类常用词。
我在这里有点想到这种方法,我不确定这种方法是否有任何科学依据。但是,如果你想一下大多数矢量嵌入是如何工作的话,这可能是有意义的。通常训练单词向量来表示使用单词的上下文。从向量算术的角度思考,将向量投影到一条线上可以揭示该词w
的上下文与该行所代表的整体上下文的平行程度。
最后但并非最不重要的是,因为我之前只使用过word2vec,所以我不确定doc2vec和word2vec数据是否可以像上面提到的那样使用。正如我在答案的第一段中所说,R
和v
必须位于相同的 N维空间中。
答案 1 :(得分:0)
使用infer_vector()
时,所提供的单词都没有任何重量'或者“重要性”。
推理过程试图逐步建立一个通常很好地预测所有提供的单词的doc-vector,并且每个单词(反过来)都是该过程同样重要的目标。
另外:推理很少适用于微小的例子,例如只有一个或几个单词的文本。当为其可选参数提供非默认值时,推理通常会更好。例如,代替默认steps=5
,值为20,100或更多可能会有所帮助,尤其是对于较小的文本。而不是默认的起始alpha=0.1
,值0.025(类似于训练默认值)通常会有所帮助。