LifeScience Hack

生物系創薬研究者がAI(誇大表示)を手に入れるまでの過程(Python、Deep Learning、ライフサイエンス)

Pythonで論文情報をまとめてゲットする③ ~ ESearchを使ってPMIDを取得 ~ 

前回までにPythonを使った論文情報取得のための準備が完了しました。

今回は実際にPythonを使って論文検索し、HitするPMIDを取得したいと思います。

まだ準備ができていない場合はこちらで説明しています。

lifesciencehack-ai.hatenablog.com

ESearchについて

EntrezのHPを参照すると、 ESearchの機能として以下のことができます。

ESearchでできること 1. テキスト検索にマッチするUIDリストの取得
2. History Serverへ検索結果をPostする
3. History ServerのデータセットのUIDを全ダウンロードする
4. History ServerのデータセットのUIDを結合したり限定したりできる
5. History ServerのUIDの並び替え

UIDとはEntrez Unique Identifierのこと
NCBIが提供するEntrez DatabaseにはPubmedをはじめとする様々な種類がありますが、
それらで使われているIDの総称がUID(s)ということです。
PubmedのUIDはPMIDですね。

今回やることは、Pubmedでキーワードを入力しマッチする論文のPMIDを取得することなので、1. が該当します。
2.3.4.5.はEntrezにHistory Serverというものを作って、そこに検索したUIDを入れたり出したりいじったりできるそうです。
History Serverは使ったことないのでよくわかってません。

Queryの作成

それではESearchでPMIDが取得することが分かったとういことで、
まずは、query(クエリ)を作成します。

クエリとは、 データベースさんに対する「おい!これやれよ」な命令文のこと。
あるいは
調べ物をするときに検索エンジンさんに入力する検索キーワードのこと
です。
https://wa3.i-3-i.info/word11290.html

今回はどちらの意味も当てはまりますよね。

  • Pubmedを検索ワードで検索してPMIDを返して!!
  • 検索ワードはこれですよ!!

というqueryを作ります。

まずは、ESearchの基本のUrlです。

このurlがクエリになります。 このurlの後ろにいろいろな検索条件や検索ワードを付け足すことによって欲しいデータをとってきます。

パラメーター 説明 default
db データベースの選択 pubmed
term 検索ワード
retmax 最大の結果数 20
retmode 結果の形式 XML format

ESearchの基本Urlの後ろに「&」を入れてつなげていくだけで、
上記のパラメーターを指定して検索結果を得ることができます。

dbとtermは必須なので入れましょう!!
termは「deep learning」します。 retmaxは20では少ないので普段は1000にしときます。 retmodeはXML形式かjsonが良いですが、
XMLよりjsonの方が軽いため今回はjsonにします。

https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=deep%20learning&retmax=1000&retmode=json
条件を「&」で入れていくだけです。
最初のところだけ「?」を入れる点だけ要注意です。

Requestsによる検索結果の取得

いよいよ、コードを書いていきます。
作成したqueryを使って論文検索をし、
PMID一覧を取得します。

検索結果をresponseとして受け取る
import requests
import json

query = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=deep+learning&retmax=10&retmode=json'

response = requests.get(query)

今回はお試しで、retmaxは10にしました。
普段は1000とか5000とかに設定しています。

responseの確認
print(response)
# <Response [200]>  「200だとうまくいっています。200以外だとqueryがうまく書けてない可能性があります」

print(response.headers['Content-Type'])
# 'application/json; charset=UTF-8' 「json形式でデータを取得できていることが確認できました」
jsonオブジェクトの作成
response_json = response.json()
print(response_json)

# {'header': {'type': 'esearch', 'version': '0.3'}, 
#'esearchresult': {'count': '6868', 'retmax': '10', 'retstart': '0', 'idlist': ['30481649', '30481453', '30481205', '30481176', '30481151', '30480818', '30480490', '30480079', '30478928', '30478810'], 
#'translationset': [{'from': 'learning', 'to': '"learning"[MeSH Terms] OR "learning"[All Fields]'}],
# 'translationstack': [{'term': 'deep[All Fields]', 'field': 'All Fields', 'count': '197588', 'explode': 'N'}, {'term': '"learning"[MeSH Terms]', 'field': 'MeSH Terms', 'count': '356271', 'explode': 'Y'}, {'term': '"learning"[All Fields]', 'field': 'All Fields', 'count': '344322', 'explode': 'N'}, 'OR', 'GROUP', 'AND', 'GROUP'], #'querytranslation': 'deep[All Fields] AND ("learning"[MeSH Terms] OR "learning"[All Fields])'}}

responseからjsonファイルだけを取り出し、repsonse_jsonとしました。
中身を見ると、ただの辞書型データですよね。 ここからpmidだけを抜き出していきます。

jsonデータからpmidの抜き出し

jsonファイルをただのpythonの辞書型データとしてみると、
esearchresult > idlist 内にpmidが格納されていますので、それを取り出していきます。

pmids = response_json['esearchresult']['idlist']
print(pmids)
# ['30481649', '30481453', '30481205', '30481176', '30481151', '30480818', '30480490', '30480079', '30478928', '30478810']

PMIDが取得できました。
次回は取得したPMIDから論文のタイトルなどの基本情報をえたいと思います。
次の記事
● Pythonで論文情報をまとめてゲットする④~ ESummaryを使って論文タイトルを取得 ~