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 更清晰。
我有一个关于 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 更清晰。