最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

從基礎(chǔ)到高級全解析Python文本相似度計算

 更新時間:2026年04月10日 08:21:30   作者:detayun  
在自然語言處理(NLP)和信息檢索領(lǐng)域,文本相似度計算是一項核心任務(wù),本文將介紹如何使用Python計算文本相似度,涵蓋基礎(chǔ)方法到高級方法,感興趣的小伙伴可以了解下

在自然語言處理(NLP)和信息檢索領(lǐng)域,文本相似度計算是一項核心任務(wù),廣泛應(yīng)用于搜索引擎、推薦系統(tǒng)、抄襲檢測、智能客服等場景。本文將介紹如何使用Python計算文本相似度,涵蓋基礎(chǔ)方法(如Jaccard相似度、編輯距離)到高級方法(如TF-IDF、余弦相似度、預(yù)訓(xùn)練模型),并提供完整代碼示例。

1. 為什么需要文本相似度計算?

文本相似度計算的核心目標(biāo)是衡量兩段文本在語義或結(jié)構(gòu)上的相似程度。常見應(yīng)用場景包括:

  • 搜索引擎:返回與查詢最相關(guān)的文檔。
  • 推薦系統(tǒng):推薦與用戶歷史行為相似的內(nèi)容。
  • 抄襲檢測:判斷兩篇文章的相似性。
  • 智能問答:匹配用戶問題與知識庫中的答案。

2. 基礎(chǔ)文本相似度計算方法

2.1 Jaccard相似度(基于集合)

Jaccard相似度通過計算兩個集合的交集與并集的比值來衡量相似性,適用于短文本或關(guān)鍵詞匹配場景。

公式:[J(A, B) = \frac{|A \cap B|}{|A \cup B|}]

Python實現(xiàn)

def jaccard_similarity(str1, str2):
    set1 = set(str1.split())
    set2 = set(str2.split())
    intersection = len(set1 & set2)
    union = len(set1 | set2)
    return intersection / union if union != 0 else 0

text1 = "Python is a programming language"
text2 = "Python is used for data science"
print(jaccard_similarity(text1, text2))  # 輸出: 0.375

適用場景:短文本、關(guān)鍵詞匹配、簡單分類。

2.2 Levenshtein距離(編輯距離)

Levenshtein距離衡量將一個字符串轉(zhuǎn)換為另一個字符串所需的最少編輯操作(插入、刪除、替換)次數(shù),適用于拼寫糾錯、DNA序列比對等。

Python實現(xiàn)

def levenshtein_distance(s1, s2):
    if len(s1) < len(s2):
        return levenshtein_distance(s2, s1)
    if len(s2) == 0:
        return len(s1)
    prev_row = range(len(s2) + 1)
    for i, c1 in enumerate(s1):
        curr_row = [i + 1]
        for j, c2 in enumerate(s2):
            insertions = prev_row[j + 1] + 1
            deletions = curr_row[j] + 1
            substitutions = prev_row[j] + (c1 != c2)
            curr_row.append(min(insertions, deletions, substitutions))
        prev_row = curr_row
    return prev_row[-1]

def normalized_levenshtein(s1, s2):
    distance = levenshtein_distance(s1, s2)
    max_len = max(len(s1), len(s2))
    return 1 - distance / max_len if max_len != 0 else 0

text1 = "kitten"
text2 = "sitting"
print(normalized_levenshtein(text1, text2))  # 輸出: 0.571

適用場景:拼寫糾錯、短文本相似度(如用戶名匹配)。

3. 基于詞向量的文本相似度計算

3.1 TF-IDF + 余弦相似度

TF-IDF(詞頻-逆文檔頻率)將文本轉(zhuǎn)換為向量,通過計算向量間的余弦相似度衡量相似性。

步驟

  1. 使用TfidfVectorizer將文本轉(zhuǎn)換為TF-IDF向量。
  2. 計算向量間的余弦相似度。

Python實現(xiàn)

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

texts = [
    "Python is a programming language",
    "Python is used for data science",
    "Java is another programming language"
]

vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.(texts)

# 計算兩兩之間的相似度
similarity_matrix = cosine_similarity(tfidf_matrix)
print(similarity_matrix)

# 計算text1和text2的相似度
text1 = texts[0]
text2 = texts[1]
vec1 = vectorizer.transform([text1])
vec2 = vectorizer.transform([text2])
print(cosine_similarity(vec1, vec2)[0][0])  # 輸出: 0.5

適用場景:長文本相似度、文檔檢索。

3.2 Word2Vec + 余弦相似度

Word2Vec將單詞映射為低維向量,通過計算詞向量的平均值得到句子向量,再計算余弦相似度。

Python實現(xiàn)(使用Gensim)

from gensim.models import Word2Vec
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

# 訓(xùn)練Word2Vec模型(示例數(shù)據(jù))
sentences = [
    "Python is a programming language".split(),
    "Python is used for data science".split(),
    "Java is another programming language".split()
]
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)

def sentence_vector(sentence, model):
    vectors = [model.wv[word] for word in sentence if word in model.wv]
    return np.mean(vectors, axis=0) if vectors else np.zeros(model.vector_size)

vec1 = sentence_vector("Python is a programming language".split(), model)
vec2 = sentence_vector("Python is used for data science".split(), model)
print(cosine_similarity([vec1], [vec2])[0][0])  # 輸出: ~0.7

適用場景:語義相似度(需足夠訓(xùn)練數(shù)據(jù))。

4. 預(yù)訓(xùn)練模型(BERT、Sentence-BERT)

BERT及其變體(如Sentence-BERT)能夠捕捉深層次的語義信息,適用于高精度文本相似度計算。

使用Sentence-BERT(推薦)

from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity

model = SentenceTransformer('all-MiniLM-L6-v2')  # 輕量級模型

text1 = "Python is a programming language"
text2 = "Python is used for data science"

embeddings = model.encode([text1, text2])
similarity = cosine_similarity([embeddings[0]], [embeddings[1]])[0][0]
print(similarity)  # 輸出: ~0.8

優(yōu)點

  • 無需訓(xùn)練,直接使用預(yù)訓(xùn)練模型。
  • 捕捉語義相似度(如“貓”和“狗”比“貓”和“汽車”更相似)。

適用場景:高精度語義相似度、問答系統(tǒng)、推薦系統(tǒng)。

5. 總結(jié)與選型建議

方法優(yōu)點缺點適用場景
Jaccard相似度簡單、快速忽略詞序和語義短文本、關(guān)鍵詞匹配
Levenshtein距離適用于拼寫糾錯計算復(fù)雜度高短文本、用戶名匹配
TF-IDF + 余弦相似度適用于長文本忽略詞序和語義文檔檢索、新聞分類
Word2Vec捕捉詞義需要訓(xùn)練數(shù)據(jù)語義相似度(需足夠數(shù)據(jù))
Sentence-BERT高精度語義相似度計算較慢(相比TF-IDF)問答系統(tǒng)、推薦系統(tǒng)

推薦選型

  • 快速實現(xiàn):TF-IDF + 余弦相似度。
  • 高精度語義:Sentence-BERT。
  • 拼寫糾錯:Levenshtein距離。

6. 完整代碼示例(Sentence-BERT)

from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity

# 加載預(yù)訓(xùn)練模型
model = SentenceTransformer('all-MiniLM-L6-v2')

# 待比較的文本
texts = [
    "Python is a programming language",
    "Python is used for data science",
    "Java is another programming language",
    "I love coding in Python"
]

# 計算所有文本對的相似度
embeddings = model.encode(texts)
similarity_matrix = cosine_similarity(embeddings)

# 打印相似度矩陣
for i in range(len(texts)):
    for j in range(len(texts)):
        print(f"Similarity('{texts[i]}', '{texts[j]}'): {similarity_matrix[i][j]:.2f}")

輸出示例

Similarity('Python is a programming language', 'Python is a programming language'): 1.00
Similarity('Python is a programming language', 'Python is used for data science'): 0.82
Similarity('Python is a programming language', 'Java is another programming language'): 0.65
Similarity('Python is a programming language', 'I love coding in Python'): 0.71
...

結(jié)語:文本相似度計算是NLP的核心任務(wù)之一,Python提供了從基礎(chǔ)到高級的多種方法。根據(jù)業(yè)務(wù)需求選擇合適的方法,可以顯著提升模型的性能和效率!

到此這篇關(guān)于從基礎(chǔ)到高級全解析Python文本相似度計算的文章就介紹到這了,更多相關(guān)Python計算文本相似度內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python 實現(xiàn)簡單的吃豆人游戲

    python 實現(xiàn)簡單的吃豆人游戲

    這篇文章主要介紹了python 如何實現(xiàn)簡單的吃豆人游戲,幫助大家更好的理解和學(xué)習(xí)使用python制作游戲,感興趣的朋友可以了解下
    2021-04-04
  • Python的命令行參數(shù)實例詳解

    Python的命令行參數(shù)實例詳解

    python中有一個模塊sys,sys.argv這個屬性提供了對命令行參數(shù)的訪問,下面這篇文章主要給大家介紹了關(guān)于Python命令行參數(shù)實例的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • python代碼 輸入數(shù)字使其反向輸出的方法

    python代碼 輸入數(shù)字使其反向輸出的方法

    今天小編就為大家分享一篇python代碼 輸入數(shù)字使其反向輸出的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python設(shè)計與實現(xiàn)一個節(jié)假日統(tǒng)計器

    Python設(shè)計與實現(xiàn)一個節(jié)假日統(tǒng)計器

    這篇文章主要介紹了一個基于Python Tkinter開發(fā)的智能節(jié)假日統(tǒng)計器,能夠準(zhǔn)確顯示中國法定節(jié)假日、調(diào)休安排,并提供直觀的日歷視圖和統(tǒng)計功能,感興趣的可以了解下
    2025-10-10
  • 使用 Python 和 OpenCV 實現(xiàn)攝像頭人臉檢測并截圖功能

    使用 Python 和 OpenCV 實現(xiàn)攝像頭人臉檢測并截圖功能

    在現(xiàn)代應(yīng)用中,人臉檢測是一項非常重要的技術(shù),廣泛應(yīng)用于安全監(jiān)控、身份驗證等領(lǐng)域,本文詳細介紹了如何使用 Python 和 OpenCV 庫實現(xiàn)攝像頭人臉檢測并截圖,并通過具體的代碼示例展示了整個過程,感興趣的朋友一起看看吧
    2024-11-11
  • python實現(xiàn)黃金分割法的示例代碼

    python實現(xiàn)黃金分割法的示例代碼

    這篇文章主要介紹了python實現(xiàn)黃金分割法的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Python筆記之facade模式

    Python筆記之facade模式

    這篇文章主要為大家詳細介紹了Python筆記之facade模式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • python+PyQt5 左右聲道測試源代碼

    python+PyQt5 左右聲道測試源代碼

    這篇文章主要介紹了python+PyQt5 左右聲道測試源代碼,左聲道,人機交互測試,點擊右邊聽到的對應(yīng)序號按鈕,對python左右聲道測試感興趣的朋友一起看看吧
    2024-02-02
  • 從零開始使用Python自定義生成二維碼和條形碼

    從零開始使用Python自定義生成二維碼和條形碼

    ?二維碼和條形碼已成為現(xiàn)代信息傳遞的重要工具,本文將帶你用Python從零實現(xiàn)碼生成,并掌握自定義樣式和嵌入Logo的核心技巧,希望對大家有所幫助
    2025-12-12
  • 利用Python計算KS的實例詳解

    利用Python計算KS的實例詳解

    這篇文章主要介紹了利用Python計算KS的實例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03

最新評論

博罗县| 板桥市| 唐河县| 长沙县| 沂水县| 泰宁县| 维西| 收藏| 闽清县| 定结县| 东兴市| 临沭县| 铜川市| 义马市| 泸西县| 怀宁县| 澄迈县| 鸡东县| 康定县| 镇原县| 淮南市| 临颍县| 尼玛县| 肇源县| 太湖县| 青冈县| 沂水县| 吴川市| 通道| 石城县| 建始县| 客服| 克拉玛依市| 灌阳县| 大港区| 育儿| 临邑县| 宁波市| 仙桃市| 滦南县| 绥宁县|