我想使用Gensim实现的Word2Vec,将上下文单词对列表作为输入而不是句子。我原本以为将手动创建的上下文单词对作为句子输入等同于输入原始句子并将window参数设置为1,但这两种方法产生不同的结果。 Gensim的Word2Vec如何计算句子的上下文单词对,以及如何输入我手动创建的对作为函数的输入?
答案 0 :(得分:1)
您是说在提供长window
的原始句子与使用window=1
的对之间发生“不同的结果”?
假设您正在使用skip-gram和window=1
,那么可以模拟来自较长句子的对作为您自己的双令牌文本。那就是:
句子......
['A', 'B', 'C', 'D']
...将生成window=1
个培训对......
[('B', 'A'),
('A', 'B'), ('C', 'B'),
('B', 'C'), ('D', 'C'),
('C', 'D')]
而且,如果你用window=1
语句给Word2Vec喂食,你会获得相同的训练对:
['A', 'B']
['B', 'C']
['C', 'D']
然而,现在请注意,相对字频已发生变化 - 字频可影响频繁字下采样(由sample
参数控制)和负例例选择(在默认负片中)采样模式)。仅这一点就意味着方法之间的结果不一样。
此外,算法的这些方面(下采样和负采样)都涉及有意的随机性 - 即使您尝试确定性地为随机数生成器播种,如果使用多个工作线程,OS线程调度可能意味着工人之间在不同的运行之间取得了不同的进展,因此不同的配对和随机使用顺序。因此,每次运行(即使使用完全相同的参数,但使用许多工作线程)都可以根据设计给出略微不同的结果。
最后,如果使用大于1的window
值,算法实际上会为每个目标词选择使用从1中随机选择的其他窗口大小到您的值。 (这样做是为了有效地使更接近的单词更加重要。这接近同样的效果,就好像某些缩放因子应用于更远的单词 - 但通过减少整体工作,从而加快训练。)
因此,如果您试图模拟window
值大于1的单词对,则无法通过创建所有窗口内单词的天真配对来近似长句行为你的新句子。你必须执行类似的随机窗口收缩。 (并且,你仍然会对整个词频产生不稳定的影响。)
尽管如此,假设您对此路径感兴趣,因为您的真实数据可能不是真实的,按字序排列的自然语言句子,这些都不重要。您可以尝试提供自己的合成对作为句子,并且无论您的最终目标是什么,仍然可以获得可接受的结果 - 您应该尝试并查看。关于原始word2vec算法的窗口化或加权过程没有什么神奇的证据 - 它恰好做了一些有趣的事情。对于其他类型的语料库,其他选择可能同样好或更好。