hailiang-wang / textsum-textrank

自动摘要
0 stars 0 forks source link

Word2vec 加 BM25 #5

Open hailiang-wang opened 6 years ago

hailiang-wang commented 6 years ago

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

hailiang-wang commented 6 years ago

BM25实现

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