【完全無料】「スマホだけで」最新論文を速読しまくる方法【ChatGPT】

お疲れ様です。秋並です。

近年、ChatGPTを使うことで今までよりも効率的に様々な作業を進めることができるようになり、「論文読み」もその中の一つだと思います。

<br>

私も、ChatGPTで最新の論文を要約することがあるのですが、効率の面からパソコンで作業することが多かったです。

一方で、「スマホでもっと手軽にこの作業を完結させることができないかな」とも感じていました。そこで、今回は
- 「スマホだけで」arxivから最新の論文を取得し、ChatGPTに要約してもらう方法

について解説したいと思います。

<br>

# 使用ツール
- google Colaboratory

- ~~ChatGPT（有料版）~~
    - ~~無料版の場合は、今回の方法は使用できません~~

- ChatGPT（無料版）
   - **2024年5月30日のアップデートにて、無料ユーザでもGPTsを利用できるようになりました！** 


# 手順
今回紹介する手順は以下のようになります
1. スマホでgoogle Colabratoryにアクセスし、「arxivから最新の論文を取得しテキストファイルに出力するプログラム」を実行
1. 生成されたテキストファイルの中身をコピー
1. コピーしたテキストファイルをChatGPT(ブラウザ版)に貼り付け要約

※ google Colabratoryは一般には、パソコンで作業するほうが効率が良いですが、今回の場合は「実行するだけ」なので、スマホでも十分快適に作業できます。


# 任意のカテゴリーの最新論文をarxivから取得する
google Colaboratoryでarxivから最新論文を取得するコードを作成します。
google Colaboratoryならスマホからでも実行することが可能です。<br><br>

最初に、google Colaboratoryで新しいノートブックを作成してください。

ノートブックを作成したら、arxivのapiとgoogle翻訳のapi（タイトルの翻訳に使用）を、pipでインストールしましょう。
```
!pip install arxiv
!pip install googletrans==3.1.0a0
```


<br>
インストールが完了したら、以下コードをコピペしてください。
以下コードは「任意のカテゴリの最新論文をarxivから取得する」コードになります。

:::note
（カスタマイズ箇所）と記述されている部分をお好みに応じて任意の設定に変更してください。

なお、編集作業は初回だけなので、一度設定が完了すれば以降は「実行するだけ」でOKなのでスマホでもストレスなく作業できると思います。
:::
```python
import arxiv
from googletrans import Translator

####################################################################################################################
# arxivから指定したカテゴリの最新の論文のpdfのURLを取得し、                                                        #
# chatGPTへ要約してもらうための質問の形式でtxtファイルに出力します。                                               #
# 手順：                                                                                                           #
# 1. 以下コードを好みに応じて編集した後実行してください。                                                          #
#    ※ 基本的には（カスタマイズ箇所）と記述してある箇所のみを、好みに応じて編集してもらえばOKです。               #
# 2. コードを実行して、生成されたtxtファイルの中身をコピーしChatGPTに質問文として投げてください。                  #
#    重要！）適切なGPTs（例：Sholar GPT）を選択しないと、エラーが出たり、でたらめな論文を要約しようとしたりします。#
####################################################################################################################

# 取得したい論文のカテゴリー(カスタマイズ箇所)
# 以下サイトから、任意のカテゴリーを選んでCATEGORIESに追加してください
# https://arxiv.org/category_taxonomy
CATEGORIES = {
    "cs.AI",
    "cs.RO",
}

# 最大何件まで検索するか(カスタマイズ箇所)
MAX_PAPER_NUM = 50

# 指定したカテゴリーの中で、arxivに投稿された最新の論文のURLを取得する
def get_recent_arxiv_paper_urls():
    query_categories_list = []

    # query用に「cat:カテゴリ名」の形のリストを作成
    for category in CATEGORIES:
        query_category_str = "cat:" + category
        query_categories_list.append(query_category_str)

    # queryを作成
    query =  " OR ".join(query_categories_list)

    search = arxiv.Search(
        query=query,  # 検索クエリ
        max_results=MAX_PAPER_NUM,  # 取得する論文数の上限
        sort_by=arxiv.SortCriterion.SubmittedDate,  # 論文を投稿された日付でソートする
        sort_order=arxiv.SortOrder.Descending,  # 新しい論文から順に取得する
    )

    recent_day = None
    paper_links = []
    paper_titles = []
    # 最新の日付の論文のみを取得
    for i, result in enumerate(search.results()):
        if i == 0:
            recent_day = str(result.published).split()[0]
        else:
            if recent_day != str(result.published).split()[0]:
                break
        paper_links.append(result.links[1])
        paper_titles.append(result.title)
        if len(paper_links) == MAX_PAPER_NUM:
            break

    translator = Translator()
    # 取得したURLをChatGPTに投げかける質問の形式でtxtファイルに保存
    with open(f'{recent_day}_paper_links.txt', 'w', encoding='utf-8') as f:
        ########################################################################
        # 以下の部分は「chatGPTにどのように要約してほしいか」を記述しているので
        # 好みに応じて質問文をカスタマイズしてください(カスタマイズ箇所)
        f.write("以下は論文の一覧です。以下のフォーマットに従って要約して下さい（各論文にはurlが含まれているので、urlから論文を参照してください）。\n")
        f.write("- 論文のタイトル\n")
        f.write("- どんなジャンルの論文か\n")
        f.write("- 論文の概要\n")
        f.write("- 論文の新規性\n")
        f.write("- 論文を読むにあたって必要な前提知識\n\n")
        f.write("なお、「◯/△番目の論文の要約」であること(◯は何個目の論文なのか、△は論文の総数)を最初に述べ、一つの論文の要約が終了したら、一旦中断してください。\n\n")
        ########################################################################
        for i in range(len(paper_links)):
            f.write(f"- [{i+1}番目] title:{paper_titles[i]}, url:{paper_links[i]}\n")
            f.write(f"  - 日本語訳：{translator.translate(paper_titles[i], dest='ja').text}\n\n")

    print(f"Output to '{recent_day}_paper_links.txt' is completed. (number of papers={len(paper_links)}, categories={CATEGORIES})")

def main():
    get_recent_arxiv_paper_urls()

main()
```


<br>

コードを実行すると、「＜最も最新の論文の日付＞_paper_links.txt」という名前のファイルが生成されるので、ダウンロードしましょう。
![DL_arxiv_txt.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/57780b71-b7be-56fa-0203-3c2d4ffa78f3.gif)

:::note
スマホの場合、ノートブックにすぐにアクセスできるようにショートカットをスマホのホーム画面上に作成しておくと良いと思います。
（以下は、chrome(android) で実行した動画になります）
![notebook_shortcut.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/c5cc8287-269d-a9cf-51aa-81f9cddc36e1.gif)
:::


# 生成した質問文でChatGPTに質問する

ダウンロードしたtxtファイルの中身は、以下のような「指定したURLの論文を要約してもらう」質問文になっているので、テキストファイルの中身をコピーしてください。
```plaintext
以下は論文の一覧です。以下のフォーマットに従って要約して下さい（各論文にはurlが含まれているので、urlから論文を参照してください）。
- 論文のタイトル
- どんなジャンルの論文か
- 論文の概要
- 論文の新規性
- 論文を読むにあたって必要な前提知識

なお、「◯/△番目の論文の要約」であること(◯は何個目の論文なのか、△は論文の総数)を最初に述べ、一つの論文の要約が終了したら、一旦中断してください。

- [1番目] title:Humanoid-Gym: Reinforcement Learning for Humanoid Robot with Zero-Shot Sim2Real Transfer, url:http://arxiv.org/pdf/2404.05695v1
  - 日本語訳：Humanoid-Gym: ゼロショット Sim2Real 転送によるヒューマノイド ロボットの強化学習

- [2番目] title:OtterROS: Picking and Programming an Uncrewed Surface Vessel for Experimental Field Robotics Research with ROS 2, url:http://arxiv.org/pdf/2404.05627v1
  - 日本語訳：OtterROS: ROS 2 を使用した実験フィールドロボット研究用の無人水上船舶の選択とプログラミング

- [3番目] title:Robust Control using Control Lyapunov Function and Hamilton-Jacobi Reachability, url:http://arxiv.org/pdf/2404.05625v1
  - 日本語訳：制御リアプノフ関数とハミルトン・ヤコビ到達可能性を使用したロバスト制御
```

:::note
スマホの場合、「すべて選択」→「コピー」の方がスムーズにコピーできます。
![android_copy.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/ad6eeda7-50fa-7753-e864-398f66c0397d.gif)

:::
:::note
androidの場合、開いたtxtファイルが文字化けしていることがあったのですが、「HTMLビューアー」で開くと文字化けしませんでした。
![mojibake.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/af505884-10a8-6b4a-6d1c-6e88a7ef1a24.gif)

:::


<br>

次に、ChatGPTサイトにアクセスしてください。

ChatGPTにアクセスしたら「GPTs」を「Sholar GPT」に設定してください。

::: note warn
適切なGPTsを選択しないと、上手くpdfが解析できなかったり、指定したURLとは異なる論文を要約したりするので注意してください。
:::

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/51380f8a-80ff-539c-6dd5-758da37ebfd1.png">

<br>
<br>

ここまできたら、準備完了です。
先程コピーしていたテキストを貼り付けると論文の要約を開始してくれます。

<img width="300" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/e110a2da-885d-1171-b4d3-5e7f5bbedd73.png">

<br>
<br>

1番目の論文の要約が完了したら、文章の生成が中断されると思うので、以降は
- *番目の論文を要約してください

と入力すると、論文を指定して要約してもらうことも可能です。
<img width="300" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/15ee0811-ad0f-aeff-e624-c3476ca318ac.png">
# さいごに
今回は
- 「スマホだけで」arxivから最新の論文を取得し、chatGPTに要約してもらう方法

について解説しました。

スマホだけで完結すれば、通勤/通学中などの時間も有効に活用できると思うので興味のある方はぜひお試しください。


# 参考サイト
[毎日の論文サーベイを手軽に！ChatGPTを活用したSlackへの3行要約通知とNotionデータベース連携](https://qiita.com/yuta0821/items/2edf338a92b8a157af37)