【发布时间】:2019-08-09 01:43:20
【问题描述】:
如果我为同一个词(比如“猴子”)计算 word2vec,一次基于 1800 年的一个大文本,另一次基于 2000 年的一个大文本,那么结果从我的角度来看是无法比较的。我对吗?为什么会这样? 我有以下想法:过去的文本可能有完全不同的词汇,这就是问题所在。但是如何才能治愈它(使嵌入具有可比性)?
提前致谢。
【问题讨论】:
标签: word2vec
如果我为同一个词(比如“猴子”)计算 word2vec,一次基于 1800 年的一个大文本,另一次基于 2000 年的一个大文本,那么结果从我的角度来看是无法比较的。我对吗?为什么会这样? 我有以下想法:过去的文本可能有完全不同的词汇,这就是问题所在。但是如何才能治愈它(使嵌入具有可比性)?
提前致谢。
【问题讨论】:
标签: word2vec
Word2Vec 模型中的任何单词都没有“正确”的位置——只是一个相对于其他单词和训练数据而言效果相当好的位置,经过一系列增量推拉训练。实际上,每个模型都以低幅度 random 位置的词向量开始,并且训练本身包括设计的随机性(例如通过随机选择用作负对比示例的词)和执行顺序随机性(由于操作系统的 CPU 调度选择有些随意,多个线程的进度略有不同)。
因此,您的“sentences-from-1800”和“sentences-from-2000”模型会有所不同,因为训练数据不同 - 可能是因为作者的用法不同,而且每个语料库只是一个很小的所有现有用法的示例。而且:仅仅在“samples-from-1800”语料库上连续训练两次就会产生不同的模型!每个这样的模型应该和另一个模型一样好,就单词相对于同一模型中其他单词的相对距离/位置而言。但是单个单词的坐标可能非常不同,并且无法比较。
为了让单词“在同一个坐标空间中”,必须采取额外的步骤。单词在同一个空间中最直接的方法是在同一个模型中一起训练它们,它们交替出现在对比的用法示例中,包括与其他常用词一起出现。
因此,例如,如果您需要将“calenture”(热带发烧的旧词,可能不会出现在您 2000 年代的语料库中)与“青霉素”(在 20 世纪发现)进行比较,那么您最好的选择是将两个语料库混洗成一个语料库并训练一个模型。如果每个单词出现在两个时代出现的某些单词附近,具有相对稳定的含义,那么它们的词向量可能是可比较的。
如果您只需要一个组合词向量来表示“猴子”,那么这种方法也可能适合您的目的。是的,一个词的含义会随着时间而变化。但即使在任何一个时间点,词都是多义的:它们具有多种含义。具有多种含义的单词的单词向量倾向于移动到它们每个替代含义之间的坐标。因此,即使“猴子”的含义发生了变化,使用组合时代语料库可能会为您提供“猴子”的单个向量,该向量可以合理地表示其在所有时代的平均含义。
如果您特别想模拟单词随时间的意义变化,那么您可能需要其他方法:
您可能想为时代构建单独的模型,但要学习它们之间的翻译,因为有些词可能变化很小,而另一些词变化很大。 (有一些方法可以使用某些假设具有相同含义的“锚字”来学习不同 Word2Vec 模型之间的转换,然后将相同的转换应用于其他单词以将它们的坐标投影到另一个模型中。)
或者,创建一个组合模型,但用特定于时代的替代标记概率性地替换您想要跟踪其变化含义的单词。 (例如,您可以酌情用 'monkey@1800' 和 'monkey@2000' 替换一定比例的 'monkey' 出现,以便最终得到 三个 词向量monkey', 'monkey@1800', 'monkey@2000',让你比较不同的感官。)
使用词向量随时间跟踪含义的一些先前工作是“HistWords”项目:
【讨论】: