短短语的 Fasttext 表示,但不适用于包含短短语的较长短语

Fasttext representation for short phrase, but not for longer phrase containing the short one

我正在使用 GensimFasttext 加载德语 .bin 文件,以便获得词汇表外单词和短语的矢量表示。目前效果还不错,整体效果不错。
我熟悉 KeyError :'all ngrams for word <word> absent from model'. 显然,该模型并未为每种可能的 ngram 组合提供向量表示。
但是现在我 运行 陷入了一个令人困惑的(至少对我来说)问题。
我将举一个简单的例子:
该模型提供了短语 AuM Wert.
的表示 但是当我想得到 AuM Wert 50 Mio. Eur 的表示时,我会得到上面提到的 KeyError。因此,该模型显然对较短的短语有表示,但对扩展的短语没有表示。
它甚至 returns 表示 AuM Wert 50 Mio.Eur(我刚刚删除了 'Mio' 和 'Eur' 之间的 space)
我的意思是,错误中的陈述根本不正确,因为第一个示例表明它知道一些 ngram。有人可以向我解释一下吗?我在这里不明白什么?我对ngrams的理解有误吗?

代码如下:

from gensim.models.wrappers import FastText
model = FastText.load_fasttext_format('cc.de.300.bin')
model.wv['AuM Wert'] #returns a vector
model.wv['AuM Wert 50 Mio.EUR'] #returns a vector
model.wv['AuM Wert 50 Mio. EUR'] #triggers the error

提前致谢,
阿摩司

虽然我有以下理论,但我不确定是什么导致了您所看到的行为。

但是,请注意当前的 gensim 行为(通过 3.7.1),有时会为 OOV 词返回 KeyError: all ngrams for word <...> absent,不符合 Facebook 的原始 FastText 实现的行为,因此被认为一个错误。

应该会在下一个版本中修复。你可以读一个change note about the new compatible behavior

因此,在不久的将来使用最新版本的 gensim,您将永远不会看到此“KeyError”。

同时,可能解释您观察到的行为的因素包括:

  • 通常不会将 space 分隔的短语传递给 FastText。此外,训练文本的通常标记化只会传递单词标记 而没有 任何内部白色 space。所以对于一个典型的模型,这样的包含 space 的短语不可能有全词向量。而且,包含 space 的 none 个字符 n-gram 也将映射到训练期间看到的 n-gram。在某种程度上你在 gensim 3.7.1 和更早版本中获得了一个向量,这将是因为在训练中看到了一些包含 space 的 n-gram not。 (Post 3.7.1,你总是会得到一个向量,尽管它可能是由查询词的新 n-grams 与在训练中学习的 n-grams 的随机碰撞组成的,或者只是随机初始化但-模型的 n-gram 哈希表中从未训练过的向量。)
  • N-grams 是通过合成的词首前缀和词尾后缀学习的——特别是字符 <>。默认的 n-gram 大小范围是 4 到 6 个字符。因此,您的字符串 'AuM Wert' 将在其 n-gram 中包括 '<AuM''Wert''ert>'。 (它的所有其他 n-grams 都将包含一个 space 字符,因此不可能在没有 spaces 的单词训练期间学习到的 n-grams 集中。)但请注意,出现错误的较长短语 不会 包含 n-gram 'ert>',因为之前的标记结束已被替换为space。因此,较短的短语的 n-grams 不是 较大短语的 n-grams 的真子集 - 较大的短语可能会出错,而较短的则不会。 (没有 space 的较长短语没有错误,还包括一些额外的 4-6 个字符的 n-gram,这些 n-gram 可能已经在训练数据中,但错误短语没有。)