Open hailiang-wang opened 6 years ago
http://blog.csdn.net/u013378306/article/details/78038464
# -*- coding: utf-8 -*-
import math
class BM25(object):
def __init__(self, docs):
"""
:param docs: 分好词的list
"""
self.D = len(docs)
self.avgdl = sum([len(doc)+0.0 for doc in docs]) / self.D
self.docs = docs
self.f = []
self.df = {}
self.idf = {}
self.k1 = 1.5
self.b = 0.75
self.init()
def init(self):
for doc in self.docs:
tmp = {}
for word in doc:
if not word in tmp:
tmp[word] = 0
tmp[word] += 1
self.f.append(tmp)
for k, v in tmp.items():
if k not in self.df:
self.df[k] = 0
self.df[k] += 1
for k, v in self.df.items():
self.idf[k] = math.log(self.D-v+0.5)-math.log(v+0.5)
def sim(self, doc, index):
"""
:param doc: 问题
:param index: 训练数据的下标
:return:
"""
score = 0
for word in doc:
if word not in self.f[index]:
continue
d = len(self.docs[index])
score += (self.idf[word]*self.f[index][word]*(self.k1+1)
/ (self.f[index][word]+self.k1*(1-self.b+self.b*d
/ self.avgdl)))
return score
def simall(self, doc):
"""
找出训练数据中所有相似的句子概率
:param doc: 一句话的分词list
:return:
"""
scores = []
for index in range(self.D):
score = self.sim(doc, index)
scores.append(score)
return scores
python
BM25算法介绍 http://events.linuxfoundation.org/sites/events/files/slides/bm25.pdf
计算BM25 https://github.com/SolessChong/qa-demo/blob/master/search-engine/script.py 另一个实现 https://github.com/RaRe-Technologies/gensim/blob/develop/gensim/summarization/bm25.py 讲解:https://stackoverflow.com/questions/40966014/how-to-use-gensim-bm25-ranking-in-python