一、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-hant/n/309670.html