Bak*_*war 6 python apache-spark pyspark
我使用了 spark 的 word2vec 算法来计算文本的文档向量。
然后我使用findSynonyms模型对象的功能来获取几个单词的同义词。
我看到这样的事情:
w2vmodel.findSynonyms('science',4).show(5)
+------------+------------------+
| word| similarity|
+------------+------------------+
| physics| 1.714908638833209|
| fiction|1.5189824643358183|
|neuroscience|1.4968051528391833|
| psychology| 1.458865636374223|
+------------+------------------+
Run Code Online (Sandbox Code Playgroud)
我不明白为什么余弦相似度被计算为大于 1。余弦相似度应该在 0 和 1 或 max -1 和 +1 之间(取负角)。
为什么这里大于1?这里出了什么问题?
您应该对从 获得的词向量进行归一化word2vec,否则您将获得无界点积或余弦相似度值。
来自Levy 等人,2015 年(实际上,大多数关于词嵌入的文献):
向量在用于相似性计算之前被归一化为单位长度,使得余弦相似性和点积等价。
如何进行标准化?
你可以做如下的事情。
import numpy as np
def normalize(word_vec):
norm=np.linalg.norm(word_vec)
if norm == 0:
return word_vec
return word_vec/norm
Run Code Online (Sandbox Code Playgroud)
参考
更新:为什么word2vec的余弦相似度大于1?
根据这个答案,在 word2vec 的 Spark 实现中,findSynonyms实际上并不返回余弦距离,而是返回余弦距离乘以查询向量的范数。
排序和相对值与真实余弦距离一致,但实际值均经过缩放。
| 归档时间: |
|
| 查看次数: |
7793 次 |
| 最近记录: |