Word2Vec 是如何工作的? Python

How Word2Vec works? Python

我有一个关于 gensim Word2Vec 的问题,文档对我没有帮助。

例如,在我的文本块中,我有一些句子:

<Word1> <Word2> <Word3>
<Word1> <Word2> <Word3>
<Word1> <Word2> <Word3>
         ...

一段时间后我有了一个新句子,比如:

<Word1> <Word2> <Word3> <Word4>

如何检测这种情况? (当然字典里也有Word4)

我的解决方案: 1).我试图为每个词找到最相似的词,然后看看 - 下一个词是否在其中 - 好的,否则 - 我可以找到 Word4。我的意思是我会做:

model.most_similar('<Word_i>')
or
model.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 return 的作用,希望它会有所帮助。

那么,让我们考虑一下有两个句子的情况:<Word1> <Word2> <Word3><Word1> <Word4> <Word3>。在创建 word2vec 模型时,我们在目标(当前)单词的左右两侧取相同数量的单词,并构造如下元组:(target_word, proximity_word)。假设我们要观察目标词是中间词时的情况。因此,对于 sentence1,我们将得到 (<Word2>, <Word1>)(<Word2>, <Word3>),而对于 sentence2,我们将得到 (<Word4>, <Word1>)(<Word4>, <Word3>)。通过这种方式,我们告诉模型 <Word1><Word3> 在 .同样,<Word1><Word3><Word4> 的上下文中。那是什么意思?我们可以得出结论,<Word2><Word4> 在某种程度上是相似的。

因此,如果您调用 most_similar(<Word2>),您将不会得到 or but,因为单词 2 和 4 出现在相同的上下文中。也就是说,你不能指望如果你有句子 <Word1> <Word2> <Word3> <Word4> 并调用 most_similar(<Word3) 来获得 <Word4> 的向量。相反,您会得到一些出现在单词 1、2 和 4 上下文中的单词(此上下文 window 取决于我们在训练前指定的大小)。我希望这对您有所帮助并使 word2vec 更清晰。