LifeScience Hack

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

Pythonで論文情報をまとめてゲットする④ ~ ESummaryを使って論文タイトルを取得 ~ 

PythonPubmedから論文情報を取得するシリーズの続きです。
今回はESummaryを使って論文のタイトル等の情報をゲットしていきます。

前回までに検索で該当する論文のPMIDを取得できました。
これまでの記事はこちら

● Pythonで論文情報をまとめてゲットする①~ PubMed APIについて~
● Pythonで論文情報をまとめてゲットする②~ 下準備 ~
● Pythonで論文情報をまとめてゲットする③~ ESearchを使って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

URL = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&retmode=json&id='

queries = [URL + pmid for pmid in pmids]
# pmids は前回の記事で取得したpmidのリストです。

responses = {} #このあと取得するjsonデータを格納する辞書を作成

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の辞書型の参考記事 Pythonの辞書(dict)のforループ処理(keys, values, items) | note.nkmk.me

これで各論文の情報を取得できました。
ここから必要なデータを抜き出していきます。
まずは、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.

print(responses['30478810']['fulljournalname']) # pmid = 30478810のジャーナルフルネームを取得
#Medical & biological engineering & computing 文字化け

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データフレームに格納し、エクセルで打ち出してみたいと思います。

次の記事
● Pythonで論文情報をまとめてゲットする⑤~ Openpyxlを使ってExcelファイルとして保存する~