一、bm25的应用和基础
参考:BM25算法 原理简介_小白的进阶的博客-CSDN博客_bm25
医学领域,BM25算法的应用,文档分类,相似度识别以及疾病、手术等实体的相似度匹配。文档的处理相对简单,可以直接调用相关算法包,实体单词的相似度匹配需要对文本做相关的处理。对比研究,在文档中,表示特征的主要是单词,而在实体名词(疾病、手术、药品名称)中,表示特征的是字或者由n-gram切分的元素,当用字表示特征时,文本的语义会丢失,所以我建议用字和n-gram(n>=2)分词元素作为特征。
BM25算法相关性分数的构成:
分为两个类别,一个是计算文档与文档的相似度,另一个是计算词与词的相似度,如果计算的是词(或称为短文本)与词之间的相似度,那么就要用n-gram切词,进而以每个元素为单位进行计算。
以文档相似度为例:
相关性分数公式如下:
里面包含三部分计算:
(1)元素的权重,计算tf-idf,文档的元素就是词,短文本的元素为字或n-gram元素:
其中N表示索引中全部文档数,为包含了的文档的个数。依据IDF的作用,对于某个,包含的文档数越多,说明重要性越小,或者区分度越低,IDF越小,因此IDF可以用来刻画与文档的相似性。
(2)单词和文档的相关性:
其中,是单词t在文档d中的词频,是文档d的长度,是所有文档的平均长度,变量是一个正的参数,用来标准化文章词频的范围,当=0,就是一个二元模型(binary model)(没有词频),一个更大的值对应使用更原始的词频信息。b是另一个可调参数(0
(3)单词和查询的相关性:
这里表示单词t在query中的词频,是一个可调正参数,来矫正query中的词频范围。
最终相似度公式:
二、相似度分类实例(疾病相似度分类)
现在bm25实现的开源包有很多,在这里我是用gensim实现。
gensim包的下载配置:清华镜像源
pip install --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple ark-nlp
基本使用方法,以短文本分类为实例:
corpus为标准的单词分类集合,主要包含了每类疾病的标准分类特征,corpus_dic为每个特征集合对应的分类标签,key为分类标签,value为特征。test_word为测试文本。
处理过程:用测试集的特征和标准特征计算相关性,对测试样本的每个元素的相关性分数求和,即为总的相关性分数:
from gensim.summarization import bm25
import jieba
def gensim_bm25_word_classification(test_word):
corpus = [
['高','血','压','高血','血压'],
['糖','尿','病'],
['精','神','病']
]
corpus_dic = {
'高血压':['高','血','压','高血','血压'],
'糖尿病':['糖','尿','病'],
'精神病':['精','神','病']
}
bm25Model = bm25.BM25(corpus)
#将str转为list
test_word = list(test_word)
scores = bm25Model.get_scores(test_word)
print('测试短文本:', test_word)
for i, j in zip(scores, corpus):
for m in corpus_dic.keys():
if j == corpus_dic[m]:
word_name = m
print('分值:{},原词:{}'.format(i, word_name))
测试:高血压1级
if __name__ == '__main__':
test_word = '高血压1级'
gensim_bm25_word_classification(test_word)
分类结果打印:
高血压类的相关性分数为1.31,远高于其他分类,故分类结果为:高血压。
二、文本分类
需要jieba分词和stopword停用词设置,非常简单。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)