Python | 使用余弦相似度衡量两句话之间的相似性


介绍

自然语言处理用于查找句子、单词或文本之间的语义相似性,在现代用例中非常常见。计算文本之间相似性的方法有很多种。一种流行的方法是余弦相似度。它用于查找两个非零向量的相似性,并使用点积公式符号测量两个向量之间角度的余弦值。

通过本文,让我们简要探讨余弦相似度,并了解其在 Python 中的实现。

余弦相似度——查找两个文本之间的相似性

余弦相似度定义为空间中两个向量之间角度的余弦值。句子或文本可以表示为向量。两个句子之间的余弦相似度将取决于这两个向量之间的余弦角。角度值越大,余弦值和相似性越小,反之亦然。

查找余弦相似度的步骤

  • 首先使用正则表达式或 Nltk 库将两个句子的文本标记成单词。

  • 分别计算每个句子中每个单词的频率。

  • 在计算相似性时,要考虑两个句子中相似单词的频率值。

  • 根据余弦相似度公式,计算分子(两个向量的点积)和分母(欧几里得距离的乘积)。

Python 实现

在这个实现中,我们使用了两个参考句子,它们被转换成向量形式。然后使用**cosine_similarity**实用程序函数计算这两个向量之间的余弦相似度。

## cosine similarity
import math
import re
from collections import Counter as Count

word = re.compile(r"\w+")

sentence_1 = "The dog jumped into the well."
sentence_2 = "The well dries up in summer season."

def cosine_similarity(vector_1, vector_2):
    inter = set(vector_1.keys()) & set(vector_1.keys())
    numer = sum([vector_1[i] * vector_2[i] for i in inter])

    s_1 = sum([vector_1[i] ** 2 for i in list(vector_1.keys())])
    s_2 = sum([vector_1[i] ** 2 for i in list(vector_1.keys())])
    deno = math.sqrt(s_1) * math.sqrt(s_2)

    if not deno:
        return 0.0
    else:
        return float(numer) / deno

def generate_vectors(sent):
    w = word.findall(sent)
    return Count(w)

vec_1 = generate_vectors(sentence_1)
vec_2 = generate_vectors(sentence_2)

sim = cosine_similarity(vec_1, vec_2)

print("Similarity(cosine):", sim)

输出

Similarity(cosine): 0.33333333333333337

结论

余弦相似度是衡量两个文本句子之间相似性的一种非常流行且方便的方法,广泛用于自然语言和机器学习用例中。因为它取决于向量表示中两个句子之间角度的余弦值,所以空间中向量的排列和方向在相似性度量中起着重要作用,这与它们之间的角度直接相关。

更新于:2023年9月26日

1K+ 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告