我对gensim Word2Vec 有一个问题,文档没有帮助到我。
例如,在我的文本块中有一些句子如下:
<Word1> <Word2> <Word3><Word1> <Word2> <Word3><Word1> <Word2> <Word3> ...
然后在某个时候我有一个新的句子如下:
<Word1> <Word2> <Word3> <Word4>
我如何检测这种情况?(当然Word4也在词典中)
我的解决方案:1)。我尝试为每个词查找最相似的词,看看 – 如果下一个词在其中 – 那就OK,否则 – 我可以找到Word4。我的意思是我会这样做:
model.most_similar('<Word_i>')ormodel.similar_by_vector('<Word_i>')
在答案列表的顶部我会得到Word_i+1。但这行不通!因为我以为句子中的词在训练后会有相当相似的坐标,并且在顶部列表中Word_i+1会是Word_i的。但这是错的。当我检查这个解决方案并通过所有文本语料库进行训练时,我发现Word_2并没有出现在Word_1的顶部列表中!我的解释是,附近的词并没有相当相似的坐标,但具有上下文接近性的词有相当相似的坐标,这不是一回事..
2)。所以我的第二个解决方案是使用 doesnt_match(),它接受一个词列表,并报告与所有词的平均值最远的一个词。
print(model.doesnt_match('<Word1> <Word2> <Word3> <Word4>'.split()))
是的 – 在这种情况下答案将是Word4!(所以我检测到了这个词)但如果我这样做:
print(model.doesnt_match('<Word1> <Word2> <Word3>'.split()))
答案将是Word2(例如)。如果我再次探索Word1和Word3的顶部词,我不会在这些列表中看到Word2,但这个句子(Word1 Word2 Word3)是正常的。
那么我如何检测它呢?
回答:
我不确定我是否理解这里的问题,但我会尝试解释word2vec的概念以及most_similar
返回什么,希望这会有所帮助。
那么,让我们考虑有两个句子的情况:<Word1> <Word2> <Word3>
和 <Word1> <Word4> <Word3>
。在创建word2vec模型时,我们会取目标(当前)词的左右相同数量的词,并构造像这样的元组:(target_word, proximity_word)。假设我们想要观察目标词是中间词的情况。所以对于句子1,我们会得到(<Word2>, <Word1>)
和 (<Word2>, <Word3>)
,对于句子2,我们会得到(<Word4>, <Word1>)
和 (<Word4>, <Word3>)
。这样我们告诉模型<Word1>
和 <Word3>
是在<Word2>
的上下文中。同样,<Word1>
和 <Word3>
是在<Word4>
的上下文中。这意味着什么呢?我们可以得出结论,<Word2>
和 <Word4>
在某种程度上是相似的。
所以如果你调用most_similar(<Word2>)
,你不会得到或但因为词2和4出现在相同的上下文中。也就是说,你不能期望如果你有句子<Word1> <Word2> <Word3> <Word4>
并调用most_similar(<Word3)
就能得到<Word4>
的向量。相反,你会得到某个出现在词1、2和4的上下文中的词(这个上下文窗口取决于我们在训练前指定的大小)。我希望这对你有帮助,并使word2vec更加清晰。