生信笔记 | 探索PubMed数据库文献

8a591e7c586c98c8c627b7e0a5ad0b55.gif

第一个问题:研究最热门的基因是什么

生信笔记 | 探索PubMed数据库文献_第1张图片

在NCBI的ftp里面关于人的一些基因信息, 在 :ftp://ftp.ncbi.nlm.nih.gov//gene 下载即可!

其中 gene2pubmed.gz 这个是NCBI的entrez ID号对应着该基因发表过的文章的ID号

链接是:ftp://ftp.ncbi.nlm.nih.gov//gene/DATA/gene2pubmed.gz

读入数据统计,绘制词云图

library(data.table)
library(wordcloud)
library(org.Hs.eg.db)
g2p <- fread('/data/NCBI/gene2pubmed.gz',data.table = F)
head(g2p)


tb <- as.data.frame(table(g2p$GeneID))
tb <- tb[order(tb$Freq,decreasing = T),]
colnames(tb)[1]='gene_id'
head(tb)
ids=toTable(org.Hs.egSYMBOL)
head(ids)
tbs=merge(ids,tb,by='gene_id')
wordcloud(words = tbs$symbol, freq = tbs$Freq, min.freq = 1,
          max.words=200, random.order=FALSE, rot.per=0.35,
          colors=brewer.pal(8, "Dark2"))

生信笔记 | 探索PubMed数据库文献_第2张图片

我们发现TP53这个基因研究的最多。

第二个问题:你研究的基因都发表过什么文章?

接下来我们可以对单个基因进行探索。这里TP53这个基因太多了,我以ADORA1这个基因为例。不过这种方式不太适合该基因对应文献过多的情况。

pid <- g2p$PubMed_ID[g2p$GeneID==tbs$gene_id[tbs$symbol=="ADORA1"]]
#### 网络爬虫
url <- "https://pubmed.ncbi.nlm.nih.gov/"
library(tidyr)
library(rvest)
library(dplyr)
library(RCurl)
library(XML)
library(stringr)
pubmedinfo <- lapply(1:length(pid),function(x){
  id <- pid[x]
  u <- paste0(url,id)
  htdata <- read_html(u, encoding = "utf-8")
  message(x)
  title <- html_nodes(htdata,"h1")[[1]]%>% html_text() %>% str_trim()
  Sys.sleep(1)
  #doi <- html_nodes(htdata,"header div ul li span a")[[1]]%>% html_text() %>% str_trim()
  info <- html_nodes(htdata,"header div div div.article-source span")[[2]]%>% html_text() %>% str_trim()
  Sys.sleep(1)
  year <- gsub("\\D","",unlist(strsplit(info,";"))[1])
  year <- substr(year,1,4)
  jur <- html_nodes(htdata,"header div div div.article-source button")[[1]]%>% html_text() %>% str_trim()
  info <- data.frame(PubMed_ID = id,
                     Journal = jur,
                     Year = year,
                     #DOI = doi,
                     Title = title)
  outlines = paste0(id,jur,year,title,collapse='\t')
  writeLines(outlines, con=output)
  return(info)
})
pubmed_Info <- do.call(rbind,pubmedinfo)

绘制一个柱形图看看

staty = as.data.frame(table(pubmed_Info$Year))
dim(staty)
library(ggplot2)
ggplot(staty,aes(x = Var1,y=Freq))+
  geom_bar(stat = "identity")

生信笔记 | 探索PubMed数据库文献_第3张图片

有一个R包RISmed是可以用来探索pubmed数据库的数据的,有时候还是会挂。你可以尝试一下。下面代码,所以每一个循环设置了睡眠3s。可以延长睡眠时间解决。但文献条数太多就不建议使用,因为时间太长,获取太多也会挂。

library(RISmed)
linfo <- lapply(pid, function(uid){
  message(uid)
  query <- paste0(uid,"[UID]")
  Sys.sleep(3)
  search_query = EUtilsSummary(query = query,retmax=1)
  records<- EUtilsGet(search_query)
  pubmed_data <- data.frame(Title = records@ArticleTitle,
                            Year = records@YearPubDate,
                            journal = ISOAbbreviation(records),
                            PubMed_ID = uid)
  return(pubmed_data)
})
ADORA1_pubmeddata <- do.call(rbind,linfo)

可以对文章标题绘制一个词云图,代码和前面【生信笔记 | 文本挖掘的一般流程

library("tm")
library("SnowballC")
docs <- Corpus(VectorSource(pubmed_Info$Title))
toSpace <- content_transformer(function (x , pattern ) gsub(pattern, " ", x))
docs <- tm_map(docs, toSpace, "/")
docs <- tm_map(docs, toSpace, "@")
docs <- tm_map(docs, toSpace, "\\|")
docs <- tm_map(docs, content_transformer(tolower))
docs <- tm_map(docs, removeNumbers)
docs <- tm_map(docs, removeWords, stopwords("english"))
docs <- tm_map(docs, removeWords, c("characterization", "molecular",
                                    "comprehensive",'cell',
                                    'analysis','landscape'))
docs <- tm_map(docs, removePunctuation)
docs <- tm_map(docs, stripWhitespace)
dtm <- TermDocumentMatrix(docs)
m <- as.matrix(dtm)
v <- sort(rowSums(m),decreasing=TRUE)
d <- data.frame(word = names(v),freq=v)
head(d, 10)
wordcloud(words = d$word, freq = d$freq, min.freq = 1,
          max.words=200, random.order=FALSE, rot.per=0.35,
          shape = 'pentagon',size=0.7,
          colors=brewer.pal(8, "Dark2"))

生信笔记 | 探索PubMed数据库文献_第4张图片

第三问题:统计近十年的文章发展状况。

但是这个方式只适合文献数量少的情况,文献数量多,就不适用。在NCBI上有所有文献的信息文件。可以下载后整理分析。

下载地址:https://ftp.ncbi.nlm.nih.gov/pubmed/baseline/

library(tidyr)
library(rvest)
library(dplyr)
library(RCurl)
library(XML)
library(stringr)
library(RISmed)


###
ncbi <- "https://ftp.ncbi.nlm.nih.gov/pubmed/baseline/"
hn <- read_html(ncbi, encoding = "utf-8")
dlurl <- html_nodes(hn,"pre a")%>% html_text() %>% str_trim()
dlurl <- dlurl[-c(1:2)]
dlurl <- dlurl[!grepl(".md5$",dlurl)]
dlurl[1:3]
length(dlurl)
lapply(dlurl[1:length(dlurl)],function(u){
  au <- paste0(ncbi,u)
  file_destination <- paste0("literatureInfo/",u)
  download.file(au,destfile =file_destination)
})

下载后处理。

下载的文件都是xml格式,但是不是每个文件里面的标签信息都一致。下面也仅仅是获取文章发表年限,期刊以及文章标题的信息。文件里面没有时间的我用0替代了。

pubmedinfo <- lapply(38:length(xmlfiles), function(len){
  xml = xmlfiles[len]
  rootnode <- xmlParse(file = xml) %>% xmlRoot()
  file = str_split(xml,"/")[[1]][4]
  sink(paste0("xmlinfo/",file,".txt"))
  lapply(c(1:xmlSize(rootnode)),function(x){#xmlSize(rootnode)
    pmid = 0
    journal = NA
    ArticleDate = 0
    title = NA
    xmldata <- xmlToList(rootnode[[x]][[1]])
    nm = names(xmldata)
    if("PMID" %in% nm){
      pmid <- xmldata[["PMID"]][["text"]]
      if(!is.character(pmid)){
        message(paste0(xml,"pmid:",x))
      }
    }
    if("Article" %in% nm){
      journal = xmldata[["Article"]][["Journal"]][["Title"]]
      if(!is.character(journal)){
        message(paste0(xml,"journal:",x))
      }
      ArticleDate = xmldata[["Article"]][["ArticleDate"]][["Year"]]
      if(is.null(ArticleDate)){
        ArticleDate = xmldata[["Article"]][["Journal"]][["JournalIssue"]][["PubDate"]][["Year"]]
        if(is.null(ArticleDate)){
          ArticleDate = xmldata[["DateCompleted"]][["Year"]]
          if(is.null(ArticleDate)){ArticleDate = 0}
        }
      }
      title = xmldata[["Article"]][["ArticleTitle"]]
      if(is.null(title)){
        title <- xmldata[["Article"]][["VernacularTitle"]]
      }
      if(length(title)>1){
        v <- unlist(title) %>% as.vector()
        t <- NULL
        for(y in 1:length(v)){
          t <- paste(t,v[y])
        }
        title = t
      }
    }
    cat( paste(c(pmid,journal,ArticleDate,title),collapse ='\t'))
    cat('\n')
    rm(xmldata)
  })
  sink()
  rm(rootnode)
  if(is.integer(len/15)){
    rm(rootnode)
    gc()
    Sys.sleep(300)
  }
  onexmlinfo <- do.call(rbind,onexmlinfo)
})

在本地,要把所有文件的运行结束,是需要很长时间的。我这里只跑了部分文件【1008-1062】

xmlinfodir <- dir("xmlinfo/",".txt$",full.names = T)
library(data.table)
literinfo <- data.frame()
for(x in xmlinfodir){
  onelit <- fread(x,header = F)
  literinfo = rbind(literinfo,onelit)
}
head(literinfo)
table(literinfo$V3)

有好多文献没有获取到时间。

> literinfo$PubMed_ID[literinfo$ArticleDate == 0] %>% length()
[1] 12621

后面我发现,有点文献出版时间是在Article标签中,但很多是空值,有的xml文件里面有DateCompleted标签可以获取时间,有的又没有。可以通过RISmed包检索获取时间。

整理好所有信息,再绘图。


参考:

研究最热门的基因是什么

生信笔记 | 探索PubMed数据库文献_第5张图片

生信笔记 | 探索PubMed数据库文献_第6张图片

生信笔记 | 探索PubMed数据库文献_第7张图片

生信笔记 | 探索PubMed数据库文献_第8张图片

生信笔记 | 探索PubMed数据库文献_第9张图片

生信笔记 | 探索PubMed数据库文献_第10张图片

生信笔记 | 探索PubMed数据库文献_第11张图片

生信笔记 | 探索PubMed数据库文献_第12张图片

生信笔记 | 探索PubMed数据库文献_第13张图片

你可能感兴趣的:(python,linux,java,大数据,安卓)