Web記事をDeBERTaで自動タグ付けしてNotionに保存するスクリプトを作った
TL;DR
TwitterのDM(自分宛て)にストックしたいWeb記事のURLを貼り付けると、URLから記事情報を取得・DeBERTaでタグ付けしてNotionのデータベースに記事を保存するスクリプトを作った。これはその導入方法を説明する記事。
はじめに
こんにちは。
TwitterやRSSフィードを眺めていると、毎日有用なWeb記事が目くるめくスピードで流れてきます。
しかし、そういった全ての有用情報をその場で閲覧して記憶することは現実的ではないので、あとで読むために、もしくは記事が消えた後も読めるようにするために、記事を自分用のデータベースに保存しておきたい機会は無限にあります。
そういった需要に応える記事の保存ツールとしてPocketやNotion Webクリッパー、または単純にブラウザのリーディングリストといったサービスが存在し、各々最強の有用記事データベースを作っていることと思います。
ところで、自分はそれら全てを触ってみては使いこなそうと試み、しかし使い続けることができず、現在はTwitterのDM(to 自分)に記事のURLだけペタペタ貼るという古典的極まりない記事の保管方法を行い、この方法が間違っていることが分かりつつも現状を変える気が起きずに日々を過ごしています。
間違った記事保管方法の様子
上に挙げたようなサービスを使い続けられていない理由は2つあって、1つは記事の保存までにかかるコストで、これはまあ大したことはありませんが、もう1つの理由として、記事の保管場所をデータベースたらしめるためのタグ付けがダルすぎるからです。
記事データベースを作る以上、検索用タグをつけておいて後から引っ張り出せる必要がありますが、それがどうしようもなくダルい。Inbox
に貯まった大量の未分類記事を前にして、やるぞ、みたいな爽やかな気持ちになることは不可能です。
ついでに記事保存の方法についても、Notion Webクリッパーを使うには特定のアプリやブラウザで若干もっさりした動作を終了しないと保存できないし、保存場所が意外と選びにくいのがダルい。その点TwitterのDMはいつどこでもインターネットに繋がればサクッとアクセスできて貼るだけで終わりなので、ここに流れ着くのは必定といっても過言ではありませんでした。
とはいえ今のままでは一度見た記事を探してインターネットをうろちょろするだけで人生が終わりそうなので、現状を変えるべくTwitterのDMに貼った記事を自動でタグ付けしてNotionに保存するスクリプトを書きました。
導入
以下がその実装です。
お手元にまあまあイケてるGPUが載ったPCを用意できる方なら、以下の手順を踏むことで1~2時間後には動かせると思います。
- NotionとTwitterのアクセストークンを取得する
- Notionにデータベース(項目名は必ず"Name", "Tags", "URL"にする)のページを作成してIDを控える(コネクトも追加しておく)
git clone
-
docker build
(環境によってCUDAのバージョンは変えたほうがいいかも) -
config/config.py
を参考にしながら.env
にTwitterとNotionのアクセストークンとかNotionのデータベースIDとかを書く -
config/config.py
のCANDIDATE_LABELS
を好みで書き換える ./start_watcher.sh &
以上をやった上で自分のTwitterのDMにWeb記事のURLを貼ると、スクリプトが30分おきにDMを見に来て更新があれば諸々が動き、勝手にNotionのデータベースが更新されます。
自動タグ付けに使われるタグ候補は人間の手であらかじめ入力します。
.
.
.
スクリプトを動かすための必要な変数の一覧はconfig/config.py
に書いてあります。それぞれ簡単に説明します。
Notionで用意するもの
まず前提として、大体のユーザー依存の変数をプロジェクトルート下の.env
に書き込んでおき、load_dotenv()
で環境変数として読み込まれる想定になっています。
DATABASE_ID
Notionで作成したデータベースのIDです。データベースのページを開いたときのURLのこの部分がIDらしいです。
データベースは必ず以下のカラムが必要になります。
- "Name" : 記事タイトル欄、種類は"タイトル"
- "Tags" : タグ欄、種類は"マルチセレクト"
- "URL" : 記事のURL欄、種類は"URL"
加えて、データベース作成後にインテグレーションをコネクトに追加する必要があります。
これ
NOTION_ACCESS_TOKEN
このページでインテグレーションを作成した後に出てくる画面のシークレット
と書いてある部分のやつです。
Twitterで用意するもの
ここで作成できるやつです。
なお、App permissionsをRead and Write and Direct Messagesにするのを絶対に忘れないようにしないと403 errorが出ます。
Twitterトークンたち
TWITTER_API_KEY
, TWITTER_API_SECRET
, TWITTER_BEARER_TOKEN
, TWITTER_ACCESS_TOKEN
, TWITTER_TOKEN_SECRET
の5つが必要(?)っぽいです。多すぎる
TWITTER_USER_NAME
Twitterの自分のユーザー名(@抜き)です。例えば自分の場合は_determina_
になります。
タグ候補
自由にいじれます。タグは複数選択なので、それぞれ概念が被るタグを追加しても問題ありません。
.
.
.
このスクリプトができないこと
- 構造が難しいWebページを読み込むこと
- HTML(Readabilityで解析) → Markdown → Notionフォーマットという手順を踏んでから保存されているため、この手順の中の誰かが次に良くないバトンを渡したら総崩れします。
- 高精度なタグ付けをすること
- タグ付けにはDeBERTaの多言語モデルを使っていて、そのままでも結構すごい性能のモデルではありますが、このタスクのためにファインチューニングしているわけではないので、当然ながら変な結果を出すことがあります。
- これに関して、せっかくなのでファインチューニングしようかなと思ってます(幸運なことに教師データがいっぱい転がってるタスクなので)
- PDFとかも保存すること(やりたすぎ)
→[2023/01/08 13:59追記]arXiv限定でNotionに保存できるようになりました(まだ不具合多め)。
おわりに
自分で使う分には現状でもかなり便利ですが、色んな人が使うものとなると改善点だらけなので、強く優しい人がいたら改善のプルリクを何卒よろしくお願いします。自分でも気になる部分が出てきたら随時更新していきます。
Discussion