参考文献を自動的に出力してくれるbibtexは便利ですが、bibtexに必要な項目を.bibファイルに書き込むのが面倒くさいと思うようになりました。メタデータの取得はWebスクレイピングでできそうですが、ちょっと初心者にとっては怖いので、無料で使える論文検索API「Semantic Scholar API」でできないか試してみました。
結論から言うと、Semantic Scholar APIは、他の論文ツールで区分されるIDを調べるのには向いていますが、bibtexに必要な項目を自動的に入力する手段としては使いづらいです・・・
ちなみに恐る恐るWebスクレイピングにも手を出しています。よかったらこちらも併せてお読みください。
1. API操作に使用したPythonコード
2. Semantic Scholar APIをPythonで使う方法
3. Semantic Scholar APIをいじってみた感想
スポンサーリンク
API操作に使用したPythonコード
今回はInnovation and Supply Chain Managementというジャーナルの9巻1号にある論文のメタデータをすべて取得しbibtexに対応できる形に調節しました。
#!/usr/bin/env python3
#必要なものを宣言
import semanticscholar as sch
import time
import pandas as pd
#ジャーナルの名前、巻の数字を入力
#どのページまで読むか入力
journal = 'iscm'
journalname = 'Innovation and Supply Chain Management'
vol = '9'
npage = 26
#bibファイルを開く
with open("hoge.bib", "w") as f:
for ipage in range(npage):
doi = '10.14327/' + jarnal + '.' + vol + '.' + str(ipage)
print(doi)
#doiからapiを読み込む
paper = sch.paper(doi)
#存在するdoiだけを抽出
if 'year' in paper:
year, authors, title = paper['year'], paper['authors'], paper['title']
#著作者については様々なプロパティがあるので、細かく設定する
select_author = pd.DataFrame(authors)
first_author = select_author['name'][0]
author_list = select_author['name'].values
#bibtexで使うものをリストアップ
#bib1は空白禁止なのでreplaceを使って空白を詰める
bib1 = '@article{' + str(first_author).replace(' ', '') + '(' + str(year) + '),\n'
bib2 = 'title={' + title + '},\n'
bib3 = 'author={' + str(tuple(author_list)) + '},\n'
bib4 = 'year={' + str(year) + '},\n'
bib5 = 'journal={' + journalname + '},\n'
bib6 = 'volume={' + vol + '},\n }\n'
print(bib1, bib2, bib3, bib4, bib5, bib6, file=f)
できあがったhoge.bibの内容は以下の通りです。著作者のリストはうまく出力できなかったので、エディタの置き換え機能で適宜調整する必要があると思います。@article(通常の論文の表示)はtitle・author・yearさえあれば表示できます。
@article{MeishanPiao(2015),
title={Industrial Agglomeration in Border Areas in Northeast China:
The Case of Yanbian in the China–North Korea–Russia Triangle Border Area},
author={('Meishan Piao', 'Chengnan Yan', 'Noritsugu Fujimoto')},
year={2015},
journal={Innovation and Supply Chain Management},
volume={9}
}
@article{MasaruIshioka(2015),
title={Management Concept of Product and Service Value},
author={('Masaru Ishioka', 'Wataru Tana')},
year={2015},
journal={Innovation and Supply Chain Management},
volume={9}
}
@article{YanwenDong(2015),
title={An Ant Colony Optimization Method for Fuzzy Vehicle Routing Problem},
author={('Yanwen Dong', 'Xiying Hao', 'Shinya Sato')},
year={2015},
journal={Innovation and Supply Chain Management},
volume={9}
}
@article{MohammadrezaParsanejad(2015),
title={Inventory-Production System Subject to Production Constraints with Non-Zero Target Inventory},
author={('Mohammadreza Parsanejad', 'Hiroaki Matsukawa', 'Bongsung Chu')},
year={2015},
journal={Innovation and Supply Chain Management},
volume={9}
}
bibtexに通すとこんな感じです。ハイフンが特殊文字と判断されてしまったので、半角ハイフンに修正しました。
本当はページ数や番号をいれるべきですが、省略します。

Semantic Scholar APIをPythonで使う方法
pythonファイルの冒頭に宣言してありますが、Semantic Scholar APIをPythonで使うにはsemanticscholarをインストールする必要があります。(なくてもrequestで何とかできますが、semanticscholarの方が使いやすいと感じました)pipで簡単にインストールできます。anacondaでpythonを使っている方は念のため、仮想環境(ここではtestnv)をつくってからインストールした方がよいでしょう。
$ conda create -n testenv
$ conda init bash
$ conda activate testenv
$ pip install semanticscholar
「conda init bash」は「conda activate testenv」でエラーが出た場合の対処方です。CentOSを使っているのならbashを指定すれば間違いないかと思います。エラーの詳細については以下のURLが参考になります。
https://qiita.com/_odasi_/items/877caf785b20758ba7e0
semanticscholarの使い方
出版された論文に必ずついているDOIを読み込むことでメタデータを取得することができます。冒頭で表示したPythonファイルでいうと、paper = sch.paper(doi)があてはまります。またSemantic Scholar APIが示すメタデータはjsonという形式で記述されています。簡単にいうとPythonの辞書型がたくさん組み合わさった形式という感じですかね・・・?doi = 10.14327/iscm.9.1と指定した際のpaperのキーは以下のようになります。
print(paper.keys())
dict_keys(['abstract', 'arxivId', 'authors', 'citationVelocity',
'citations', 'corpusId', 'doi', 'fieldsOfStudy', 'influentialCitationCount',
'is_open_access', 'is_publisher_licensed', 'paperId',
'references', 'title', 'topics', 'url', 'venue', 'year'])
'arxivId' 'corpusId' 'paperId'があるのをみると、他の論文検索ツール(arxiv,corpus,semantic scholar)との連携ができていることがわかりますね。'is_open_access'はオープンアクセスできるかどうかをTure・Falseで返してくれるようです。(pdfのリンクがあれば便利なのに・・・残念なところです)ちなみに'url'と 'paperId'の違いはhttp://api.semanticscholar.org/paper/があるかないかです。
普通は辞書のキーを指定すると値が出てきますが、json形式の場合、辞書の中に辞書が入っているので辞書のキーを指定すると辞書のリストが表示されます。言葉で説明するのは難しいので例を出します。たとえば、'author'を指定してみると以下のような表示になります。
print(paper['author'])
[{'authorId': '31184528', 'name': 'Meishan Piao','url': 'https://www.semanticscholar.org/author/31184528'},
{'authorId': '49107883', 'name': 'Chengnan Yan', 'url': 'https://www.semanticscholar.org/author/49107883'},
{'authorId': '153232713', 'name': 'Noritsugu Fujimoto', 'url': 'https://www.semanticscholar.org/author/153232713'}]
さらに著作者の名前を知りたいときは'name'のキーを指定していけば、名前を取得できます。ただjson形式はpandasのdataframeに簡単に変換できるので、辞書のキーが多い場合はdataframeに変換した方が作業しやすいです!(ここ重要です!!)
Semantic Scholar APIをいじってみた感想
簡単にメタデータを取得できるのはメリットですが、参考文献の必須要項であるページ数や番号を取得できないのはきついですね・・・・webスクレイピングを利用しないのであれば、Semantic Scholar APIを使うより手動でbibtex形式のファイルをダウンロードした方が簡単かもしれません。web of scienceのAPIが無料で使えたらいいのになあ・・・論文検索サイトのAPI無料化を期待したいところです。
スポンサーリンク
参考にしたサイト様
使用した論文ジャーナル
https://www.jstage.jst.go.jp/browse/iscm/9/1/_contents/-char/en
json形式とPandas.dataframeの関係
https://note.nkmk.me/python-pandas-list/
Semantic Scholar APIについて
https://roy29fuku.com/natural-language-processing/paper-analysis/semantic-scholar-api/
semanticscholar公式ドキュメント
https://pypi.org/project/semanticscholar/
condaで仮想環境を構築する方法
https://code-graffiti.com/how-to-build-a-virtual-environment-with-conda/