首頁 > 後端開發 > Python教學 > 如何在不使用外部函式庫的情況下計算兩個句子之間的餘弦相似度?

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

Mary-Kate Olsen
發布: 2024-11-01 08:20:30
原創
1016 人瀏覽過

How can I calculate cosine similarity between two sentences without using external libraries?

計算句子字串的餘弦相似度

餘弦相似度是兩個向量之間相關性的量測。在文字處理的背景下,它可以用來確定兩個句子之間的相似度。要在沒有外部函式庫的情況下計算兩個字串的餘弦相似度,請按照以下步驟操作:

  1. 對字串進行標記: 將每個字串分解為單獨的單詞,稱為標記。
  2. 建立詞向量:對於每個字串,建立一個字典(向量),其中鍵是唯一單詞,值是這些單字的頻率。
  3. 計算點積: 透過對應元素的乘積求和來計算兩個向量的點積。
  4. 計算幅度: 透過對每個向量的所有元素求平方和求和來找出每個向量的幅度,然後取平方根。
  5. 歸一化:將點積除以幅度的乘積以獲得歸一化餘弦相似度。

一個簡單的Python 實作:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

<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 list(vec1.keys())])

    sum2 = sum([vec2[x] ** 2 for x in list(vec2.keys())])

    denominator = math.sqrt(sum1) * math.sqrt(sum2)

 

    if not denominator:

        return 0.0

    else:

        return float(numerator) / denominator

 

def text_to_vector(text):

    words = WORD.findall(text)

    return Counter(words)</code>

登入後複製

範例用法:

1

2

3

4

5

6

7

8

9

<code class="python">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>

登入後複製

輸出:

1

Cosine: 0.861640436855

登入後複製

輸出:請注意,此實作不包含TF-IDF 加權,這可以提高較大資料集的餘弦相似度。

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板