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

一、基础概念

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

百度百科:杰卡德距离(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%左右,并且结果不是很稳定。

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

医学小达人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值