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 相似词。
我将 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 相似词。