自然语言处理--计算余弦相似度

余弦距离是大多数自然语言向量表示的相似度计算方法。(计算函数输入为词频向量)

import math

'''
1.余弦相似度的值越接近于 1,两个向量之间的夹角就越小。
对于余弦相似度接近于 1 的 NLP 文档向量,这些文档应该使用了比例相近的相似词。
因此,那些表示向量彼此接近的文档很可能涉及的是同一主题。
2.余弦相似度为 0 表示两个向量之间没有共享任何分量。它们是正交的,在所有维度上都互相
垂直。对于 NLP 中的词频向量,只有当两篇文档没有公共词时才会出现这种情况。因为这些文
档使用完全不同的词,所以它们一定在讨论完全不同的东西。当然,这并不意味着它们一定就有
不同的含义或主题,而只表明它们使用完全不同的词。
3.余弦相似度为−1 表示两个向量是反相似(anti-similar)的,即完全相反,也就是两个向量指
向完全相反的方向。对于简单的词频向量,甚至是归一化的词频(词项频率)向量,
都不可能会发生这种情况。因为词的数目永远不会是负数,所以词频(词项频率)向量
总是处于向量空间的同一象限中。词项频率向量的分量不可能与另一个词项频率向量分量的符号相反,这是因为频率不可能是负数。
'''
# 输入为词频向量
def cosine_sim(vec1, vec2):
    """ Let's convert our dictionaries to lists for easier matching."""
    vec1 = [val for val in vec1.values()]
    vec2 = [val for val in vec2.values()]
    dot_prod = 0
    for i, v in enumerate(vec1):
        dot_prod += v * vec2[i]

    mag_1 = math.sqrt(sum([x**2 for x in vec1]))
    mag_2 = math.sqrt(sum([x**2 for x in vec2]))

    return dot_prod / (mag_1 * mag_2)

猜你喜欢

转载自blog.csdn.net/fgg1234567890/article/details/111827238