ixxmu / mp_duty

抓取网络文章到github issues保存
https://archives.duty-machine.now.sh/
121 stars 30 forks source link

老板喊你调研文献?推荐你用R包软件②pubmed.mineR #3685

Closed ixxmu closed 1 year ago

ixxmu commented 1 year ago

https://mp.weixin.qq.com/s/a6XfKFXzVWHd52TKeCDrIQ

ixxmu commented 1 year ago

老板喊你调研文献?推荐你用R包软件②pubmed.mineR by 生信菜鸟团

1-背景&背景资料

R包安利 ② pubmed.mineR—又一个PubMed利器https://mp.weixin.qq.com/s/bndecTSABox2dcr7aoheig

2-更新的意义?

1- pubmed在上述推文发表之后更新了检索界面

2- 检索式更丰富

3- 小结R包的用途,方便读者选择

3- pubmed.mineR学习

这个包相较于esayPubMed更倾向于生物学科

3.1-获取Asbtract文件(新版)

以下是旧版的导出教程:

https://cloud.tencent.com/developer/article/1423450 

在这个基础上探索 

1-先按照关键词检索,选择send to 粘贴板2-选择要粘贴到粘贴板的内容,send3-到这粘贴板界面还可以精选4-创建文件文件如下:

3.2 Text Mining 技能点亮

3.2.1 读取从 PubMed 下载的 Abstract 文件

#pubmed.mineR
rm(list=ls())
# install.packages("pubmed.mineR")
library(pubmed.mineR)
pubmed_abstracts <- readabs("pubmed_abstract.txt")
class(pubmed_abstracts)
printabs(pubmed_abstracts)  ## 显示开头和结尾部分

结果:获取的对象长这样

3.3.2 从 pubmed_abstracts 提取 PMID

#获取PMID
pmid <- pubmed_abstracts@PMID
pmid
class(pmid)
# -----结果
> pmid <- pubmed_abstracts@PMID
> pmid
 [1] 37304267 35509519 35609877 35576168 35875359 36861033 34675792 36860552 33641171
[10] 33909398 33488462 33073437 33012687 32902122 32712060 32589076 32147856 31430115
[19] 31074953 30481087 30944451 33500908 28693812 28595091 28355064 28353419 28027842
[28] 27738953 28925894 27623625 27081746 28355839 24909775 24814524 23814868 23663408
[37] 23734133 22586414 22374898 21653522 21133799 21133797 19324333 19026670 18801719
[46] 18199908 17671349 17613705 16843701 16136557 15811229 15288343
> class(pmid)
[1] "numeric"

3.3.3获取生物信息pubtator_function()

函数 pubtator_function() 只需输入 PMID(数字或上一步得到的 pmid), 就可以给出相应的信息,如 'Gene’, ’Chemical’, ’Disease’ 等。

新版的pubmed可以直接导出pmid

pubtator_output <- pubtator_function(pmid)

也可以直接输入PMID

pubtator_ot6 <- pubtator_function(36861033)

可以看到有基因这一项,但是没有基因相关数据,按照PMID查看原文

看标题和基因没有什么太大的关系,所以没有是正常的。

推文上还描述了一个报错

pubtator_ot1 <- pubtator_function(31158748)

但我这边正常

pubtator_output$Genes
pubtator_output$Genes[1]

通过代码可以选出其中某几项 

但我这个没有基因选出来,输出的内容有点奇怪,可能和我基因数为0有关


没有成功复现的小伙伴没有关系,后面有更好的办法~

3.3.4 函数SentenceToken() 获取文献信息

提取Abstract文件中的信息

# 查看第一篇文献的摘要
abstractstc <- pubmed_abstracts@Abstract
SentenceToken(abstractstc[1])

#查看第一篇文献的出版信息
Journalstc <- pubmed_abstracts@Journal
SentenceToken(Journalstc[1]) 

pubmed_abstracts 3.1.1里面有啥就能看啥

出版信息展示,能看到有些字符被异常提取了

3.3.5 函数sendabs()整理pubmed文档

使用该函数可以直接输出3.3.1的文件

sendabs(pubmed_abstracts,"mypba.txt")

输出的文件长这样:原本pubmed上下载下来的数据长这样:原本的文件就只是数据的陈列,但在sendabs()处理之后出现了列名,形成了表格。

3.3.6 小结-对比easyPubMed获取的txt文件

该easyPubMed获取的代码如下:

#pubmed.mineR
rm(list=ls())
library(easyPubMed)
my_query <- "Andy Clark[AU]"
entrez_id <- get_pubmed_ids(my_query)
abstracts_txt <- fetch_pubmed_data(entrez_id, format = "xml")
print(abstracts_txt[1:16])
new_PM_df <- table_articles_byAuth(pubmed_data = abstracts_txt, included_authors = "last", max_chars = 500)
write.table(new_PM_df,file = "pubmed_result.txt")

怎么说呢,从列名来看easyPubMed获取的文献信息比sendabs()默认输出更多。

pubmed.mineR可以抓文本中的基因哦,写在后方

3.3 一些高频词汇的可视化-抓重点

3.3.1 统计词频word_atomizations()

函数 word_atomizations 可以将整个文本拆分成单词,除去空格、标点符号、常用单词,统计剩下的单词出现的频率。

p53_words <- word_atomizations(pubmed_abstracts)  
p53_words[1:10,]

这个函数要求提供一个S4对象的pubmed文档但偶尔感觉识别还是有点问题,单个字母的重复也被识别出来了,当然我可以跳过不看,直接看后面单词的部分。

3.3.2 统计"基因频"gene_atomization()

各位注意(敲黑板),抓基因了

函数 gene_atomization() 基于包内自带的 HGNC 数据库,可以从文本提取 Gene Symbol 和其出现的频率。

p53_gene <- gene_atomization(pubmed_abstracts)
p53_gene

结果展示:

基因被统计出来了

3.3.3 老司机进阶 pubmed数据挖掘, RISmed包

以 ”关键词“ 和 "年份" 两个参数,得到 PubMed 中相关文章的数量,并可视化。代码是从公众号上粘贴修改的限定关键词lung cancer和quercetin

rm(list=ls())
library(RISmed)
library(dplyr)
library(ggplot2)
library(tidytext)
library(wordcloud)
# 修改检索关键词
query <- "(lung cancer[Title/Abstract]) AND (quercetin[Title/Abstract])"
result <- EUtilsSummary(query, 
                        type = "esearch"
                        db = "pubmed",
                        datetype = "pdat",
                        retmax = 10000,
                        mindate = 2020, 
                        maxdate = 2023)

fetch <- EUtilsGet(result, type = "efetch", db = "pubmed"
abstracts <- data.frame(title = fetch@ArticleTitle,
                        abstract = fetch@AbstractText, 
                        journal = fetch@Title,
                        DOI = fetch@PMID, 
                        year = fetch@YearPubmed) 
abstracts <- abstracts %>% mutate(abstract = as.character(abstract))
# 注意修改年份
abstracts %>%
  group_by(year) %>%
  count() %>%
  filter(year >= 2020) %>% 
  ggplot(aes(year, n)) +
  geom_point() +
  geom_line() +
  labs(title = "Pubmed articles with search terms lung cancer AND quercetin \n2020-2023", hjust = 0.5,
       y = "Articles")

绘制词云图:

cloud <- abstracts %>%
  unnest_tokens(word, abstract) %>%
  anti_join(stop_words) %>%
  count(word, sort = TRUE)
cloud %>%
  with(wordcloud(word, n, min.freq = 15, max.words = 500, colors = brewer.pal(8, "Dark2")), scale = c(8,.3), per.rot = 0.4)

4- 思考小结 R包的用途与特点

1-pubmed.mineR包所需要的格式是从pubmed官网导出的格式,因为不直接通过网络,这样的优势在于可以正常使用pubmed官方所提供的用于搜索的API网页,检索式DIY范围大。

2-下载之后的数据被readabs()函数读取成为在R里面可以被识别的对象,可以直接@提取信息,通过SentenceToken()函数比@符号更细致地选择我们所需要的信息。通过sendabs()函数可以将readabs()函数的读取结果,直接输出整理成为新的格式txt格式并且保存,也就是帮助整理了一下文件格式

3-在readabs()函数中我们可以批量获得PMID,然后pubtator_function()可以通过PMID获取如 'Gene’, ’Chemical’, ’Disease’ 等生物医学研究中常常用到的信息,按照网页浏览的习惯,原本是需要我们一个网页一个网页看的,但通过这个R包可以直接获取到目标信息,并且对目标信息有一个大致的了解。

4-可能是更倾向于字符处理和提取的缘故,相比于easypubmed,该包获取的pubmed txt文件稍显粗略。如果有想要按照文章名称批量详细阅读数据的需求的话,个人感觉easypubmed其实更好用一些。

5-RISmed包还要再看看,感觉其特长在可视化。

5-致谢

感谢生信技能树团队,感谢曾老师提供的公众号文章和练习的素材。