短短语的快速文本表示,但包含短短语的长短语则不

时间:2019-03-06 16:50:56

标签: python nlp gensim fasttext

我正在使用Gensim.bin加载德语Fasttext文件,以便获取词汇外单词和短语的矢量表示。到目前为止,一切正常,我总体上取得了不错的成绩。
我对KeyError :'all ngrams for word <word> absent from model'.很熟悉,显然该模型并未为每种可能的ngram组合提供矢量表示。
但是现在我遇到了一个令人困惑的问题(至少对我来说)。
我举一个简单的例子:
该模型提供了短语AuM Wert的表示形式。
但是,当我想获得AuM Wert 50 Mio. Eur的表示形式时,我会得到上面提到的KeyError。因此,该模型显然具有较短短语的表示形式,而没有扩展短语的表示形式。
它甚至返回AuM Wert 50 Mio.Eur的表示形式(我刚刚删除了'Mio'和'Eur'之间的空格)
我的意思是,Error中的语句根本不正确,因为第一个示例表明它知道某些ngram。有人可以向我解释吗?我在这里不明白什么?我对ngram的理解错了吗?

此处提供代码:

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

先谢谢了,
阿莫斯

1 个答案:

答案 0 :(得分:0)

我不确定是什么原因导致了您所看到的行为,尽管我下面有一个理论。

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

它应该在下一版本中修复。您可以阅读change note about the new compatible behavior

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

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

  • 将空格分隔的短语传递到FastText并不常见。此外,训练文本的常规标记化只会在没有任何内部空白的情况下通过 传递单词标记。因此,对于典型模型而言,此类包含空格的短语将不可能具有全字向量。而且,它们包含空格的n-gram都不会映射到训练期间看到的n-gram。在gensim 3.7.1和更早的版本中,您一定程度上得到了一个向量,这是因为在训练中看到了一些包含空格的n-grams not 。 (在3.7.1之后,您将始终获得一个向量,尽管它可能是由查询词的新颖n-gram与在训练中学习到的n-gram的随机碰撞组成的,或者仅仅是由随机初始化但从未训练过的n模型的n元语法哈希表中的向量。)
  • 通过合成的词首和词尾后缀(特别是字符<>)学习N-gram。默认的n-gram大小范围是4到6个字符。因此,您的字符串'AuM Wert'将在其n元语法中包括'<AuM''Wert''ert>'。 (其所有其他n-gram都将包含一个空格字符,因此不可能是在对无空格的单词进行训练时所学到的n-gram集合)。但是请注意,出现错误的较长短语将包括n-gram 'ert>',因为先前的令牌结尾已被空格替换。因此,较短的短语的n-gram不是较大短语的n-gram的适当子集-较大的短语可能会出错,而较短的短语则不会。 (并且您的较长短语没有空格,也不会出错,还包括许多额外的4-6个字符的n-gram,它们可能已经包含在训练数据中,而错误短语没有。)