从句子的开头构造 word2vec (CBOW) 训练数据

数据挖掘 神经网络 nlp 文本挖掘 词嵌入 word2vec
2022-03-02 07:38:34

在为 CBOW 构建训练数据时,Mikolov 等人。建议使用上下文窗口中心的单词。在句子的开头/结尾捕获单词的“最佳”方法是什么(我把最好的放在引号中,因为我确信这取决于任务)。我在网上看到的实现是这样的:

for i in range(2, len(raw_text) - 2):
    context = [raw_text[i - 2], raw_text[i - 1],
               raw_text[i + 1], raw_text[i + 2]]

我看到这种方法产生了两个问题。

  • 问题 1:该方法将不平衡的焦点放在句子的中间。例如,句子的第一个词只能出现在 1 个上下文窗口中,并且永远不会作为目标词出现。将此与句子中的第 4 个单词进行比较,该单词将出现在 4 个上下文窗口中,并且也是目标词。这将是一个问题,因为一些词经常出现在句子的开头(即然而,因此等)。这种方法不会尽量减少它们的使用吗?
  • 问题2: 4个或更少单词的句子被完全忽略,短句的重要性被最小化。例如,一个 5 个单词的句子只能贡献一个训练样本,而一个长度为 8 的句子将贡献 4 个训练样本。

任何人都可以就这些问题对结果的影响程度或构建训练数据的任何替代方法提供见解吗?(我考虑让第一个词成为目标词并使用接下来的 N 个词作为上下文,但这会产生它自己的问题)。

注意:我还在 Stack Overflow 上问过这个问题:https ://stackoverflow.com/questions/63747999/construct-word2vec-cbow-training-data-from-beginning-of-sentence

1个回答

是这个问题的一个很好的答案。我总结一下:

  1. 该代码示例取自 GitHub 上的“错误”存储库,并不是典型的健壮解决方案。
  2. 稳健的解决方案实际上确实使用第一个词作为目标词。如果上下文窗口长度为 10,则该方法使用接下来的 5 个单词作为上下文,第一个单词作为目标(它实际上不会有大小为 10 的上下文,因为上下文的前半部分不存在) .
  3. 即使句子中的前几个词被用作目标词,它们仍然不会出现在尽可能多的上下文中。这个问题得到了缓解,因为它们出现在较小的上下文中。由于它们出现的上下文更小,它们对上下文的影响更大,因此在反向传播中更重要。
  4. 许多更健壮的实现将使用整个段落或文档而不是句子(有些甚至包括标点符号)。这是有道理的,因为一个句子的结尾可能会为另一个句子的开头提供上下文。实施此方法后,开始/结束词的数量要少得多,从而减少了问题。

上面链接的答案还有一些其他有用的细节,值得一读。