1.import jieba2.3.# 定义分词后的列表4. fileTrainSeg =[]5.6.# 定义用户自定义词典的文件名7. file_userDict ='THUOCL_medical.txt'8.9.# 加载用户自定义词典10. jieba.load_userdict(file_userDict)11.12.# 遍历每一篇文章13.for words in fileTrainClean:14.# 使用jieba分词工具对当前文章进行分词15. tmp = list(jieba.cut(words, HMM =False, cut_all =False))16.17.# 定义结果字符串18. result =''19.20.# 遍历当前文章的每一个词语21.for i, word in enumerate(tmp):22.# 如果当前词语不为空字符串、不在停用词列表中,则将其添加到结果字符串中23.if word.strip()and word notin stopwords:24. result += word +'/'25.26.# 处理分词结果中最后一个词语的斜杠问题27.if i == len(tmp)-1and result.endswith('/'):28. result = result[:-1]29.30.# 如果分词结果不为空,则将其添加到列表中31.if result !='':32. fileTrainSeg.append(result)33.34.# 将分词后的结果添加到列表中35. fileTrainSeg.append(result)36.37.# 打印输出分词后的结果38.print(result)
1.import pynlpir2.3.# 定义分词后的列表4. fileTrainSeg =[]5.6.# 遍历每一篇文章7.for words in fileTrainClean:8.# 使用pynlpir分词工具对当前文章进行分词9. tmp = pynlpir.segment(words, pos_tagging=False)10.11.# 定义结果字符串12. result =''13.14.# 遍历当前文章的每一个词语15.for i, word in enumerate(tmp):16.# 如果当前词语不在停用词列表中,则将其添加到结果字符串中17.if word.strip()and word notin stopwords:18. result += word +'/'19.20.# 处理分词结果中最后一个词语的斜杠问题21.if i == len(tmp)-1and result.endswith('/'):22. result = result[:-1]23.24.# 将分词后的结果添加到列表中25. fileTrainSeg.append(result)26.27.# 打印输出分词后的结果28.print(result)29.30.# 关闭pynlpir分词工具31. pynlpir.close()
因此,可以通过对词向量之间的运算来推测词语之间的关系,例如:男人 - 女人 = 国王 - 王后。在这个例子中,通过对词向量进行加减法运算,推测出“女人”与“王后”之间的关系,即它们是同一类别的概念。我们看看我们的模型能不能得出类似的结果:1. result = model.wv.most_similar(positive=['肺炎','军团菌'], negative=['脑炎'], topn=10)2.for m in result:3.print(m)
结果显示
效果也还ok?
训练结果可视化
Step9 t-SNE降维
向上滑动阅览
1.#-*- coding: utf-8 -*-2.import numpy as np3.import sklearn4.# pip install scikit-learn5.import matplotlib.pyplot as plt6.from sklearn.manifold import TSNE7.8.# 这个要找一个系统字体库有的字体9.# 如果和我一样用的linux系统10.# 可以用fc-list :lang=zh命令在terminal查找linux系统中有的字体11. mpl.rcParams['font.family']=['WenQuanYi Micro Hei']12.13.# 加载模型14. model = gensim.models.Word2Vec.load("my_word2vec_model.model")15.16.# 获取所有词向量17. X = model.wv.vectors18.19.# 使用t-SNE进行降维20. tsne = TSNE(n_components=2, random_state=0)21. X_tsne = tsne.fit_transform(X)22.23.# 可视化结果24. fig, ax = plt.subplots()25. ax.scatter(X_tsne[:,0], X_tsne[:,1], s=1, alpha=0.5, c='yellow')26.27.# 在图中显示每个词28.for i, word in enumerate(model.wv.index_to_key):29.if i %100==0:# 每100个词显示一次30. ax.annotate(word,(X_tsne[i,0], X_tsne[i,1]), fontsize=4)31.32.# 保存图像33. plt.savefig('word2vec.png', dpi=1200, bbox_inches='tight')34. plt.show() 我们可以观察图片上举例相近的中文词是否被聚类到一起:我们发现,‘肥胖’‘梗死’聚类在一起,‘戒烟’‘精神紧张’‘依赖’也同样被聚类。循环更多的词效果更显著一点,比如‘头孢他定’‘保泰松’‘布洛芬’就被聚类在一起,‘胃部’‘小肠’也被聚类在一起。虽然效果不是特别好,不过仔细观察一下还是蛮好玩的。好啦,今天的分享就到这里了。大家有空的话也可以换本书复制复制代码玩一下。在这个AI兴盛的大时代,作为医生我们也能用感兴趣的方式去体验自然语言模型,还是蛮有趣的!同时,也可以将自然语言处理基础应用于医学研究领域,挖掘和分析大量的医学文本数据,可以助力科研以及简化平时的工作。