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+ 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.