Neural network 从句首开始构建word2vec(CBOW)训练数据

Neural network 从句首开始构建word2vec(CBOW)训练数据,neural-network,nlp,text-mining,word2vec,word-embedding,Neural Network,Nlp,Text Mining,Word2vec,Word Embedding,为CBOW构建训练数据时,建议使用上下文窗口中心的单词。在句首/句尾捕获单词的“最佳”方法是什么(我在引号中加上“最佳”,因为我确信这取决于任务)。我在网上看到的实现是这样做的: 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期:这种方

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

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期:这种方法将不平衡的焦点放在句子的中间。例如,句子的第一个单词只能出现在一个上下文窗口中,永远不会作为目标单词出现。将其与句子中的第四个单词进行比较,第四个单词将出现在4个上下文窗口中,并且也是目标单词。这将是一个问题,因为一些单词经常出现在句子的开头(例如,然而,因此,等等)。这种方法不会减少它们的使用吗
  • 第2期:完全忽略4个或更少单词的句子,并最小化短句的重要性。例如,一个包含5个单词的句子只能提供一个训练样本,而一个长度为8的句子将提供4个训练样本
有人能提供这些问题对结果的影响程度的见解吗,或者提供构建培训数据的其他方法吗?(我考虑过让第一个词成为目标词,并使用接下来的N个词作为上下文,但这会产生它自己的问题)

有关堆栈交换的相关问题:

我看到的所有实际实现,回到Mikolov最初的
word2vec.c
,都倾向于让每个单词轮流成为“中心目标词”,但将上下文窗口截断为任何可用的内容

因此,例如,如果
窗口=5
(在两侧),并且“中心词”作为文本的第一个词,则仅使用以下5个词。如果中心词是第二个词,将使用前面的1个词和后面的5个词

这很容易实现,在实践中效果很好

在CBOW模式下,每个中心词仍然是相同数量的神经网络正向传播(大致上是预测尝试)的一部分,尽管“靠近末端”的词作为输入参与的频率稍低。但即便如此,它们也会受到一个不断增加的更大更新的影响——比如它们是5个单词中的1个,而不是10个单词中的1个

(在SG模式下,接近尾端的单词将同时输入和目标单词,频率略低。)

您的示例代码—在没有完整上下文窗口的情况下显示单词永远不会成为中心目标—不是我见过的东西,我只希望在有缺陷/不复杂的实现中选择它

因此,这两个问题都不会出现在文本长度超过1个单词的常见实现中。(即使是两个单词的文本,第一个单词也将使用第二个窗口进行预测,第二个单词将使用第一个窗口进行预测。)

虽然实际的单词取样确实会导致两端单词的处理略有不同,但我很难想象这些单词处理的细微差异会对结果产生任何影响,在word2vec的适当训练小体中,这些小体很大,而且所有相关单词都有大量对比示例

(也许这在一些小型或合成语料库中是一个问题,其中一些罕见但重要的标记只出现在开头或结尾位置。但这与word2vec的常用用法相去甚远。)

还要注意的是,虽然一些描述和API将word2vec训练单元描述为“句子”,但该算法实际上只适用于“标记列表”。通常,每个标记列表都会跨越段落或文档。有时,它们会将标点符号(包括句子结尾的句点)保留为伪词。跨越句子边界的窗口出血很少会造成伤害,而且通常会有所帮助,因为从一个句子引出并进入下一个句子的单词的出现可能与一个句子内单词的出现一样具有指导意义。因此,在许多句子训练文本的常见实践中,甚至很少有“接近结尾”的单词具有您可能认为的稍微不同的抽样处理