使用 word2vec 工具对医学文献进行数据挖掘

实验目的

能够使用 Python 等编程语言对 MEDLINE/PubMed 医学文献数据集进行数据分析和数据处理,掌握 word2vec 工具的使用,了解算法的原理,能够使用词向量做医学名词语义挖掘的基本实验。

实验原理

MEDLINE/PubMED

医学文献 MEDLINE/PubMED 数据集蕴含了大量的人类自然语言知识、医学术语和其他医学知识。因为这个数据集数据量大、数据质量高,可以使用 word2vec技术训练高质量的词向量,特别是医学名词词向量。词向量是单词的向量化表示,也是自然语言处理研究的基础。获取了医学名词的词向量,即可在此基础上做进一步的研究,例如医学名词的相似性挖掘。

word2vec

Gensim 工具word2vec模块API文档:
Word2vec 技术原理论文
CSDN上也有很多解释地非常好的文章,读者可以自行查找

synonyms

Synonyms,一个开源的中文相关词工具包材料
该中文近义词工具包采用的基本技术是 Word2vec,因此在介绍该工具的同时我们会简要介绍词嵌入方法。此外,Synonyms 的安装十分便捷,我们可以直接使用命令 pip install -U synonyms 完成。该工具包兼容 Python 2 和 Python 3,且目前的稳定版为 v2.0。
但是其本身也有一定的问题,好像使用的是一个预训练好的词向量模型。通过词向量模型计算出的余弦距离表示的是词的“相关词”而不是“近义词”。并且它训的这个模型好像只支持部分“名词”和“动词”的查询。
不要对效果抱很大的期望,对于笔者这个菜鸡而言仅仅是用于实验中对照一下效果。

实验环境

colab(手头没有GPU,训练模型快一点,但是读写就不是那么快)

实验内容

下载数据集

下载 MEDLINE/PubMED 医学文献数据集,最方便的是在 BioASQ 官网下载整理好的 json 格式数据。
BioASQ官 网MEDLINE/PubMed数 据 集 下 载 地 址
在这里插入图片描述
数据集本身很大,而我们只关心的是每篇论文的摘要部分abstractText,所以使用了BioASQ提供的api,不需要花钱注册账号激活就可以使用,代码如下:

import requests
import json
r=requests.get('http://participants-area.bioasq.org/tests/1/', auth=('your_username', 'your_password'))
#Now the variable r contains the data (can been seen with r.text)
data=json.loads(r.text)
#Now the data are in the "data" variable in python native datatypes
len(data) # This will give the number of the articles of the test set 1

返回的数据为json格式,提取出数据中abstract字段对应的内容,保存到txt文件当中,数据下载基本上就完成了。

对数据进行预处理

保存的论文摘要中包含了大量的标点符号,会影响后续的词向量生成(例如biology和biology。就会算成两个不同的词语)。其次需要对文本所有字母进行小写(biology和Biology)。笔者只进行了这两部分的预处理,不足之处读者可进一步改进

for i in range(2,31):
    url='http://participants-area.bioasq.org/tests/'+str(i)+'/'
    r = requests.get(url=url,auth=('your_username','your_password'))
    data=json.loads(r.text)

    abstractText_file='your file path'
    with open(abstractText_file, 'a', encoding='utf-8') as a:
        for each in data:
            str_out = re.sub('[^A-Za-z0-9 ]+', '', each['abstractText'].lower()).replace("_", '')
            a.write(str_out+'\n')
    print("tests"+str(i)+'下载完成')

进行 Word2vec 的训练

这一部分不过多赘述,详情可以自行查询Gensim 工具word2vec模块API文档链接
以及上文实验原理中提到的Word2vec 技术原理

#----------------------------------训练模型----------------------------------  
save_model_name = 'your model name'
abstractText_file='abstractText file path'
# 判断训练的模型文件是否存在
if not os.path.exists(save_model_name):            # 模型训练 
    sentences = word2vec.Text8Corpus(abstractText_file)     # 加载语料
    model = Word2Vec(sentences, size=200)          # 训练skip-gram模型
    model.save(save_model_name)
    # 二进制类型保存模型 后续直接使用
    model.wv.save_word2vec_format(save_model_name + ".bin", binary=True)
    print('训练模型生成成功') 
else:
    print('此训练模型已经存在,不用再次训练')

训练结果

#----------------------------------预测结果----------------------------------  
# 加载已训练好的模型
model = Word2Vec.load(save_model_name)

# 计算两个词的相似度/相关程度
res1 = model.wv.similarity("biology", "information")
'''
print(u"biology和information的相似度为:", res1, "\n")
'''

# 计算某个词的相关词列表
res2 = model.wv.most_similar("biology", topn=50)  # 50个最相关的
'''
print(u"和 [biology] 最相关的词有:\n")
for item in res2:
    print(item[0], item[1])
print("-------------------------------\n")
'''

# 计算某个词的相关词列表
res3 = model.wv.most_similar("information", topn=50)  # 50个最相关的
'''
print(u"和 [information] 最相关的词有:\n")
for item in res3:
    print(item[0], item[1])
print("-------------------------------\n")
'''

# 计算某个词的相关词列表
res4 = model.wv.most_similar("disease", topn=50)  # 50个最相关的
'''
print(u"和 [disease] 最相关的词有:\n")
for item in res3:
    print(item[0], item[1])
print("-------------------------------\n")
'''

这一部分可以自行探索
使用词向量进行医学术语的近义词或相似性挖掘。

实验后续

与synonyms对比

!pip install -U synonyms
import synonyms
print("%s" %(synonyms.nearby("biology"),))
print("%s" %(synonyms.nearby("information"),))

([‘biology’, ‘hypothesis’, ‘Biological’, ‘program’, ‘organism’, ‘extraction’, ‘MAP’, ‘investigation’, ‘tragedy’, ‘metabolism’], [1.0, 0.63274294, 0.58499485, 0.57593346, 0.56798434, 0.5619845, 0.54275423, 0.5353581, 0.5339321, 0.5286734])
([‘information’, ‘data’, ‘TNUMBERThank’, ‘Instead’, ‘genomes’, ‘ensure’, ‘variations’, ‘impacted’, ‘Therefore’, ‘represents’], [1.0, 0.6697364, 0.5854524, 0.5775716, 0.5772916, 0.5642594, 0.5609085, 0.5551969, 0.55346227, 0.5255263])

词云图

词云图可以看作是文本数据的视觉表示,由词汇组成类似云的彩色图形。相对其它诸多用来显示数值数据的图表,词云图的独特之处在于,可以展示大量文本数据。文本数据中每个词的重要性以字体大小或颜色显示,因此词云可以很好地表明每个单词在特定文本体中被提及的频率(即词频分布),通过使用不同的颜色和大小来表示不同级别的相对显着性。
目前主要的词云图绘制库包括wordcloud 和 stylecloud
本文选用的是stylecloud
stylecloud 是一个 Python 包,它基于流行的 wordcloud 包,并添加了一些有用的功能,从而创建出独特的词云。stylecloud 具备以下特点:

  • 支持高级调色板(通过 palettable 实现)
  • 为词云提供(任意大小)的图标形状(通过 Font Awesome 5.11.2 获得)
  • 为调色板提供直接梯度 支持读取文本文件,或预生成的 CSV 文件(包含单词和数字)
  • 提供命令行接口
!pip install stylecloud
import stylecloud
%matplotlib inline
def ciyun(res,name,style):#res词向量输出相关性最高的词语 name保存文件命名 style词云图片样式设置
    result=''
    url='/content/gdrive/MyDrive/代码/生物信息学/'+name+'.png'
    for each in res:
        result=result+' '+str(each[0])
    stylecloud.gen_stylecloud(
        text=result, # 上面分词的结果作为文本传给text参数
        size=512,
        #font_path='msyh.ttc', # 字体设置
        palette='cartocolors.qualitative.Pastel_7', # 调色方案选取,从palettable里选择
        gradient='horizontal', # 渐变色方向选了垂直方向
        icon_name=style,  # 蒙版选取,从Font Awesome里选
        output_name=url) # 输出词云图
ciyun(res2,'biology','fas fa-check')
ciyun(res3,'information','fas fa-exclamation')
ciyun(res4,'disease','fas fa-heart')

蒙版是用 Font Awesome 5 的图标组成的,而 Font Awesome 的图标多达几千种。它的调色方案是从 palettable 选取的.
Font Awesome 5
palettable

效果展示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

对于这个数据还可以有更多的开放性的探索方向,因为时间原因笔者写到这就结束了。如果你有更好的思路想法可以自行探索,做更深入的文本挖掘工作。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

取个名字真难啊啊

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

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

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

打赏作者

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

抵扣说明:

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

余额充值