为什么 FastText 不处理查找多词短语?

问题描述

FastText 预训练模型非常适合查找相似词:

from pyfasttext import FastText
model = FastText('cc.en.300.bin')
model.nearest_neighbors('dog',k=2000)

[('dogs',0.8463464975357056),('puppy',0.7873005270957947),('pup',0.7692237496376038),('canine',0.7435278296470642),...

但是,对于多词短语,它似乎失败了,例如:

model.nearest_neighbors('Gone with the Wind',k=2000)

[('DEky4M0BSpUOTPnSpkuL5I0GTSnRI4jMepcaFAoxIoFnX5kmJQk1aYvr2odGBAaifkECQoABAAsCQAAABAAEgAACGcAaraYSLCgQQEABBokkFAhAQEQHQ4EMKCiQogRCVKsOOAiRocbLQ7EmJEhR4cfEWoUOTFhRIUNE44kGZOjSIQfG9rsyDCnzp0AaMYMyfnjs6JFZWpEKlDiUqALJ0KNatKmU4NDBwYEACH5BAUKAAQALAkAAAAQABIAAahpAAEQGEiQIICDBAUgLEgAwICHAgkImBhxoMOHAyJOpGgQY8aBGxV2hJgwZMWLFTcCUIjwoeuLBym69PgxJMuDNAUqVDkz50qZLi',0.71047443151474),

model.nearest_neighbors('Star Wars',k=2000)
[('clockHauser',0.5432934761047363),('CrônicasEsdrasNeemiasEsterJóSalmosProvérbiosEclesiastesCânticosIsaíasJeremiasLamentaçõesEzequielDanielOséiasJoelAmósObadiasJonasMiquéiasNaumHabacuqueSofoniasAgeuZacariasMalaquiasNovo',0.5197194218635559),

这是 FastText 预训练模型的限制吗?

解决方法

我不知道 FastText 具有处理多词短语的任何特殊能力。

所以我希望您的查询被解释为一个不在模型中的长词,其中包括许多包含 ' ' 空格字符的字符 n-gram。

而且,因为我不希望训练数据有任何这样的带有空格的 n-gram,所有这样的 n-gram 的向量将是模型的 n-gram 桶中的任意随机碰撞。因此,对于此类“单词”,任何此类合成的词汇表外向量可能比通常的 OOV 向量更嘈杂。

但还有:pyfasttext 包装器是一个废弃的 FastText 非官方接口,已超过 2 年没有更新,并且在其 PyPI 页面上有一条消息:

警告! pyfasttext 不再维护:使用来自 fastText 存储库的官方 Python 绑定:https://github.com/facebookresearch/fastText/tree/master/python

改用它可能会发现更好的结果。请参阅其 doc/examples 文件夹的示例代码,了解如何查询最近邻的示例,并将其 get_sentence_vector() 视为一种将字符串拆分为单词的方法,然后对其向量进行平均,而不是只是将字符串视为一个很长的 OOV 字。

,

documentation 中所述,官方的 fastText 无监督嵌入是在标记化阶段之后构建的,其中单词被分离。

如果您查看模型词汇表(官方 Python 绑定中的 model.words),您将找不到包含空格的多词短语

因此,正如 gojomo 所指出的,生成的向量是合成的、人工的和有噪声的;您可以从查询结果中推断出来。

本质上,fastText 官方嵌入不适合这个任务。 根据我的经验,这与使用的版本/wapper 无关。