我正在将Gensim与Fasttext Word vectors结合使用来返回相似的单词。
这是我的代码:
import gensim
model = gensim.models.KeyedVectors.load_word2vec_format('cc.it.300.vec')
words = model.most_similar(positive=['sole'],topn=10)
print(words)
这将返回:
[('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”)返回一系列带有点的单词(例如sole。,sole.Ma,ecc ...)。问题出在哪里?为什么most_like返回这个毫无意义的词?
编辑
我尝试使用english word vector,单词“ sun”返回了此结果:
[('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之类的结果?
答案 0 :(得分:1)
也许更大的问题是:为什么Facebook FastText cc.it.300.vec
模型包含这么多无意义的单词? (我之前没有注意到–您是否有可能下载了一个特殊的模型,该模型用额外的分析标记修饰了单词?)
要获得FastText的独特优势-包括为词汇量不大的单词合成合理的矢量(胜过一切)的能力-您可能不希望在普通文字上使用通用load_word2vec_format()
文本.vec
文件,而是在.bin
文件上使用Facebook-FastText特定的加载方法。参见:
https://radimrehurek.com/gensim/models/fasttext.html#gensim.models.fasttext.load_facebook_vectors
(我不确定是否会对这些结果有所帮助,但是如果选择使用FastText,则可能会“完全”使用它来有趣。)
最后,鉴于该培训的来源–来自开放网络的普通抓取文字,其中可能包含很多错别字/垃圾-这些可能是合法的单词样记号,本质上是sole
的错别字,通常在训练数据中足以获取单词向量。 (并且因为它们实际上是'sole'的拼写同义词,所以它们不一定对所有目的都是不好的结果,只是出于您只希望看到“真实”字眼的目的。)
您可能会发现尝试使用restrict_vocab
的{{1}}参数,仅接收所有已知单词向量的前导(最频繁)部分的结果会有所帮助。例如,仅从前50000个单词中获取结果:
most_similar()
为words = model.most_similar(positive=['sole'], topn=10, restrict_vocab=50000)
选择正确的值可能在实践中有助于省略长尾的“垃圾”字词,同时仍然提供您要查找的真实/常见相似字词。