首頁  >  文章  >  後端開發  >  在沒有外部函式庫的情況下,如何計算兩個句子之間的餘弦相似度?

在沒有外部函式庫的情況下,如何計算兩個句子之間的餘弦相似度?

DDD
DDD原創
2024-11-01 13:14:02753瀏覽

How Can You Calculate Cosine Similarity Between Two Sentences Without External Libraries?

在沒有外部庫的情況下計算兩個句子字串之間的餘弦相似度

在自然語言處理的背景下,計算餘弦相似度對於測量文件之間的文字相似度至關重要。雖然 tf-idf-cosine 等外部函式庫可以促進此任務,但也可以在不依賴此類依賴項的情況下手動計算餘弦相似度。

餘弦相似度概述

餘弦相似性量化了表示文本的兩個向量之間的角度。餘弦相似度越高,角度越小,表示文字之間的相似度越大。它是使用歸一化向量除以其振幅的點積來計算的。

手動實現餘弦相似度

要手動計算餘弦相似度,我們定義以下步驟:

  1. 標記化
  2. 標記化:將句子分割成單獨的單字。
  3. 向量化:為每個句子中的每個單字建立一個計數器,它代表它的頻率(術語頻率)。
  4. 歸一化:將每個元素除以其元素平方和的平方根(L2 範數)來歸一化向量。

餘弦計算:計算歸一化向量的點積並除以它們的大小。

代碼實現
<code class="python">import math
import re
from collections import Counter

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

def get_cosine(vec1, vec2):
    intersection = set(vec1.keys()) & set(vec2.keys())
    numerator = sum([vec1[x] * vec2[x] for x in intersection])
    
    sum1 = sum([vec1[x] ** 2 for x in vec1])
    sum2 = sum([vec2[x] ** 2 for x in vec2])
    denominator = math.sqrt(sum1) * math.sqrt(sum2)
    
    if not denominator:
        return 0.0
    else:
        return numerator / denominator

def text_to_vector(text):
    words = WORD.findall(text)
    return Counter(words)

text1 = "This is a foo bar sentence ."
text2 = "This sentence is similar to a foo bar sentence ."

vector1 = text_to_vector(text1)
vector2 = text_to_vector(text2)

cosine = get_cosine(vector1, vector2)

print("Cosine:", cosine)</code>

下面是手動餘弦相似度計算的Python 實現:

結果
Cosine: 0.861640436855

此程式碼執行如下:

此值表示兩個句子之間的高餘弦相似度,確認它們在文字上相似。

進一步的考慮因素
  • 雖然此手動方法提供了基本的實現,但可以通過以下方式增強: :
  • 結合詞幹或詞形還原以改進單字規範化。
實現更複雜的標記化方案。 加入 TF-IDF 等權重以實現更準確的相似性計算。

以上是在沒有外部函式庫的情況下,如何計算兩個句子之間的餘弦相似度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn