• BM25算法的python实现


    原作者:https://blog.csdn.net/u011734144/article/details/79559295

    转的

    import math
    import jieba
    from utils import utils
     
    # 测试文本
    text = '''
    自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。
    它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。
    自然语言处理是一门融语言学、计算机科学、数学于一体的科学。
    因此,这一领域的研究将涉及自然语言,即人们日常使用的语言,
    所以它与语言学的研究有着密切的联系,但又有重要的区别。
    自然语言处理并不是一般地研究自然语言,
    而在于研制能有效地实现自然语言通信的计算机系统,
    特别是其中的软件系统。因而它是计算机科学的一部分。
    '''
     
    class BM25(object):
     
        def __init__(self, docs):
            self.D = len(docs)
            self.avgdl = sum([len(doc)+0.0 for doc in docs]) / self.D
            self.docs = docs
            self.f = []  # 列表的每一个元素是一个dict,dict存储着一个文档中每个词的出现次数
            self.df = {} # 存储每个词及出现了该词的文档数量
            self.idf = {} # 存储每个词的idf值
            self.k1 = 1.5
            self.b = 0.75
            self.init()
     
        def init(self):
            for doc in self.docs:
                tmp = {}
                for word in doc:
                    tmp[word] = tmp.get(word, 0) + 1  # 存储每个文档中每个词的出现次数
                self.f.append(tmp)
                for k in tmp.keys():
                    self.df[k] = self.df.get(k, 0) + 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):
            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):
            scores = []
            for index in range(self.D):
                score = self.sim(doc, index)
                scores.append(score)
            return scores
     
    if __name__ == '__main__':
        sents = utils.get_sentences(text)
        doc = []
        for sent in sents:
            words = list(jieba.cut(sent))
            words = utils.filter_stop(words)
            doc.append(words)
        print(doc)
        s = BM25(doc)
        print(s.f)
        print(s.idf)
        print(s.simall(['自然语言', '计算机科学', '领域', '人工智能', '领域']))
    

      

  • 相关阅读:
    继承
    类和对象
    Scanner类
    面向对象思想
    final关键字
    The difference between text mode and binary mode with file streams
    Linux下常见权限操作相关命令
    Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext
    手动运行jar包,指定配置文件
    jdk 1.8.0_131 Class JavaLaunchHelper is implemented
  • 原文地址:https://www.cnblogs.com/liangzp/p/9679145.html
Copyright © 2020-2023  润新知