python - 理解 gensim word2vec 的 most_similar
问题描述
我不确定我应该如何使用 gensim 的 Word2Vec 的 most_similar 方法。假设您想测试一个久经考验的例子:男人站在国王面前,女人站在 X 面前;找到 X。我认为这是你可以用这种方法做的,但从我得到的结果来看,我认为这不是真的。
文档内容如下:
找出前 N 个最相似的词。正面词对相似度有正面贡献,负面词负面。
该方法计算给定单词的投影权重向量的简单平均值与模型中每个单词的向量之间的余弦相似度。该方法对应于原始 word2vec 实现中的词类比和距离脚本。
然后,我假设most_similar
采用正样本和负样本,并尝试在向量空间中找到尽可能接近正向量和尽可能远离负向量的点。那是对的吗?
此外,是否有一种方法可以让我们将两点之间的关系映射到另一点并获得结果(参见 man-king woman-X 示例)?
解决方案
您可以准确查看most_similar()
其源代码中的功能:
https://github.com/RaRe-Technologies/gensim/blob/develop/gensim/models/keyedvectors.py#L485
这并不是“在向量空间中找到尽可能接近正向量并尽可能远离负向量的点”。相反,如原始 word2vec 论文中所述,它执行向量算术:添加正向量,减去负向量,然后从结果位置,列出最接近该角度的已知向量。
这足以解决man : king :: woman :: ?
- 风格的类比,通过如下调用:
sims = wordvecs.most_similar(positive=['king', 'woman'],
negative=['man'])
(你可以把它想象成,“从'king'-vector开始,添加'woman'-vector,减去'man'-vector,从你结束的地方,报告最接近那个点的排名词向量(同时省略3 个查询向量中的任何一个)。”)
推荐阅读
- c++ - 嵌套 for 循环和 Verlet 列表优化 C++
- java - 如何使用 OBD2 从 Ioniq EV 获取 BMS 数据?
- go - goLang 中的 UDP 数据包创建
- python - 尝试使用 Selenium 访问下拉菜单时出现“webelement 对象不可迭代”
- go - How to configure go mod to have a require version based on environment variable?
- php - PHP Detect Litespeed
- python - 如何在不构建或安装的情况下直接使用 SciPy 源代码?
- r - R中的模式匹配字符向量
- javascript - Prism.js 部分工作!颜色更改但没有突出显示代码
- prolog - 编写 prolog star/1 程序