我正在使用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
先谢谢了,
阿莫斯
答案 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,它们可能已经包含在训练数据中,而错误短语没有。)