Tex, python, illusrator, VPSの学生ノート

latotex-blog

LaTeX

無料で使える論文検索API「Semantic Scholar API」を使ってみた

投稿日:2020年4月13日 更新日:






参考文献を自動的に出力してくれるbibtexは便利ですが、bibtexに必要な項目を.bibファイルに書き込むのが面倒くさいと思うようになりました。メタデータの取得はWebスクレイピングでできそうですが、ちょっと初心者にとっては怖いので、無料で使える論文検索API「Semantic Scholar API」でできないか試してみました。

結論から言うと、Semantic Scholar APIは、他の論文ツールで区分されるIDを調べるのには向いていますが、bibtexに必要な項目を自動的に入力する手段としては使いづらいです・・・

ちなみに恐る恐るWebスクレイピングにも手を出しています。よかったらこちらも併せてお読みください。

Pythonスクレイピングで論文をまとめてDLできるのか?

スポンサーリンク

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/


-LaTeX

Copyright© latotex-blog , 2020 All Rights Reserved Powered by STINGER.