短短语的 Fasttext 表示,但不适用于包含短短语的较长短语
Fasttext representation for short phrase, but not for longer phrase containing the short one
我正在使用 Gensim
从 Fasttext
加载德语 .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 可能已经在训练数据中,但错误短语没有。)
我正在使用 Gensim
从 Fasttext
加载德语 .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 可能已经在训练数据中,但错误短语没有。)