我是NLP新手,目前正在构建一个特定领域的NLP系统。在我的文档上训练了word2vec和fasttext模型后,我发现嵌入效果不太好,因为我没有提供足够数量的文档(例如,嵌入无法识别“bar”和“pub”之间有很强的相关性,因为“pub”在文档中只出现了几次)。后来,我在网上找到一个基于该特定领域语料库构建的word2vec模型,其嵌入效果显然更好(因此“pub”与“bar”更加相关)。有什么方法可以使用我找到的模型来改进我的词嵌入吗?谢谢!
回答:
Word2Vec(及其类似模型)确实需要大量多样的数据来创建强有力的向量。
但同样,模型的向量通常只有在与同一会话中一起训练的其他向量一起时才有意义。这是因为该过程包括一些随机性,并且向量只有通过与所有其他向量和模型训练中的其他方面进行拉锯战,才能获得有用的位置。
因此,像“bar”这样的词并没有标准的位置——只是在某个模型中,根据训练数据和模型参数以及模型中共存的其他词,有一个好的位置。
这意味着将来自不同模型的向量混合起来是非 trivial 的。有方法可以学习一种“翻译”,将向量从一个模型的空间移动到另一个模型的空间——但这本身就像重新训练一样。你可以用来自别处的向量预初始化一个模型……但是一旦训练开始,你的训练语料库中的所有词都会开始漂移到最适合该数据的位置,并且逐渐远离它们原来的位置,远离与那些未被更新的其他词的纯可比性。
在我看来,最好的方法通常是用更合适的数据扩展你的语料库,以便它对你重要的每个词都有“足够”的例子,并且在足够多样的上下文中。
许多人使用像维基百科文章这样的大型免费文本转储来进行词向量训练,但要注意其写作风格——干燥的、权威的参考文本——可能并不适合所有领域。如果你的问题领域是“商业评论”,你最好找到其他评论文本。如果是小说故事,那就找更多的虚构作品。以此类推。你可以将这些其他文本来源与你的数据混合在一起,以扩展词汇覆盖范围。
你还可以潜在地混入额外重复的本地数据示例,如果你希望它有效地具有相对更多的影响。(一般来说,仅仅重复少量非多样化的示例无法帮助改善词向量:是不同示例的微妙对比有助于改善。但作为一种逐渐提升某些示例影响的方法,当总体上有大量示例时,这样做可能更有意义。)