peerJ期刊探索

开放获取的期刊--PeerJ由Peter Binfield(曾在PLOS ONE任职)和Jason Hoyt(曾为Mendeley的首席科学家)于2012年6月份正式创立。

编辑阵容。其实一个期刊的论文质量,很大程度上取决于编辑的阵容。PeerJ目前的1619位编辑(截止至2018/02)队伍,的确堪称豪华,其中亦不乏诸多诺贝尔得主。

公开审稿过程。我认为这一点是除了较低的发表费用外,PeerJ胜过PLOS ONE的另一大举措。PeerJ官网介绍超过80%的作者选择公开审稿过程,即读者可以浏览下载该论文从投稿、修改、编辑意见、审者意见和作者回复信等所有有关审稿过程的内容。

使用爬虫批量解析发表的所有文章

其发表的所有文章的url很有规律

https://peerj.com/articles/1/
https://peerj.com/articles/2
····························
https://peerj.com/articles/4400
https://peerj.com/articles/4401(404 error)

首先看投稿,审稿,发表时间,的html源代码

<dl class="article-dates">
<dt>Published</dt>
<dd><time itemprop="datePublished">2013-02-12</time></dd>
<dt>Accepted</dt>
<dd><time data-itemprop="dateAccepted">2012-11-21</time></dd>
<dt>Received</dt>
<dd><time itemprop="dateCreated">2012-11-13</time></dd>
</dl>

然后看看文章所属领域及关键词的html源代码

<dl class="article-subjects">
<dt>Subject Areas</dt>
<dd>
<a class="subject" itemprop="about" href="/subjects/?filter=Biochemistry">Biochemistry</a>, <a class="subject" itemprop="about" href="/subjects/?filter=Bioinformatics">Bioinformatics</a>, <a class="subject" itemprop="about" href="/subjects/?filter=Biophysics">Biophysics</a>, <a class="subject" itemprop="about" href="/subjects/?filter=Computational%20Biology">Computational Biology</a>
</dd>
<dt>Keywords</dt>
<dd>
<span class="kwd" itemprop="keywords">Protein structure</span>, <span class="kwd" itemprop="keywords">Protein loop</span>, <span class="kwd" itemprop="keywords">Protein structure prediction</span>, <span class="kwd" itemprop="keywords">Protein loop structure</span>, <span class="kwd" itemprop="keywords">Protein loop structure prediction</span>, <span class="kwd" itemprop="keywords">Protein</span>, <span class="kwd" itemprop="keywords">Loop stretch</span>, <span class="kwd" itemprop="keywords">Loop span</span>
</dd>
</dl>

还可以看看文章的作者列表,发现实在是太复杂了,懒得解析。就看看编辑列表的html源代码

<dl class="article-editors">
<dt>Academic Editor</dt>
<dd itemprop="editor" itemscope="itemscope" itemtype="http://schema.org/Person"><a itemprop="url" href="editor-1" class="contrib" data-jats-contrib-type="editor"><span class="name" itemprop="name"><span class="given-names" itemprop="givenName">Scotty</span> <span class="surname" itemprop="familyName">Butcher</span></span></a></dd>
</dl>

另外值得注意的URL,比如:

## 下面的url可以拿到所有发表文章的审稿细节
https://peerj.com/articles/89/reviews/ 这个就选择不公开review细节。
https://peerj.com/articles/1/reviews/  这个就公开了.
## 下面的url根据规律可以拿到所有文章的编辑
https://peerj.com/articles/4400/editor-1
https://peerj.com/articles/1/editor-1

投稿时间及接收时间可以看杂志社效率,领域分析可以保证自己没投错,关键词可以做词云。

首先一一访问每篇文章获取关键信息

看懂下面代码的前提是 了解基础R语言语法,以及 rvest的用法,了解html的DOM基本结构,以及提前查看了自己需要的信息情况。

library(rvest) 
peerData <- lapply(1:4000,function(i){
  url=paste('https://peerj.com/articles/',i,'/',sep="")
  cat(paste0('Now processing the number ',i,' articel.\n'))
  fit<-try(web <- read_html(url),silent=TRUE)
  if('try-error' %in% class(fit)){
    cat('HTTP error 404\n')
  }else{
    date <- web %>% html_nodes('dl.article-dates dd time') %>% html_text()
    editor_ <- web %>% html_nodes('dl.article-editors dd a span') %>% html_text()
    subject_ <- web %>% html_nodes('dl.article-subjects dd a') %>% html_text()
    editor = editor_[1]
    subject=paste(subject_,collapse=":")
    return(c(i,date,editor,subject))
  }
})
save(peerData,file = 'peerData-1-4000.Rdata')

这个代码写的有点粗糙,4000篇文章访问还是很慢的,约耗时3小时,可以加入并行的语法。

然后进行简单统计并且绘图

load(file = 'peerData-1-4000.Rdata')
dim(peerData)
## [1] 3383    6
colnames(peerData)=c('id','Pdate','Adate','Rdate','editor','subject')
peerData=as.data.frame(peerData) 
head(peerData)
##   id      Pdate      Adate      Rdate               editor
## 1  1 2013-02-12 2012-11-21 2012-11-13 Walter de Azevedo Jr
## 2  2 2013-02-12 2012-12-01 2012-11-13        Emanuele Paci
## 3  3 2013-02-12 2012-12-03 2012-11-13         Mark Mattson
## 4  4 2013-02-19 2012-12-04 2012-11-13           Dee Carter
## 5  5 2013-02-12 2012-12-05 2012-11-14     Annalisa Pastore
## 6  6 2013-02-12 2012-12-08 2012-11-13           Zhihong Xu
##                                                                          subject
## 1                   Biochemistry:Bioinformatics:Biophysics:Computational Biology
## 2 Biochemistry:Bioinformatics:Biophysics:Computational Biology:Molecular Biology
## 3                                                                   Neuroscience
## 4                                        Microbiology:Molecular Biology:Mycology
## 5                                                        Biochemistry:Biophysics
## 6                                                                   Soil Science
tail(peerData)
##        id      Pdate      Adate      Rdate                     editor
## 3378 3400 2017-05-31 2017-05-10 2017-01-20        Marion R<U+00F6>der
## 3379 3401 2017-05-30 2017-05-10 2016-12-19                Erika Braga
## 3380 3402 2017-05-30 2017-05-10 2016-10-17           Kenneth De Baets
## 3381 3403 2017-06-20 2017-05-10 2016-11-16           Hans-Dieter Sues
## 3382 3404 2017-05-30 2017-05-11 2017-03-17               Lydia Hopper
## 3383 3405 2017-06-27 2017-05-11 2016-10-17 Antonio Palaz<U+00F3>n-Bru
##                                                            subject
## 3378                         Bioinformatics:Genomics:Plant Science
## 3379                                 Ecology:Genetics:Parasitology
## 3380                               Entomology:Paleontology:Zoology
## 3381                             Evolutionary Studies:Paleontology
## 3382                          Animal Behavior:Conservation Biology
## 3383 Diabetes and Endocrinology:Evidence Based Medicine:Nephrology
editors <- as.data.frame(sort(table(peerData$editor),decreasing = T))
dim(editors)
## [1] 682   2
head(editors)
##                                  Var1 Freq
## 1 Mar<U+00ED>a <U+00C1>ngeles Esteban   93
## 2                      Jafri Abdullah   60
## 3                        James Reimer   56
## 4                       Robert Toonen   49
## 5                       Donald Kramer   42
## 6                        Dezene Huber   35
freqs=as.data.frame(sort(table(editors$Freq),decreasing = T))
dim(freqs)
## [1] 38  2
head(freqs)
##   Var1 Freq
## 1    1  203
## 2    2  134
## 3    3   82
## 4    4   53
## 5    5   41
## 6    6   34
library(ggplot2)
ggplot(freqs,aes(Var1,Freq)) + geom_bar(stat = "identity") + 
  labs(x = "number of papers edited by each editor", y = "number of editors") +
  theme(panel.background=element_rect(fill='transparent')) + 
  ylim(0,200) + 
  geom_text(mapping = aes(label = Freq),size=4,vjust=-1,color = "black")

img

可以看到,截止至 2017-06-27 ,已经有 682 个编辑已经干活了。在干活的这些编辑里面有少数几个特别勤奋,居然接近100篇了。

分析一下审稿速度

pd=as.Date(as.character(peerData$Pdate))
ad=as.Date(as.character(peerData$Adate))
rd=as.Date(as.character(peerData$Rdate))
plot(pd~rd)

img

# 可以看到只有极少数文章投稿后很久才得到被接受。
durDays=as.numeric(ad-rd)
fivenum(durDays)
## [1] -21  60  87 125 858
# 大部分文章在两三个月期间被审核完毕。
boxplot(durDays)

img

## 搞笑的是有两个文章还没投稿就被接受了,应该是数据库录入错误。
peerData[ad-rd < 1,]
##        id      Pdate      Adate      Rdate        editor
## 1102 1108 2015-08-04 2015-06-26 2015-06-26  Andrew Farke
## 1548 1554 2016-01-14 2015-12-11  2016-01-1 Mike Thompson
##                                                   subject
## 1102                                Paleontology:Taxonomy
## 1548 Clinical Trials:Health Policy:Translational Medicine

最后看一下领域分布

这里需要考虑是否把属于多个领域的同一篇文章的权重降低,比如一篇文章属于5个领域,那么每个领域就只分到了0.2个文章。 我这里就先探索一下不降低权重的方法。

为了保证绘图的美观,这里只展现排名前20的领域。

subjects <- as.data.frame(sort(table(strsplit(paste0(peerData$subject,collapse = ':'),':')[[1]]),decreasing = T))
subjects <- head(subjects,20)
head(subjects)
##                   Var1 Freq
## 1              Ecology  793
## 2              Zoology  516
## 3 Evolutionary Studies  452
## 4       Marine Biology  417
## 5         Biodiversity  414
## 6 Conservation Biology  337
library(ggplot2)
ggplot(subjects,aes(reorder(Var1,as.numeric(Freq)),Freq)) + 
  geom_bar(stat = "identity") + coord_flip() + 
  labs(x = "", y = "",title="Proportion of Subjects") +
  theme(panel.background=element_rect(fill='transparent')) + 
  geom_text(mapping = aes(label = Freq),size=3,hjust=1,color = "white")

img

写在最后

分析期刊其实是一件很有趣的事情,尤其是对初学者来说,可以学的非常多。

比如还可以在爬取数据的时候解析收集每篇文章被引用情况,这样就可以计算杂志的影响因子,然后所有的分析,都是可以根据年来区分开来,看看有没有时间尺度上的变化规律。而且可以爬取关键词和摘要来进行词云分析及可视化。当然了,开放性期刊全文都是公开的,也已爬取全文进行各种高级分析。这个时候,代码往往不是瓶颈。

这里面的代码都是可以复现的,欢迎大家深入挖掘和研究,跟我交流,我的邮箱是 jmzeng1314@163.com 期待你们的来信。

原文发布于微信公众号 - 生信技能树(biotrainee)

原文发表时间:2018-02-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏13blog.site

org.springframework.expression.spel.SpelEvaluationException: EL1004E: Method call: Method service()

前言 本文中提到的解决方案,源码地址在:springboot-thymeleaf,希望可以帮你解决问题。 至于为什么已经写了一篇文章thymeleaf模板引擎调...

3404
来自专栏pangguoming

spring cloud 报错Error creating bean with name 'hystrixCommandAspect' ,解决方案

spring cloud 升级到最新版 后,报错: org.springframework.beans.factory.BeanCreationExceptio...

3375
来自专栏xingoo, 一个梦想做发明家的程序员

Prim算法

普利姆算法,是一种常用的求最小生成树的算法。 最小生成树,使得一个连通图内拥有最小的和。对现实生活中有极大的作用。 主要思路 1 选定一个顶点(与结果无关) 2...

1657
来自专栏西安-晁州

ssm架构添加maven、shiro、lucene、ueditor、druid支持

1、pom.xml文件配置: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="htt...

3150
来自专栏杂烩

spring+quartz集成启动报错 原

692
来自专栏Netkiller

Spring Boot 快速开始

节选自 《Netkiller Java 手札》 11.2. Spring Boot 11.2.1. pom.xml <project xmlns="http...

3295
来自专栏Netkiller

Spring boot with Thymeleaf

本文节选自电子书《Netkiller Java 手札》 5.19. Spring boot with Thymeleaf 5.19.1. Maven <dep...

32313
来自专栏Java成神之路

SpringBoot_异常_01_Caused by: java.lang.BootstrapMethodError: java.lang.NoSuchMethodError

1.Android apk运行时错误java.lang.NoSuchMethodError: com.google.gson.GsonBuilder.setLe...

1923
来自专栏码匠的流水账

SpringBoot配置文件日期属性转换实例

本文展示一下如何在springboot中配置文件指定日期,在java里头用LocalDateTime接收。

873
来自专栏JAVA后端开发

解决spring security与corsFilter冲突的问题

在spring mvc项目中,使用了corsFilter进行跨域配置,相关代码如下:

2083

扫码关注云+社区