将 gensim 的 Word2Vec 与自定义词上下文对结合使用
Using gensim's Word2Vec with custom word-context pairs
我想使用 Gensim 实现的 Word2Vec 和上下文词对列表作为输入而不是句子。我原本认为将手动创建的上下文词对作为句子输入相当于输入原始句子并将 window 参数设置为 1,但这两种方法产生不同的结果。 Gensim 的 Word2Vec 如何计算句子的上下文词对,我应该如何输入我手动创建的词对作为函数的输入?
您是说 "different results" 发生在提供长 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
参数控制)和负样本选择(在默认情况下负采样模式)。仅此一项就意味着方法之间的结果不会相同。
此外,算法的这两个方面(下采样和负采样)都涉及有意的随机性——即使您尝试确定性地播种随机数生成器,如果使用多个 worker,OS 线程调度可能意味着从 运行 到 运行 的工作进程之间的不同进度,因此对考虑和随机性使用的顺序不同。同样,每个 运行(即使使用完全相同的参数,但使用许多工作线程)也会根据设计给出略有不同的结果。
最后,如果使用大于 1 的 window
值,算法实际上会为每个目标词选择使用从 1 到您的值中随机选择的其他 window 大小。 (这样做是为了有效地为较近的词赋予更多权重。这与将某些比例因子应用于较远的词具有相同的效果——但总体上做的工作更少,从而加快了训练速度。)
因此,如果您尝试模拟 window
值大于 1 的词对,则无法通过创建所有在 -[ 内的天真配对来近似长句行为=46=] 单词作为你的新句子。您必须执行类似的随机 window 收缩。 (而且,你仍然会对整体词频产生不稳定的影响。)
不过,假设您对这条路径感兴趣,因为您的真实数据可能不是真实的、按词序排列的自然语言句子,none 可能很重要。你可以尝试提供你自己的合成对作为句子,无论你的最终目标是什么,仍然可以获得可接受的结果——你应该尝试看看。原始 word2vec 算法的 windowing 或加权过程没有任何神奇的理由——它只是碰巧做了一些有趣的事情。对于其他类型的语料库,其他选择可能同样好,甚至更好。
我想使用 Gensim 实现的 Word2Vec 和上下文词对列表作为输入而不是句子。我原本认为将手动创建的上下文词对作为句子输入相当于输入原始句子并将 window 参数设置为 1,但这两种方法产生不同的结果。 Gensim 的 Word2Vec 如何计算句子的上下文词对,我应该如何输入我手动创建的词对作为函数的输入?
您是说 "different results" 发生在提供长 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
参数控制)和负样本选择(在默认情况下负采样模式)。仅此一项就意味着方法之间的结果不会相同。
此外,算法的这两个方面(下采样和负采样)都涉及有意的随机性——即使您尝试确定性地播种随机数生成器,如果使用多个 worker,OS 线程调度可能意味着从 运行 到 运行 的工作进程之间的不同进度,因此对考虑和随机性使用的顺序不同。同样,每个 运行(即使使用完全相同的参数,但使用许多工作线程)也会根据设计给出略有不同的结果。
最后,如果使用大于 1 的 window
值,算法实际上会为每个目标词选择使用从 1 到您的值中随机选择的其他 window 大小。 (这样做是为了有效地为较近的词赋予更多权重。这与将某些比例因子应用于较远的词具有相同的效果——但总体上做的工作更少,从而加快了训练速度。)
因此,如果您尝试模拟 window
值大于 1 的词对,则无法通过创建所有在 -[ 内的天真配对来近似长句行为=46=] 单词作为你的新句子。您必须执行类似的随机 window 收缩。 (而且,你仍然会对整体词频产生不稳定的影响。)
不过,假设您对这条路径感兴趣,因为您的真实数据可能不是真实的、按词序排列的自然语言句子,none 可能很重要。你可以尝试提供你自己的合成对作为句子,无论你的最终目标是什么,仍然可以获得可接受的结果——你应该尝试看看。原始 word2vec 算法的 windowing 或加权过程没有任何神奇的理由——它只是碰巧做了一些有趣的事情。对于其他类型的语料库,其他选择可能同样好,甚至更好。