Pythonで論文情報をまとめてゲットする④ ~ ESummaryを使って論文タイトルを取得 ~
PythonでPubmedから論文情報を取得するシリーズの続きです。
今回はESummaryを使って論文のタイトル等の情報をゲットしていきます。
前回までに検索で該当する論文のPMIDを取得できました。
これまでの記事はこちら
ESummaryについて
ESummaryでできること 1. UIDリストからdocument summaryを返す
2. UIDリストを参照し、History Serverからdocument summaryを取得
Queryの作成
ESummeryの基本URLはこちら
https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi
ここにESearchと同様に検索条件とUIDを入れることで、
論文の基本情報をゲットしていきます。
よく使う設定はこちら
| パラメーター | 説明 | default |
|---|---|---|
| db | データベースの選択 | Pubmed |
| id | UID | |
| retmode | 結果の形式 | XML format |
ESearchのquery作成と同様に作ってみます。
db = pubmed
id = pmid (ESearchで取得したもの)
retmod = json
にします。
基本URL +「?db=pubmed&id=pmid&retmode=json」
簡単ですね。
ここで、pmidには実際のpmidを入れていきます。
いちいち入れていくのは面倒くさいのでコードの説明で記載します。
Requestsを使って論文情報取得
pmid毎のqueryを作成します。
import requests
<div></div>
URL = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&retmode=json&id='
<div></div>
queries = [URL + pmid for pmid in pmids]
# pmids は前回の記事で取得したpmidのリストです。
<div></div>
responses = {} #このあと取得するjsonデータを格納する辞書を作成
<div></div>
for query in queries:
response = requests.get(query)
res_json = response.json()['result']
#responseのjsonを取得し、その中のresultを返す
responses.update(res_json)
#res_jsonをresponsesに連結する。
Pythonの辞書型への連結はupdateで行います。
keyが同じだと上書きされてしまうので、
pmidがkeyとなるようにしています。
●Pythonの辞書型の参考記事
[https://note.nkmk.me/python-dict-keys-values-items/:title\]
これで各論文の情報を取得できました。
ここから必要なデータを抜き出していきます。
まずは、jsonファイルの中身を見ていきましょう。
pmid 30496739のjsonファイルを表示一部削除してます。
print(responses['30496739'])
{'articleids': [{'idtype': 'pubmed', 'idtypen': 1, 'value': '30478810'},
{'idtype': 'doi', 'idtypen': 3, 'value': '10.1007/s11517-018-1933-x'},
{'idtype': 'pii', 'idtypen': 4, 'value': '10.1007/s11517-018-1933-x'},
{'idtype': 'rid', 'idtypen': 8, 'value': '30478810'},
{'idtype': 'eid', 'idtypen': 8, 'value': '30478810'}],
'attributes': ['Has Abstract'],
'authors': [{'authtype': 'Author', 'clusterid': '','name': 'Khaleelur Rahiman PF'},
{'authtype': 'Author', 'clusterid': '', 'name': 'Jayanthi VS'},
{'authtype': 'Author', 'clusterid': '', 'name': 'Jayanthi AN'}],
'elocationid': 'doi: 10.1007/s11517-018-1933-x',
'epubdate': '2018 Nov 26',
'essn': '1741-0444',
'fulljournalname': 'Medical & biological engineering & computing',
'history': [{'date': '2018/03/22 00:00', 'pubstatus': 'received'},
{'date': '2018/11/17 00:00', 'pubstatus': 'accepted'},
{'date': '2018/11/28 06:00', 'pubstatus': 'entrez'},
{'date': '2018/11/28 06:00', 'pubstatus': 'pubmed'},
{'date': '2018/11/28 06:00', 'pubstatus': 'medline'}],
'issn': '0140-0118',
'lang': ['eng'],
'lastauthor': 'Jayanthi AN',
'nlmuniqueid': '7704869',
'pubdate': '2018 Nov 26',
'pubstatus': '10',
'pubtype': ['Journal Article'],
'recordstatus': 'PubMed - as supplied by publisher',
'sortfirstauthor': 'Khaleelur Rahiman PF',
'sortpubdate': '2018/11/26 00:00',
'sorttitle': 'deep convolutional neural network based speech enhancement to improve speech intelligibility and quality for hearing impaired listeners',
'source': 'Med Biol Eng Comput',
'title': 'Deep convolutional neural network-based speech enhancement to improve speech intelligibility and quality for hearing-impaired listeners.',
'uid': '30478810'}
辞書型の中にリスト型、その中に辞書型みたいな複雑に入れ込んでいますが、
指定してあげれば単純です。
まずは、辞書型のkey一覧を取得してみましょう。
print(responses['30478810'].keys())
#dict_keys(['uid', 'pubdate', 'epubdate', 'source', 'authors', 'lastauthor', 'title', 'sorttitle', 'volume', 'issue', 'pages', 'lang', 'nlmuniqueid', 'issn', 'essn', 'pubtype', 'recordstatus', 'pubstatus', 'articleids', 'history', 'references', 'attributes', 'pmcrefcount', 'fulljournalname', 'elocationid', 'doctype', 'srccontriblist', 'booktitle', 'medium', 'edition', 'publisherlocation', 'publishername', 'srcdate', 'reportnumber', 'availablefromurl', 'locationlabel', 'doccontriblist', 'docdate', 'bookname', 'chapter', 'sortpubdate', 'sortfirstauthor', 'vernaculartitle'])
この中から必要なkeyを指定すれば良いわけです。
タイトルを取得したいときは「title」を
journal名を取得したいときはフルネームなら「fulljournalname」、
略称なら「source」を指定します。
print(responses['30478810']['title']) #pmid = 30478810のタイトルを取得
#Deep convolutional neural network-based speech enhancement to improve speech intelligibility and quality for hearing-impaired listeners.
<div></div>
print(responses['30478810']['fulljournalname']) # pmid = 30478810のジャーナルフルネームを取得
#Medical & biological engineering & computing 文字化け
<div></div>
print(responses['30478810']['source']) #pmid = 30478810のジャーナル略称を取得
#Med Biol Eng Comput
簡単に情報を取得できそうですよね。
では、最後に欲しい情報を格納した辞書データをリスト型に入れた(Summaries)を作成します。
Summaries = [{'pmid':pmid,
'Title':responses[pmid]['title'],
'Author':responses[pmid]['sortfirstauthor'],
'Journal' : responses[pmid]['source'],
'Pubdate':responses[pmid]['epubdate']} for pmid in pmids]
これで、ESummaryから論文情報を取得できました。
次回は、取得した情報をPandasデータフレームに格納し、エクセルで打ち出してみたいと思います。