前回までにPythonを使った論文情報取得のための準備が完了しました。
今回は実際にPythonを使って論文検索し、HitするPMIDを取得したいと思います。
まだ準備ができていない場合はこちらで説明しています。
lifesciencehack-ai.hatenablog.com
ESearchについて
EntrezのHPを参照すると、 ESearchの機能として以下のことができます。
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を使って論文タイトルを取得 ~