文本相似度-bm25算法原理及实现

import mathimport jiebafrom utils import utils# 试验文档text=语义处置是软件工程应用领域与人工智慧应用领域中的两个关键路径。它自然科学研究能同时实现人与计算机系统间用语义展开有效率通讯的各式各样方式论和方式。语义处置是两门融社会学、软件工程、微积分于多功能的自然科学。因而,而此应用领域的自然科学研究将牵涉语义,即现代人日常生活采用的词汇,因而它与社会学的自然科学研究有著紧密的联络,但又有关键的差别。语义处置并并非通常地自然科学研究语义,而是研发能有效率地同时实现语义通讯的电脑系统,不光是当中的软件产品。因而它是软件工程的一小部分。classBM25(object):def__init__(self,docs):self.D=len(docs)self.avgdl=sum([len(doc)+0.0fordocindocs])/self.Dself.docs=docsself.f=[]# 列表的每两个元素是两个dict,dict存储着两个文档中每个词的出现次数self.df={}# 存储每个词及出现了该词的文档数量self.idf={}# 存储每个词的idf值self.k1=1.5self.b=0.75self.init()definit(self):fordocinself.docs:tmp={}forwordindoc:tmp[word]=tmp.get(word,0)+1# 存储每个文档中每个词的出现次数self.f.append(tmp)forkintmp.keys():self.df[k]=self.df.get(k,0)+1fork,vinself.df.items():self.idf[k]=math.log(self.D-v+0.5)-math.log(v+0.5)defsim(self,doc,index):score=0forwordindoc:ifwordnotinself.f[index]:continued=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)))returnscoredefsimall(self,doc):scores=[]forindexinrange(self.D):score=self.sim(doc,index)scores.append(score)returnscoresif__name__==__main__:sents=utils.get_sentences(text)doc=[]forsentinsents: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([语义,软件工程,应用领域,人工智慧,应用领域]))

防走丢!请关注公众号:万项汇

版权声明:
作者:wxfb
链接:https://www.28php.com/6529.html
文章版权归作者所有,未经允许请勿转载。
THE END
分享
二维码
< <上一篇
下一篇>>