使用BM25演算法進行文本相似度計算

一、BM25演算法簡介

BM25演算法是一種用於文本檢索的演算法,由Robertson和他的同事在1995年提出。該演算法的核心思想是通過計算文檔與查詢之間的相似性得出文檔的排名,從而實現文本檢索。

BM25演算法的主要公式如下:

score(D, Q) = ∑(t∈Q) IDFt · (f (t, D) · (k1 + 1)) / (f (t, D) + k1 · (1 - b + b · |D| / avgdl))

其中,D代表文檔,Q代表查詢,IDFt代表辭彙t的逆文檔頻率,f(t,D)代表辭彙t在文檔D中的頻率,k1和b是可調節的參數,avgdl是所有文檔的平均長度。

二、BM25演算法優劣

相較於傳統的向量空間模型,BM25演算法具有以下優勢:

1、能夠自適應地調整文檔長度的影響,適用於不同長度的文檔;

2、能夠適應不同的語料庫,無需手動進行停用詞過濾等操作;

3、能夠針對性地計算詞重要性,增加了檢索的準確性。

但BM25演算法也存在以下劣勢:

1、需要計算逆文檔頻率,因此在大規模語料庫中計算有一定複雜度;

2、儘管有很好的表現,但其實現並不簡單,需要涉及到許多優化。

三、BM25演算法應用

1、針對於信息檢索場景,BM25演算法在多個開源工具和框架中有著廣泛應用,如Lucene、Elasticsearch等;

2、BM25演算法也可以用於推薦系統中的應用,通過計算用戶特徵和商品特徵的相似度,得出不同商品推薦的相對優先順序;

3、BM25演算法還可以用於文本分類中的特徵提取,通過計算每個詞對於類別的重要性,得到更優的特徵表達。

四、BM25演算法實現示例

import math
from collections import Counter

class BM25:
    def __init__(self, documents):
        self.documents = documents
        self.N = len(documents)
        self.avgdl = sum([len(doc) for doc in documents]) / self.N
        self.k1 = 1.5
        self.b = 0.75
        self.idf = {}
        self.ranking = []
        self.build()

    def build(self):
        f = {}
        for doc in self.documents:
            tokens = doc.split()
            df = Counter(tokens)
            for token in tokens:
                if token not in f:
                    f[token] = 0
                f[token] += df[token]
            for word, count in df.items():
                self.idf[word] = math.log((self.N - f[word] + 0.5) / (f[word] + 0.5))

    def score(self, query, document):
        tokens = document.split()
        score = 0
        for token in query.split():
            if token not in self.idf:
                continue
            f = tokens.count(token)
            score += self.idf[token] * (f * (self.k1 + 1)) / (f + self.k1 * (1 - self.b + self.b * len(tokens) / self.avgdl))
        return score

    def search(self, query):
        for i, doc in enumerate(self.documents):
            score = self.score(query, doc)
            self.ranking.append((i, score))
        self.ranking = sorted(self.ranking, key=lambda x: x[1], reverse=True)
        return [idx for idx, _ in self.ranking]

documents = [
    'The quick brown fox jumps over the lazy dog',
    'A brown fox jumps over a lazy dog',
    'The brown cat jumps over the lazy dog',
    'The lazy dog jumps over the brown fox'
]

bm25 = BM25(documents)
ranking = bm25.search('brown fox')
for idx in ranking:
    print(documents[idx])

五、總結

BM25演算法是一種有效的文本相似度計算演算法,它能夠適應不同語料庫和文檔長度,以及計算各個辭彙的重要性。在信息檢索、推薦系統及文本分類等領域中均有著廣泛的應用。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/309670.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-04 19:31
下一篇 2025-01-04 19:31

相關推薦

  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python實現爬樓梯演算法

    本文介紹使用Python實現爬樓梯演算法,該演算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • Harris角點檢測演算法原理與實現

    本文將從多個方面對Harris角點檢測演算法進行詳細的闡述,包括演算法原理、實現步驟、代碼實現等。 一、Harris角點檢測演算法原理 Harris角點檢測演算法是一種經典的計算機視覺演算法…

    編程 2025-04-29
  • 數據結構與演算法基礎青島大學PPT解析

    本文將從多個方面對數據結構與演算法基礎青島大學PPT進行詳細的闡述,包括數據類型、集合類型、排序演算法、字元串匹配和動態規劃等內容。通過對這些內容的解析,讀者可以更好地了解數據結構與算…

    編程 2025-04-29
  • 瘦臉演算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉演算法 Python 實現的原理和方法,包括該演算法的意義、流程、代碼實現、優化等內容。 一、演算法意義 隨著科技的發展,瘦臉演算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29
  • 神經網路BP演算法原理

    本文將從多個方面對神經網路BP演算法原理進行詳細闡述,並給出完整的代碼示例。 一、BP演算法簡介 BP演算法是一種常用的神經網路訓練演算法,其全稱為反向傳播演算法。BP演算法的基本思想是通過正…

    編程 2025-04-29
  • 粒子群演算法Python的介紹和實現

    本文將介紹粒子群演算法的原理和Python實現方法,將從以下幾個方面進行詳細闡述。 一、粒子群演算法的原理 粒子群演算法(Particle Swarm Optimization, PSO…

    編程 2025-04-29
  • Python文本居中設置

    在Python編程中,有時需要將文本進行居中設置,這個過程需要用到字元串的相關函數。本文將從多個方面對Python文本居中設置作詳細闡述,幫助讀者在實際編程中運用該功能。 一、字元…

    編程 2025-04-28
  • 文本數據挖掘與Python應用PDF

    本文將介紹如何使用Python進行文本數據挖掘,並將著重介紹如何應用PDF文件進行數據挖掘。 一、Python與文本數據挖掘 Python是一種高級編程語言,具有簡單易學、代碼可讀…

    編程 2025-04-28

發表回復

登錄後才能評論