PubMedの検索結果をRで取り出して加工する

今日は仕事で必要になった小ネタです。
医学系学術論文の検索といえば、PubMedですね。自分が学生だった頃の、有料のMEDLINEを使えるところを探し回ったのとは隔世の感です。米国でも日本でも、図書館はいい仕事をしますね。

さて、今日のテーマは、「ある大学に所属している著者がFirst Authorになっている論文だけを検索する」です。

これ、PubMedの通常の機能だけで出来そうな気もしてしまうのですが、PubMedの検索式で「著者所属」に該当する[Affiliation]フィールドが、実は著者ごとに分かれておらず、「First Authorが特定の所属である」という検索式が書けないんですね。

ここを解決するためには、例えばPubMedの情報がSPARQL Endpoint になっていたりしたら、そこからSPARQLで検索すればいいじゃん、とかになるのですが、いくつかそういうサービスはあるようなのですが、結局PubMedのWebフォームに変換しているだけみたいな感じで、Webフォームで検索できない式を検索できるようにしたものはないようです。

じゃあ無理か、というと、最近のPubMedはXMLで検索結果をダウンロードすることができるので、その中身を見てみるときっちりと文献ごとに著者所属が分かれて入っています。そこで、このXMLを直接調べてあげれば目的は達成できそうです。

XMLからのデータの検索はXPath用のライブラリがある言語であればどこからでもいいので、CoffeeScript+jqueryでも出来そうですが、そういう風に迷ったらやっぱりRですね。

幸い、PubMedからデータをXMLで読み出すところまでは、R-bloggersで見つけたので、それを少し改変して最新のPubMedでも動くようにし、そしてFirst Authorの所属を取り出す、という関数を追加したものがこちらです。使い方としては、こんな感じ。

# 依存パッケージの読み込み
library(devtools)
library(XML)
library(RCurl)
# gistから関数を読み込み(パッケージdevtoolsのsource_gist()を使用)
source_gist("ef93c3a54853f54c3550")
# 著者所属のどこかに"University of Tsukuba"が入っていて、かつ出版日が2014年4月1日から2015年3月31日までの論文を検索する、という検索を行って、結果をXMLで得る。ここはPubMedのWebフォームから検索できる式を書く。
xmldata <- searchPubMed(("University of Tsukuba[Affiliation]) AND (\"2014/04/01\"[Date - Publication] : \"2015/03/31\"[Date - Publication])"))
# さらに、そこからFirst Authorが(univ.*tsukuba|tsukuba.*univ)の正規表現にマッチする論文のPMIDをベクタとして得る。
Count1st(xmldata, "(univ.*tsukuba|tsukuba.*univ)")

こうして、PMIDのベクタが得られたら、あとはPubMedのWebフォームから、pmid:XXXXXX として検索をすれば、目当ての文献情報が得られます。