在为 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