NLP若手の会のハッカソンで賞をもらった話

#NLP#YANS#YANS2018

ACL、NIPSの論文を国別でフィルタリングするサイトを作りました。

参加経緯

東大のアントレプレナーシップ関連で知り合いになった自然言語処理の博士の方に、NLP若手の会なるものがあると教えてもらいました。 早速NLP若手の会(YANS)の第13回シンポジウムに参加しました。香川までひとっ飛びしてきました。 帰りの飛行機まで5時間以上あるので空港でこの投稿を書いています。   さて、完全にオブザーバーとして参加するつもりだったのですが、ひょんなことから交流企画のハッカソンに出場しました。 (クルージング企画定員オーバー→クロックスなのでフットサルも参加できず→ツワモノの集いへ…)

ハッカソン概要

以下の3つのコースが用意されていました。

  • 論文分類タスクコース
    • 論文のテキストデータからAccept/Rejectの二値予測
  • 論文分析コース
    • どういう論文がAcceptされるか/されないかの分析・考察
  • 自由コース
    • NLPに関するツールの開発

僕は3つ目のコースを選択しました。 明らかに猛者っぽい人たちが上2つのコースへ集まっていたので。   ちなみに本ハッカソンについて詳しくはGoogle スライド、Github上で公開されています。

作ったもの

チームメンバー兼メンターのPFNの方のアイディアを実装しました。

課題

ACL、NIPSなどの論文はホームページでアーカイブされているが検索性が悪い。   例えばACLの2017年のページ。 リストとしては十分なんですが、とにかく無骨で、検索などのインターフェースがない。

ACL Anthology P17

  余談ですが、年ごとに文言が若干異なったり、pタグが閉じていなくてスクレイピングで戸惑ったりしました。 本当にもうちょっと凝ればいいのに。

解決方法

特に要望として上がった著者の出身国の視覚化とそれを条件とした絞り込み機能を実装しました。   まずACL、NIPSから各ペーパーについて以下の情報をスクレイピング。

  • タイトル
  • 著者名(リスト)
  • PDFへのリンク
  • Paperのタイプ(Long、Shortなど)

  次に著者名(英語表記)をGoogle Cloud Translation APIのdetectに投げてどの国の名前か取得しました。 名前から国を取得するにあたって既存のツールを調べましたが、英語表記だとそのまま英語と判定されるものや、依存関係でつまずくものなどを選択肢から外した結果、GoogleのAPIを使うことにしました。 検討段階で比較対象に挙げられたのは以下のものです。振り返ってみると全然比較していないですがハッカソンで時間もなかったのでご愛嬌。

  • langid: 使いやすいが英語表記の日本人名が「en」判定
  • polyglot: 依存関係の解消が面倒だった
  • language-detector: Javaわからんので後回しにして結局触らず
  • langdetect: 後回しにした結果触らず

というわけで、最終的にGoogleのAPIに著者名を全て投げました。 アルファベット表記でもちゃんとその名前が適する国が返ってきます。 「Ryota Yamada」は「ja」と認識されました。   以上の作業結果をJSONに吐き出してウェブ側で利用します。 ウェブ側はFlaskアプリケーションをHerokuにあげて発表中に触ってもらえるようにしました。 国選択するとJavaScriptで表示結果がフィルタリングされます。 検索ボックスにリアルタイム絞り込みを実装したかったのですが、それは間に合いませんでした。

デモ

https://www.youtube.com/watch?v=8VqeVgkCYHw   いつまで公開しているか、今後整備するかは不明ですが一応現状Herokuで動いています。

  コードはこちら。こっちはちょっとドキュメントとかGoogle APIの叩き方とかは整備しようかなと思います。

感想

普段チームで開発するということがないので孤独でない開発は楽しかったです。 チームメンバーは4人でした。左から、

  • ポスター発表でも表彰された優秀なNLPer
  • ひよこ自然言語処理マンの僕
  • PCを持たずにハッカソンに参加した強靭な魂の持ち主
  • コンピュータサイエンスのすべての分野に精通しているPFNの方

  特にメンターのPFNの佐藤さんにはお世話になりました。 ディレクション、フロントの整備、デプロイと素晴らしいメンターで「こ、これがコンピュータサイエンスの全てに精通している者…!」と初めての生PFNマンに感動しました。   個人的な振り返りとしてはスクレイピングとAPI叩くという担当範囲をちゃんとこなせたかなと思います。 ただ名前の表記から出身国を出すのは若干精度に難がありました。 例えば「Ari Rappoport」、「Yonatan Belinkov」、「Yoshua Bengio」などの名前が(恐らく)誤って日本語判定されました。 精度をあげようと思うなら所属機関とかも調べたりする必要があるかなと思いました。 まぁ、確実に学会側が投稿者の所属国データを持っているはずなので論文にそういった属性も反映してくれると分析が楽なのですが。 (個人的な取り組みの内容も相まって、いい加減非構造的な論文の書き方やめようよ、と思う。XMLで書きましょうよ。)   ポスターセッションを見る時間を多少削って開発に勤しんでしまったのは反省。振り返ればもっと高速に作業できたなと思います。 ただ格別興味のあるものに関してはちゃんと聞きにいけたので悔いはないです。   そんな感じで予定外でしたがハッカソンに参加できて楽しかったです。 金一封もらえたので、お土産代にしようと思います!