Python 基于杰卡德相似度的疾病匹配模型,疾病诊断匹配

Python 基于杰卡德相似度的疾病匹配模型,疾病诊断匹配_第1张图片

一、基础概念

这是做相似度识别最简单的模型之一,先来了解两个概念:杰卡德相似系数和杰卡德距离。

百度百科:杰卡德距离(Jaccard Distance) 是用来衡量两个集合差异性的一种指标,它是杰卡德相似系数的补集,被定义为1减去Jaccard相似系数。而杰卡德相似系数(Jaccard similarity coefficient),也称杰卡德指数(Jaccard Index),是用来衡量两个集合相似度的一种指标。

Jaccard相似指数用来度量两个集合之间的相似性,它被定义为两个集合交集的元素个数除以并集的元素个数。

Jaccard距离用来度量两个集合之间的差异性,它是Jaccard的相似系数的补集,被定义为1减去Jaccard相似系数。

二、概念应用

给定两个n维二元向量A、B,A、B的每一维都只能是0或者1,利用Jaccard相似系数来计算二者的相似性:

1) 代表向量A与向量B都是0的维度个数;

2) 代表向量A是0而向量B是1的维度个数;

3) 代表向量A是1而向量B是0的维度个数;

4)  代表向量A和向量B都是1的维度个数。

n维向量的每一维都会落入这4类中的某一类,因此:

则Jaccard相似系数为:

 

 Jaccard距离为:

三、医学应用

本模型应用杰卡德相似度系数来判断疾病名称与疾病术语之间的相似程度,根据相似程度由高到低完成疾病名称的匹配,从而达到疾病名称归一化的目的。

实验数据:医院真实的疾病诊断数据10W+

标准数据:ICD-10

清洗过程:进行分词,将多个疾病分成单一疾病;去除特殊符号和个别无关词汇。

导入杰卡德相似度模型:

import numpy as np

def jaccard(wd_set1,wd_set2):#计算杰卡德相似度
    jaccard_sim = len(wd_set1&wd_set2)/len(wd_set1|wd_set2)
    return jaccard_sim

def jaccard_sim(wd1,wd2):
    wd_list1 = list(wd1)
    wd_list2 = list(wd2)
    max_len = max(len(wd1),len(wd2))
    sim_list = []
    for i in range(2,max_len):
        wd_set1 = set(wd_list1[:i])
        wd_set2 = set(wd_list2[:i])
        sim_list.append(jaccard(wd_set1,wd_set2))#生成相似度列表
    sim = np.average(sim_list)#在相似度组合中取平均值
    return sim

def get_top_sim_one(search_wd,wd_list):
    max_sim = 0#最大相似度
    sim_wd = wd_list[0]#推荐词汇
    search_wd = str(search_wd).strip()
    for wd0 in wd_list:
        wd0_strip = wd0.strip()
        sim0 = jaccard_sim(search_wd,wd0_strip)
        if sim0 > max_sim:
            sim_wd = wd0
            max_sim = sim0
    return sim_wd,max_sim

std_list = ['高血压','糖尿病','心脏病']#列表为标准疾病术语表,自行替换ICD-10
disease = '高血压一级' #为需要标准化的疾病
result = get_top_sim_one(text,std_list)
print(result[0])

 结果:抽取了5个样本(每个样本1000个疾病名称)进行测试和统计,准确率P在60%左右,并且结果不是很稳定。

四、杰卡德相似度匹配心得

相比于机器学习模型(太多不赘述),杰卡德相似度模型的有点:简单、易于实现

缺点:效果差(这个模型只能用来自己把玩,或处理简单问题,很难直接投入到数据生产过程中使用)

       在疾病名称相似度匹配领域不适用的原因分析:疾病诊断归一化高标准、严要求,单一模型就难以实现,更不用说这么简单的小工具;疾病名词长度和长相严重影响了识别效率,个人觉得此模型不适合短文本的相似度匹配,更适合长文本的相似度识别。

你可能感兴趣的:(DRG分组器,疾病诊断归一化,python,人工智能,测试用例,科技,经验分享)