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

未分類
この記事は約8分で読めます。

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

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

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

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(クエリ)を作成します。

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

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

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

というqueryを作ります。

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

https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi

この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として受け取る
Python
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オブジェクトの作成
Python
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が格納されていますので、それを取り出していきます。

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

PMIDが取得できました。
次回は取得したPMIDから論文のタイトルなどの基本情報をえたいと思います。

コメント

タイトルとURLをコピーしました