目录
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
本文介绍了如何使用Python和Gensim库实现Word2Vec模型,包括数据预处理、模型训练、计算句子相似度。通过用户输入的句子,计算其与已有数据集中的句子的余弦相似度,以识别最接近的新症状描述。

276

被折叠的 条评论
为什么被折叠?



