Gensim most_similar() 和 Fasttext 词向量 return useless/meaningless 个词

Gensim most_similar() with Fasttext word vectors return useless/meaningless words

我将 Gensim 与 Fasttext Word vectors 一起用于 return 个相似词。

这是我的代码:

import gensim

model = gensim.models.KeyedVectors.load_word2vec_format('cc.it.300.vec')

words = model.most_similar(positive=['sole'],topn=10)

print(words)

这将 return:

[('sole.', 0.6860659122467041), ('sole.Ma', 0.6750558614730835), ('sole.Il', 0.6727924942970276), ('sole.E', 0.6680260896682739), ('sole.A', 0.6419174075126648), ('sole.È', 0.6401025652885437), ('splende', 0.6336565613746643), ('sole.La', 0.6049465537071228), ('sole.I', 0.5922051668167114), ('sole.Un', 0.5904430150985718)]

问题是 "sole" ("sun", in english) return 一系列带点的单词 (like sole., sole.Ma, ecc ...)。问题出在哪里?为什么most_similarreturn这个无意义的词?

编辑

我尝试使用 english word vector 和单词 "sun" return 这个:

[('sunlight', 0.6970556974411011), ('sunshine', 0.6911839246749878), ('sun.', 0.6835992336273193), ('sun-', 0.6780728101730347), ('suns', 0.6730450391769409), ('moon', 0.6499731540679932), ('solar', 0.6437565088272095), ('rays', 0.6423950791358948), ('shade', 0.6366724371910095), ('sunrays', 0.6306195259094238)] 

是否无法重现像 relatedwords.org 这样的结果?

也许更大的问题是:为什么 Facebook FastText cc.it.300.vec 模型包含这么多无意义的词? (我之前没有注意到这一点——您是否有可能下载了一个用额外的分析标记装饰单词的特殊模型?)

为了获得 FastText 的独特优势——包括为词汇外的词合成合理(总比没有好)的向量的能力——你可能不想在纯文本 .vec 文件,而是 .bin 文件上的 Facebook-FastText 特定加载方法。参见:

https://radimrehurek.com/gensim/models/fasttext.html#gensim.models.fasttext.load_facebook_vectors

(我不确定这是否会对这些结果有所帮助,但如果选择使用 FastText,您可能会对使用它感兴趣 "fully"。)

最后,鉴于此训练的来源——来自开放网络的常见抓取文本,其中可能包含大量 typos/junk——这些可能是合法的类似词的标记,本质上是 [=15= 的拼写错误],它们在训练数据中出现的频率足以获得词向量。 (而且因为它们确实是 'sole' 的拼写错误同义词,它们不一定对所有目的都是不好的结果,只是为了您只看到 "real-ish" 个单词的预期目的。)

您可能会发现尝试使用 most_similar()restrict_vocab 参数来仅接收来自所有已知词向量的前导(最频繁)部分的结果很有帮助。例如,只从前 50000 个单词中获取结果:

words = model.most_similar(positive=['sole'], topn=10, restrict_vocab=50000)

restrict_vocab 选择正确的值可能有助于在实践中省略长尾 'junk' 词,同时仍然提供您寻找的 real/common 相似词。