Python应用案例——基于Word2Vec文本匹配的医疗方案推荐算法

本文介绍了如何使用Python和Gensim库实现Word2Vec模型,包括数据预处理、模型训练、计算句子相似度。通过用户输入的句子,计算其与已有数据集中的句子的余弦相似度,以识别最接近的新症状描述。
摘要由CSDN通过智能技术生成

目录

1、加载数据

2、分词、去除停用词函数封装 

3、读取用户输入数据

4、计算每句长度平均值

5、模型Word2Vec训练

6、通过word2vec模型计算两个句子(模型内的)的余弦相似度

源码分享


1、加载数据

import pandas as pd
import seaborn as sns
import jieba
# 读取csv文件
data = pd.read_csv('word2vec_data.csv')
data

2、分词、去除停用词函数封装 

def pretreatment(text):#数据预处理
    # 1、分词处理
    text = jieba.cut(text.strip())
    # 2、去除停用词
    # 创建一个停用词列表
    stopwords = [line.strip() for line in
                 open('./text-data/stopwords.txt', encoding='UTF-8').readlines()]
    sentence = ''
    # 去停用词
    for word in text:
        if word not in stopwords:
            if word != '\t':
                sentence += word
                sentence += " "
    return sentence

3、读取用户输入数据

#user_symptom="常年性鼻炎症状典型症状:典型症状为鼻痒、阵发性喷嚏连续发作、大量水样鼻涕和鼻塞。"
user_symptom="我的头疼,胸闷,气短,心如刀绞。"
#对新句子进行分词去停用词处理
user_symptom = pretreatment(user_symptom)

user_symptom

'头疼 胸闷 气短 心如刀绞 '
#将数据复制到新的列表,专门进行更新模型和训练数据
DATA=list(data['symptoms'])
len(DATA)
1193
#新句子加入训练组
DATA.append(user_symptom)
len(DATA)
1194

4、计算每句长度平均值

#计算每句长度平均值
sum=0
for i in range(len(DATA)):
    sum+=len(DATA[i].replace(" ", ""))#不计空格

mean_length = sum/len(data)
mean_length = int(mean_length)
print(mean_length)
869

5、模型Word2Vec训练

#构建word2vec模型
from gensim.models import Word2Vec

NewWord2Vec = Word2Vec(sentences=DATA,vector_size=mean_length, sg=1)
#vector_size=mean_length(每句的平均长度为向量长度)、sg=1(使用skip-gram)
print(NewWord2Vec)
Word2Vec<vocab=2332, vector_size=869, alpha=0.025>

这是一个关于Word2Vec模型的参数设置。其中,vocab表示词汇表的大小为2332,vector_size表示词向量的维度为800,alpha表示学习率(步长)为0.025。

学习率(步长)是控制模型更新权重的速度和幅度的超参数。在Word2Vec模型中,学习率决定了每次更新词向量时的步长大小。较大的学习率可能会导致模型快速收敛但可能无法找到全局最优解,而较小的学习率则会导致模型收敛缓慢。因此,选择合适的学习率对于训练模型非常重要。在这个例子中,alpha被设置为0.025,表示每次更新词向量时,将根据当前的梯度方向沿着负梯度方向移动800维空间中的2.5个单位长度。

NewWord2Vec.wv.index_to_key

NewWord2Vec.wv.key_to_index

NewWord2Vec.wv.similar_by_word("痛")#找出和word相近词
[('疼', 0.6430854797363281),
 ('榨', 0.5945287942886353),
 ('扯', 0.5560593605041504),
 ('拘', 0.5416150093078613),
 ('肚', 0.5102065205574036),
 ('胀', 0.5047545433044434),
 ('剧', 0.5017210245132446),
 ('皖', 0.4938029646873474),
 ('耻', 0.49146348237991333),
 ('割', 0.4897189736366272)]
NewWord2Vec.wv.similarity("疼","痛")#求两个词之间的相似度
0.6430854

6、通过word2vec模型计算两个句子(模型内的)的余弦相似度


#计算两个句向量的余弦相似度(此句子已经处理完)#其实也可以在函数里面进行处理,这样可以保留原句子
def tow_sens_similar(sen1,sen2,word2vec):
    '''
    从句子中找到模型中训练好的词的向量,再对这些词向量累加求平均值求出句向量
    再对两个句向量求余弦距离
    '''
    '''
    sen_1=sen1
    sen_2=sen2
    结巴分词
    去除停用词
    这样使得s1和s2都是正常句子,可以正常返回
    '''
    
    
    
    # 计算句向量1
    word_vectors=[]#词向量列表
    for word in sen1: 
        if word not in word2vec.wv.key_to_index:
            matrix = np.zeros((mean_length,))
            word_vectors.append(matrix)
        else:
             word_vectors.append(word2vec.wv.get_vector(word))
    sen1_vec = np.mean(word_vectors, axis=0)
    
    # 计算句向量2
    word_vectors=[]#词向量列表
    for word in sen2: 
        if word not in word2vec.wv.key_to_index:
            matrix = np.zeros((mean_length,))
            word_vectors.append(matrix)
        else:
            word_vectors.append(word2vec.wv.get_vector(word))
    sen2_vec = np.mean(word_vectors, axis=0)
    
    #print(sen1_vec)
    #print(sen2_vec)
    
    #余弦相似度计算距离
    dot_product = np.dot(sen1_vec,sen2_vec)#点乘
    norm_sen1 = np.linalg.norm(sen1_vec)#计算向量sen1的L2范数,即向量a的所有元素的平方和再开方。
    norm_sen2 = np.linalg.norm(sen2_vec)
    
    #print(norm_sen1)
    #print(norm_sen2)
    return (dot_product / (norm_sen1 * norm_sen2),sen1,sen2)
    
# #通过计算相似度找到和新输入的句子最近的句子
# res = []
# for i in range(0,len(DATA)-1):#-1避免最后一个参与运算,因为最后一个就是用户新输入的句子
#     #print(tow_sens_similar(new_sen,TBTEST[i],NewWord2Vec))
#     res.append(tow_sens_similar(user_symptom,DATA[i],NewWord2Vec))

# res  
# #优化(提速)
res = [tow_sens_similar(user_symptom, DATA[i], NewWord2Vec) for i in range(len(DATA) - 1)]
res
res = sorted(res, key=lambda x: x[0],reverse=True)#(嵌套列表降序排序)根据列表元素的元素中第一个值进行排序
for r in res:
    print(r)
#找到和新句子最相近的句子了
res[0]
(0.86933774,
 '头疼 胸闷 气短 心如刀绞 ',
 '血气胸 症状 早期 症状 胸闷 气促 严重 起病 急骤 突然 胸痛 呈 刀割 样锐 痛 呼吸 加重 晚期 症状 呼吸困难 大汗淋漓 紫绀 烦躁不安 四肢 抽搐 手足 冰冷 面色苍白 血压 下降 休克 窒息 危及 生命 血气胸 症状 诊断 胸腔 位于 脏层 胸膜 壁层 胸膜 之间 呈 封闭型 腔隙 气胸 发生 肺 脏层 胸膜 破裂 空气 进入 胸膜 腔 形成 胸膜 腔 内积 气 称为 气胸 轻 仅 胸闷 气促 严重 起病 急骤 突然 胸痛 呈 刀割 样锐 痛 呼吸 加重 大量 气胸 心脏 气管 对侧 移位 胸腔 积气 突然 增加 呼吸困难 大汗淋漓 紫绀 烦躁不安 四肢 抽搐 手足 冰冷 面色苍白 血压 下降 休克 窒息 危及 生命 少部分 血气胸 病人 水 气胸 脓 气胸 血气胸 纵膈 气肿 慢性 气胸 ')
res[0][2]
'血气胸 症状 早期 症状 胸闷 气促 严重 起病 急骤 突然 胸痛 呈 刀割 样锐 痛 呼吸 加重 晚期 症状 呼吸困难 大汗淋漓 紫绀 烦躁不安 四肢 抽搐 手足 冰冷 面色苍白 血压 下降 休克 窒息 危及 生命 血气胸 症状 诊断 胸腔 位于 脏层 胸膜 壁层 胸膜 之间 呈 封闭型 腔隙 气胸 发生 肺 脏层 胸膜 破裂 空气 进入 胸膜 腔 形成 胸膜 腔 内积 气 称为 气胸 轻 仅 胸闷 气促 严重 起病 急骤 突然 胸痛 呈 刀割 样锐 痛 呼吸 加重 大量 气胸 心脏 气管 对侧 移位 胸腔 积气 突然 增加 呼吸困难 大汗淋漓 紫绀 烦躁不安 四肢 抽搐 手足 冰冷 面色苍白 血压 下降 休克 窒息 危及 生命 少部分 血气胸 病人 水 气胸 脓 气胸 血气胸 纵膈 气肿 慢性 气胸 '
#回到原表将最相似的结果res[0][2]返回
Index = DATA.index(res[0][2])

data.case_name[Index]
'血气胸'

源码分享

链接:https://pan.baidu.com/s/1bCP5Bai_SzJ_yxJdXWBl2Q 
提取码:jwt7 

本课程隶属于自然语言处理(NLP)实战系列。自然语言处理(NLP)是数据科学里的一个分支,它的主要覆盖的内容是:以一种智能与高效的方式,对文本数据进行系统化分析、理解与信息提取的过程。通过使用NLP以及它的组件,我们可以管理非常大块的文本数据,或者执行大量的自动化任务,并且解决各式各样的问题,如自动摘要,机器翻译,命名实体识别,关系提取,情感分析,语音识别,以及主题分割等等。一般情况下一个初级NLP工程师的工资从15万-35万不等,所以掌握NLP技术,对于人工智能学习者来讲是非常关键的一个环节。【超实用课程内容】 课程从自然语言处理的基本概念与基本任务出发,对目前主流的自然语言处理应用进行全面细致的讲解,包括文本分类,文本摘要提取,文本相似度,文本情感分析,文本特征提取等,同时算法方面包括经典算法与深度学习算法的结合,例如LSTM,BiLSTM等,并结合京东电商评论分类、豆瓣电影摘要提取、今日头条舆情挖掘、饿了么情感分析等过个案例,帮助大家熟悉自然语言处理工程师在工作中会接触到的常见应用的实施的基本实施流程,从0-1入门变成自然语言处理研发工程师。 【课程如何观看?】 PC端:https://edu.csdn.net/course/detail/25649 移动端:CSDN 学院APP(注意不是CSDN APP哦)本课程为录播课,课程2年有效观看时长,大家可以抓紧时间学习后一起讨论哦~【学员专享增值服务】 源码开放课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化下载方式:电脑登录https://edu.csdn.net/course/detail/25649,点击右下方课程资料、代码、课件等打包下载通过第二课时下载材料
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

代码骑士

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

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

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

打赏作者

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

抵扣说明:

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

余额充值