雑記などいろいろブログ

Google Scholarから自動で論文を取り込んでWordPressに反映するSlackワークフローを作った

背景

現在所属している中澤・大越研究室のホームページには、採択された論文や発表会議の一覧を掲載するページ(以下、publicationsページ)がある。
https://www.jn.sfc.keio.ac.jp/publication/

このpublicationsページは、論文が採択されるたびに手動で更新する必要がある。また、「誰が・どこに採択されたか」という情報の元となる研究室共有の学会発表業績スプレッドシートも、学生のベストエフォートに任されているため記入漏れが起きやすく、実際にはSlackや対面で個別に確認する必要があった。

やったこと

そこで、教授のGoogle Scholarページから毎週自動で情報を取得し、publicationsページへ自動反映する仕組みを構築することにした。
Google Scholarは、出版社・大学・学術雑誌などが管理するリポジトリをクロールし、論文が公開されると著者名に紐づいた著者プロフィールページを生成・更新するサービスである。
このGoogle Scholarの著者プロフィールページを起点として、新しい論文が追加された場合にWordPressサイトを更新する仕組みを作る。

しかし、いざ実装しようとすると想像以上に大変だった。

課題1: WordPressの構成が魔境

サイトはWordPressで構築されており、過去の修士・博士の先輩方(すでに卒業済み)が数年単位で引き継ぎながら保守してきた経緯がある。ドキュメントは存在せず、Git管理もされていない。さらに、WordPressの設定変更やプラグイン追加が複雑に絡み合っている状態だった。
初めて触るWordPressを調査しながら構成を確認したところ、publicationsページはノーコード開発プラグインのElementorで表示枠を作成し、その中にZoteroという外部の文献管理サービスからWordPressプラグイン経由でデータを流し込む構成になっていることが分かった。

表示フローが把握できたため、スクリプトの実装に着手した。
SerpApiを利用すればGoogle Scholarから論文情報を取得できることが分かったため、GitHub Actionsで毎週定期実行するCIを構築し、Google Scholarに差分があれば更新処理を行うスクリプトを作成した。更新が必要な場合は、API経由で新しい論文を文献管理サービスのZoteroへインポートする仕組みにしている。

課題2: ジャーナル・国際会議・国内会議・プレプリントなどのセクション分け

WordPressに自動更新する上で、まだ1つ課題が残っていた。
publicationsページは、ジャーナル・国際会議・国内会議・プレプリントなどのセクションに分かれている。しかしGoogle Scholarから取得できるのは、論文タイトル・著者・年度・会議名などの基本情報のみであり、「査読あり/なし」や「口頭/ポスター/デモ」といった発表形式までは取得できない。これらをルールベースで正確に判別するのは難しい。

そこで、次の2つの方法を検討した。

  • 研究室のローカルLLMやGeminiをAPI経由で呼び出し、LLMに分類させる
  • Slackワークフローを用意し、人間が手動で仕分けする

最終的に、Slackワークフローを利用して人間が仕分けする方式を採用した。
LLMを用いる方法であれば一連の処理を完全自動化できる可能性がある。しかし、口頭/ポスター/デモといった発表形式はタイトルに明示されていない場合も多く、実際には本人への確認が必要になるケースもある。また、数年単位で運用することを考えると、LLMの仕様変更による影響も無視できない。将来的に後輩が引き継ぐ可能性を考慮し、保守コストが低い方法にした。

実際に動いている様子↓ LGTM

↓ 作業手順書(動画内リンク先)