終末 A.I.

Deep Learning を中心に、機械学習するエンジニアのブログ

Microsoft Academic Search APIで自分専用の論文検索エンジンを作る

サーベイなどで論文検索をする時によく困るのが、キーワードをこねくり回さないと以外と読むべき論文に出会えないという点です。

特に「Dialogue System」や「Image Captioning」などのように、母数が少ないニッチな分野になると、学術用検索エンジンにキーワードを入力するだけでは、キーワードにマッチするものがトップに上がってくるだけで、必ずしもその分野を代表するような論文がヒットしてくれるわけではありません。

ホットな分野であれば、サーベイ論文、学会のチュートリアル資料など、人工知能学会の「私のブックマーク」を漁ると良さそうな情報が見つかることもありますが、なかなか新しい情報がまとまっていないということも多くあります。

その点で検索しやすいなと思っているのが、Microsoft Academicです。

下記の記事にもまとまっていますように、文献に紐付けられたトピックで論文を絞り込める、類似の論文のサジェストの性能がまあまあ良い、Saliencyなどのどのような論文から引用されているかでランキングできるという点が、論文を探す際に非常に便利で、特にあまり馴染みのない、体系的に理解できていない分野の論文を探す時に重宝しています。

個人的なオススメは、「キーワード入力」→「トピックで絞り込み」→「Saliencyでランキング」で検索すると、割といい感じに論文を見つけることができます。

ただやはり難点があって、特にトピックにまではなっていないような時に、下記のうまくいかないケースが発生します。

  • 検索キーワードと論文中のワーディングや語順が違うと引っかからないことがある

  • 分野内で、最近よく利用されている技術や引用されている考え方を知りたい

前者については検索キーワードを変えながら、後者については自分で網羅的に文献を読むことにより、なんとか達成する事もできますが、分野のことをろくに知らない状態でワーディングを考えたり、ざっととはいえ論文を読むことは結構辛いものです。

「ヒットした文献内でよく参照されている論文」などを簡単に探すことができれば、上記の要望を満たせそうですが、残念ながらそのような要望を満たしてくれるような検索エンジンは僕の知る限り存在しません。

ならば自分で作ればよいのでは!?と考えたすえ、Microsoft Research APIsの中のAcademic Search APIを使用して論文検索エンジンを自作してみました。

自作したサイトはこちらです(APIの使用制限やエラー処理が適当なため動かないことがありますので、あしからず)。

ソースコードは下記。

中で使用しているクエリの書き方は以下2つの記事か、本記事内の「クエリ構文の書き方」をご参考ください。

以降は主にAcademic Search APIの使い方について記載していきます。

目次

Academic Search APIとは

Academic Search APIは、Microsoft Academicで使用されている論文データベースに、Microsoft Academicで使用されている自然言語による検索や内部的に使用されているクエリ構文でアクセスできるように提供されているAPIです。

月に10,000トランザクションまでという制限がありますが、無料で使用することができます。APIキーはこちらのページの「Subscribe」から簡単に取得することができます。

他にも上記の論文データベースにアクセスする方法がいくつか用意されていますす。

いずれの方法も利用回数無制限で使用できますが、手続きが必要であったりとAcademic Search APIに比べると気軽さが落ちますので、データをAggregationした結果を大量に使用する、というような重たいクエリを大量に発行するような使い方をする場合に検討してみるのがオススメです。

APIの種類と使い方

APIにはいくつかメソッドがありますが、主に使用するのはInterpetEvaluateです。

  • Interpet
    Microsoft Academic上の検索窓に入力するようなクエリを投げると、「Evaluate」メソッドで使用できるクエリの形式に変換したテキストが取得できるメソッドです。
    「query」に検索したいキーワードを入力し、「complete」を1に設定すると、検索窓で表示されるクエリ候補が返されるようなイメージです。

  • Evaluate
    専用のクエリ構文で記述したクエリに基づいて、各論文の情報を取得できるメソッドで、主に今回使用するのはこのメソッドです。
    「expr」にクエリ構文で記述したクエリ、「attributes」に取得したい論文に関する情報、「count」に取得したい論文の数(1000が上限)を指定します。

Evaluateメソッドは、「expr」と「attributes」には共通の表現を使用するなど、グラフ上のデータということもあり使い勝手はなんとなくGraph QLに似ています。

ただし、参照している文献のタイトルなども指定してまとめて引っ張ってくる、といったような使い方はできませんので、このあたりはプログラムで自分でカバーしてやる必要があります。

クエリ構文の書き方

クエリ構文のポイントは、①論文の属性で絞り込む、②Compositeを使用して論文の複合属性を絞り込む、③And/Orで複雑な条件を実現するの3つです。以下それぞれについて説明していきたいと思います。

論文の属性で絞り込む

論文の属性とよんでいるのが、この属性一覧に記載されている属性のうち、「.」が含まれていないもののことです。例えば、論文のタイトルである「Ti」や出版年である「Y」などです。

主に絞り込みで使用するのは、「W」や「Y」あたりです。

「W」は、論文のタイトルに含まれていて欲しい文字列を指定します。例えば「W='text'」といったように指定します。また、後で説明する「And」や「Or」と組み合わせることにより、「And(W='text',W='generation')」といった複数のキーワードを指定した検索を実現することができます。

「Y」は、上述しましたように論文の出版年のことで、「Y=2010」のようにクエリを指定します。数値なのでもちろん範囲指定や上限・下限を指定することができ、「Y<=2015」で2015年以前の論文、「Y=[2010, 2012]」で2010年から2012年に出版された論文を検索することができます。

Compositeを使用して論文の複合属性を絞り込む

ここで論文の複合属性と読んでいるのが、「.」が含まれている属性のことで、「AA.AuN」(著者名)や「F.FN」(分野名)のことです。

これらは上記のシンプルな属性とは異なり「Composite(AA.AuN='james')」のようにクエリを書く必要があります。論文を絞り込むための属性そのものが、一意に決定できないようなケースがあるため、このような特殊な書き方をします。

また、この性質のため、And/Or検索時の挙動には少し注意が必要です。本サイトの記事からの引用となりますが、例えば、「Composite(And(AA.AuN='mike smith',AA.AfN='harvard university'))」は「ハーバード大学に所属するmike smithが著者にいる」論文が検索されますが、「And(Composite(AA.AuN='mike smith'),Composite(AA.AfN='harvard university'))」は、「ある著書がmike smithで、ある著者がハーバード大学に所属する」論文を検索されます。

検索条件としてよく使用するのは、

And/Orで複雑な条件を実現する

And/Or検索はさして難しくなく、And()やOr()内に、有効なクエリを「,」で区切ることで実現できます。

例えば、「And(W='text',Y<=2015)」は、タイトルに「text」が含まれる2015年以前の論文を表しますし、「And(Or(W='text',W='sentence'),Y<=2015)」は、タイトルに「text」か「sentence」が含まれる2015年以前の論文を表します。

もちろん複合属性をクエリに含めることもでき、「And(Composite(F.FN='computer vision'),Y<=2015)」は、Computer Vision分野の2015年以前の論文を表します。

自分専用の論文検索エンジンを作る

上記までで、かなり複雑なクエリを実現できるようになりましたが、特に「分野内で、最近よく利用されている技術や引用されている考え方を知りたい」を見つけてきたい場合は、クエリ検索だけではいまいちなことがあります。

下記は、「And(W='dialogue',W='generation',Y>=2015)」(2015年以降の「dialogue」と「generation」をタイトルに含む論文)から上位10件をAPIを使用して検索した結果になります。重複した結果は、学会で発表された論文とarxivなどのプリプリント論文が別のものとして扱われているために発生しています。

- Semantically Conditioned LSTM-based Natural Language Generation for Spoken Dialogue Systems
- Semantically Conditioned LSTM-based Natural Language Generation for Spoken Dialogue Systems
- Adversarial Learning for Neural Dialogue Generation
- Adversarial Learning for Neural Dialogue Generation
- Deep Reinforcement Learning for Dialogue Generation
- How NOT To Evaluate Your Dialogue System: An Empirical Study of Unsupervised Evaluation Metrics for Dialogue Response Generation
- How NOT To Evaluate Your Dialogue System: An Empirical Study of Unsupervised Evaluation Metrics for Dialogue Response Generation
- Deep Reinforcement Learning for Dialogue Generation
- Multiresolution Recurrent Neural Networks: An Application to Dialogue Response Generation.
- Multiresolution Recurrent Neural Networks: An Application to Dialogue Response Generation

この検索結果はいくつか難点があります。1つは、明示的に検索クエリ(この場合は「dialogue」)が含まれる論文しか検索結果に含まれない点。その結果、分野に関連する代表的な論文を必ずしも見つけるができない、というのが2点目です。

Computer Vision」や「Natural Language Processing」のようなトピックとして整理されているレベルのものであればもっとマシな結果が得られますが、サブタスクのような実際に興味のある範囲や、新しく振興してきた分野については適当な結果が得られないことが多くあります。

複雑なクエリをプログラムで実現する

上記のようなケースで最も効果的なのが、「ヒットした文献内でよく参照されている論文」を見つけることです。基本的にはこれらは自力で論文を読む中で見つけてくるものですが、できれば最初から重要そうな論文を見つけたいというのが本音です。

Academic Search API一発では上記を実現できませんが、応答を元に集計処理を行えば簡単に上記のような論文を見つけることができます。

方針としては下記です。

  1. クエリにマッチするような論文を最大件数(1000件)検索する

  2. 応答内の各論文の「RId」属性を参照し、その論文が引用している論文を抽出する

  3. 抽出した引用されている論文を、引用数が多い順にソートする

  4. 引用数が多い上位N件の論文の情報を、Academic Search APIで再度取得する

この手順で先程と同じ「And(W='dialogue',W='generation',Y>=2015)」で論文を検索した結果が下記です。Seq2SeqやAttentionのような要素技術や、この分野で近年注目されている論文を効果的に取得することができています。

- Sequence to Sequence Learning with Neural Networks
- Neural Machine Translation by Jointly Learning to Align and Translate
- Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation
- Bleu: a Method for Automatic Evaluation of Machine Translation
- Long short-term memory
- Building End-To-End Dialogue Systems Using Generative Hierarchical Neural Network Models
- A Neural Conversational Model
- A Diversity-Promoting Objective Function for Neural Conversation Models
- A Hierarchical Latent Variable Encoder-Decoder Model for Generating Dialogues
- A Network-based End-to-End Trainable Task-oriented Dialogue System

まとめ

この記事では、Academic Search APIの紹介とそれをもとに作成した自作の論文検索エンジンについて紹介しました。

検索できるクエリは紹介したもの以外にも色々ありますし、プログラムを使用することも考えるとより複雑なクエリを実現することができます。

また、プログラムで論文管理ツールやスプレッドシートと連携することも簡単にできますし、APIがあるだけでサーベイ作業をだいぶ効率化できそうだなと考えています。

ぜひ皆さんも自分専用の論文検索エンジンを作ってみてください。