先日twitterでこのようなツイートを拝見しました。
#医師 や #医学生 の方におすすめ✏️#ChatGPT を使って #PubMed の新着論文の要点を抽出して、自動でメールを受け取る Google App Script を作ってみました
— にし | 医療 x 技術の未来について発信 (@niniziv) March 21, 2023
・Google アカウントを持っているだけで誰でも使える
・UIをぽちぽちするだけで利用可
・タイトルと要点を箇条書きで出力
使い方はスレッド↓ pic.twitter.com/miRBoYGXLp
これはなかなかすごい・・・!
新着論文のメール通知はPubmedの公式サービスでも展開されており、実は結構簡単な登録で自分の好みに応じた検索ワードの論文をメール配信することができます。
Pubmed検索式とメール配信方法はYouTuber仲間である以下のエビデンスおばさんの記事にみっちりと書いてあります。
ところが、このメール配信を始めたはいいものの結局読まないことがあったりするわけです。ここにはまあ、モチベーションの問題というか、英語だと読むのに一苦労するとか、本文全部読むのはきついとか、いろんな言い訳があります・・・。
そもそも根本的にその検索した論文を本当に読む必要があるのかどうかということをきちんと考えないといけないわけですが、そこを語り始めると本筋から外れてしまいますので、ここではひとまず置いておきます。いかに力を抜きながら自分が読みたい論文をうまく拾い上げるかに重点を置いていくとやっぱり昨今発展の著しいAIの力を借りてみたいわけです。
そこで、ChatGPTを用いながら「試しに新規の論文要約+メール通知」と「指定した論文のpdf要約」の2つを実際に試してみました。ちなみにプログラミングについてはPythonとRを本当にわずかに触ったことがある程度で全くほぼ素人ですので、ネットの偉大な力を参考にしたのみです。そんな人間でもどのように利用できるかを見ていきたいと思います。論文要約についてはQuiitaの以下のページを参考とさせていただきました。
OpenAIのGPT-3.5系APIを使って論文を自動で要約する
(2023.05.13追記:自分でもAPIを使わずにコピペする方法などpythonコードを書いてみました。)
APIとは?
まずこれらをやる前に必要な「API」について簡単に説明します。APIとはApplication Programming Interfaceの略で、ソフトウェアやプログラムを他のものと連携して動かす仕組みを指します。最近だといろんなWebページでGoogleアカウント, twitterアカウント, Facebookアカウントなどでのログインが可能になっていますが、それも一種のAPI連携ですね。
Webブラウザ上で使えるChat GPTだと短い文章なら良いのですが、テキストをいちいちコピペしたり、長い文章を持ってくるのは大変なので、今回はChat GPTのAPIを用いて外部から得たデータを直接落とし込み、自動的に処理を進めてくれるような仕組みをみていきます。
このAPIの利用には個別に入手したAPI keyというものが必要です。入手方法は簡単です。
①OpenAIのWebページよりログイン
②右上のアカウントのアイコンを押して”View API keys”という欄をクリック
③”Create new secret key”を押す(一度しかキーは表示されないので必ずメモする!)
以上の手順で準備が整います。
なお、注意しなくてはいけないのはこのAPIの使用は基本的に有料です。アカウント使用開始から3カ月もしくは18ドルまでは無料で利用ができます。アカウント画面左側の欄の”Usage”をクリックすると残りの利用枠が確認できます。それがなくなった場合は課金が必要です。
以下の公式ページによると750文字が概ね1000トークン(1K token)で1K tokenあたりの値段が表記されています。Chat GPT4では$0.03-0.12/1K tokenなので、文字数によりけりですが、そこまで高くはありません。
ChatGPTによる新規の論文要約+メール通知
さて、まずはtwitterで紹介されていた論文要約の方法を試してみます。
ただただ、書いてある通りに進めればできますし、Antaa slideにも同じ方法をわかりやすくしたスライドがありますので、こちらも参考にすると容易にできると思います。
ChatGPTが新着論文を要約し毎朝メールしてくれる仕組みの作り方
あとはアレンジの仕方ですが、まずChatGPTに出す命令については3-4行目のコード(下図)を適宜好みに応じて変えれば良いので色々試してみると良いかもしれません。例えば、英語の専門用語はどうしても変な翻訳になることが多いので、「専門用語・固有名詞は英語のままにしてください。」などを追加しても良いかもしれません。
さらに続くコードとしてpubmedの検索クエリを入力します。
これは冒頭で紹介したエビデンスおばさんのページなどを活かして好みの検索ワードにすると良いと思います。通常通りの入力と同じになると思いますので、検索タグも流用できます。自分はとりあえず神経系の主要ジャーナル+ランダム化比較試験・レビューの組み合わせにしてみました。なお、16行目のpumed pubtypesは大文字小文字もきっちり入力しないと適切に論文を拾ってもらえないので注意です。
さて、続いて検索対象日数のアレンジをしようと思ったらうまくいかなかったので注意点として書いていきます。
注意点①日付の指定範囲
自分の場合毎日メールが来るのも、、、と思ったので検索対象日数を7日間にしようと思って変えてみたのですが、18行目をPUBMED_TERM=7にしても「7日前の検索結果」が届くのみでうまくいかない・・・。
これはどうやら下の方のコードをみていくと検索範囲の日数が特定の日のみとなっていたようなので、56行目からを少し追加しました。もっと何かちゃんとしたやり方があるのかもしれませんが、、、プログラムは正直分からないので勘と試行錯誤の結果です。(こうした方が良いよっていうのがあればむしろ聞きたいです)
60行目から、日数の終わりの部分にもう一つ関数を用意して(to1YYYYMMDD(date)という名前に変えています)、date.getDate()+7(要するにこれで間が7日間になるはず)として、これを64行目の&maxdate=${}の中に入れました。
こうすると無事7日間分の検索結果から論文を抽出することができました。コピペしやすいようにコードも一緒に貼っておきます。
function toYYYYMMDD(date) {
return [date.getFullYear(), date.getMonth() + 1, date.getDate()].join("/");
}
function to1YYYYMMDD(date) {
return [date.getFullYear(), date.getMonth() + 1, date.getDate()+7].join("/");
}
function getPaperIDsOn(date) {
const url = `https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&retmode=json&sort=pub_date&term=${PUBMED_QUERY}&mindate=${toYYYYMMDD(date)}&maxdate=${to1YYYYMMDD(date)}`;
console.log(url);
const res = JSON.parse(UrlFetchApp.fetch(url).getContentText());
return res.esearchresult.idlist;
}
注意点②6分の壁
もう一つ注意が必要なのはプログラムの実行時間が長いとGoogle Apps Scriptの問題でプログラムが停止してしまうということです。どうも6分間までしか施行できないようです。
なので、論文の数が多数になったりすると処理に時間がかかって実行できませんでした。これは対象の日数を減らして論文の本数を減らすか、対象となる論文の本数を減らすかしていくしかないように思います。ちなみにググるとこの6分の壁を打ち破る方法(主にはプログラムを途中で中断してその後に再開するコードを埋め込む)が多数出てきますので、試してみても良いかもしれません。自分はそこまで根気が続きませんでした(汗
ちなみに出てきた結果の一例はこんな感じです。
PubMed の新着論文のお知らせ
タイトル:難民の睡眠健康の改善:システマティックレビュー
要約:
– 目的:
– 難民の睡眠障害は一般的でありながら研究が不足しています。
– これらの人々の大多数が生活する資源の制限された環境で介入することは困難です。
– 難民の睡眠障害に関するシステマティックレビューが必要であり、その中で睡眠健康の現状や 共病性、限界を特定する必要があります。
– 最近の研究結果:
– 難民の中で不眠症や悪夢などの睡眠障害が高い割合で発生しています。
– 不眠症に関連する疾患として、線維筋痛症、心的外傷後ストレス障害、うつ病、不安症があります。
– リスクファクターには、トラウマ、移住、低い社会経済地位、低い教育水準、新規居住者の流 入が高いか戦争地域への近接性が含まれます。
– 成功した療法はほとんど見つからなかった。
– 概要:
– 本レビューは、この人口での睡眠障害の高い有病率とそのリスクファクターを特定し、治療の第一歩としてこの脆弱な人口での認知度向上の方法を提案しています。
https://pubmed.ncbi.nlm.nih.gov/36936393
もとの論文はこちら→https://pubmed.ncbi.nlm.nih.gov/36936393
共病性(おそらくはcomorbidities(合併症・併存疾患)のこと)のような誤訳もありますが、概ね読みやすい文章といっても良いのではないでしょうか。ざっと見通すにはちょうど良い感じの文章と言えます。正直これだけのアブスト的な短い文章なら英語で読めよと言われるとなんとも言えないのですが、、ハードルは確かに下がると思います。
ChatGPTによる指定した論文のpdf要約
さて、もう一つの利用方法として論文のpdfファイルをまるっと要約してもらう方法を見ていきたいと思います。
RCTみたいな決まりきった形式のものはざっくりとした流れが非常に読みやすいんですけれどreview articleやらopinon系のものは流れがないので何がどこまで書いてあるのかちょっとつかみづらいことがあるんですよね。後は自分の慣れない分野も読みづらいです。そこで概要をつかむのに使えないかということで今回はQuiitaで紹介されていた方法を試してみました。有難うございます。
OpenAIのGPT-3.5系APIを使って論文を自動で要約する
こちらもリンクが貼ってあるGoogle colabのページをコピーして使えば、そのまま簡単に使えます。このGoogle colabも全然知りませんでしたがWeb上で簡単にPythonを実行できるものなんですね。素晴らしい。
今回は例としてたまたま手元にあったNeurology誌のこちらのメタ解析を読んでみてもらいました。
Effect of Cholinesterase Inhibitors on Mortality in Patients With Dementia
自前の論文のpdfファイルさえあれば特に引っかかる点もなく使用できたので以下は使用感を書いていきます。
注意点①それなりに時間がかかる
文量があると当然それなりに時間を要します。とはいえ10ページ以上の論文で4,5分程度で要約できていましたのでかなり早いとは言えます。今回使わせてもらったプログラムではセクション毎の要約となるので文字数としては結構多いです。
上述したようにAPIの利用は文字数に応じて料金がかかるため、pubmedからの要約よりは値段がそれなりにかかることも注意点となります。
注意点②専門用語の翻訳精度はまだまだ低い
専門用語については正直意味不明な単語も多数見受けられました。出現頻度も低く、一般的なものからはデータが得られにくい専門用語の翻訳の精度を上げるのは結構難しいかもしれません。
今回要約したデータの一部をみてみます。統計解析の部分は割と良い方で要点を抽出しつつ、言葉もまあそれなりです。マークダウン形式なので読みやすいです。解読はできますが、どうしても用語は元のものを知らないと一部訳が分からないことにはなってますね、、、。
Backgroundはなぜかところどころバグってしまっていました。
このプログラムで使っているのはGPT-3.5だと思いますので、GPT-4だともしかしたらさらに改善されているのかもしれませんが、実用できるかと言われるとまだそこまでは、、、と思ってしまいました。
上述の例と同様に専門用語や略語については英語にするように指示を入れたり、あるいはもう端から英語で要約するようにしても良いのかもしれません。(その分自分の脳に負荷がかかりますが、、、)
ただ、このところの精度の成長の早さを見ていると数カ月~1年くらいでまた大きく変わるのかもしれませんね。
今後の展望
プログラミングができない自分ですら結構面白く扱うことができましたが、実用的にするにはあと一歩細かいところの調整をもっとできるようにしたいところですね。
こういったプログラムを簡単に使えるようにしたツールや有料サービスは間違いなく増えると思われますので、今後の情報検索の在り方はその都度やりやすい方法を見直していく必要がありそうです。
きっと「効率が爆発的に上がる文献収集」とか「超速文献検索」とか色々うたい文句が出てくるのでしょうけど、こういったツールを用いたからといって無尽蔵になんでも詰め込めるわけではないので、自分に必要な情報は何なのか、どう集めればよいのかを落ち着いて考えることも合わせて必要そうですね。そうでないと、ツールばかり発展して情報を集めた気になったところで、ただそれに飲み込まれてしまいそうです。
間違っても元文献を読まずにAIが要約したものだけをみて、参考文献として出したり、その情報を広めたりするような使い方は避けたいですね。
コメントを残す