问题描述
有没有办法让 gensim 中的 model.wv.most_similar
只返回积极意义的词(即显示同义词但不显示反义词)?
例如,如果我这样做:
import fasttext.util
from gensim.models.fasttext import load_facebook_model
from gensim.models.fasttext import FastTextKeyedVectors
fasttext.util.download_model('en',if_exists='ignore') # English
model = load_facebook_model('cc.en.300.bin')
model.wv.most_similar(positive=['honest'],topn=2000)
('dishonest',0.5542981028556824),
但是,如果我只想要具有积极意义的单词怎么办?
我尝试了以下方法 - 在向量空间中从“诚实”中减去“不”:
import fasttext.util
from gensim.models.fasttext import load_facebook_model
from gensim.models.fasttext import FastTextKeyedVectors
fasttext.util.download_model('en',negative=['not'],topn=2000)
但不知何故,它仍然以某种方式返回“不诚实”。
('dishonest',0.23721608519554138)
('dishonesties',0.16536088287830353)
知道如何以更好的方式做到这一点吗?
解决方法
不幸的是,word2vec 算法训练创建的向量空间不完全符合我们人类对纯同义词的直观理解。
相反,word2vec 的“相似性”意义更广泛——总的来说,反义词往往彼此非常相似:它们用于相似的上下文(word2vec 训练的驱动力),关于相同的主题。
此外,尽管许多可以理解的对比确实与各个方向模糊地相关,但没有普遍的“相反”(或“积极”)方向。因此,用一个词组合 'not'
不会巧妙地颠倒一个词的主导意义,并且 'honest' + 'not'
不能可靠地帮助找到 'dishonest'
的方向。
除非为这项任务找到一些超出基本 word2vec 的额外技术(在其他研究文献中或通过您自己的实验),否则您能做的最好的事情就是使用已知的不需要的答案来进一步完善结果。也就是说,类似于以下内容可能提供略微改进的结果:
word_vecs.most_similar(positive=['honest'],negative=['dishonest'])
(用更多相关词进一步扩展示例,无论您想要与否,也可能有所帮助。)
另请参阅上一个答案中的一些评论和链接以获取更多想法:https://stackoverflow.com/a/44491124/130288