[小ネタ] 雑に英語の記事を読むための sumy

2020.12.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

注意事項

紹介するツールはあくまで機械的な要約なので、要約の正しさは保証できません。

また、翻訳ツールを使った際も適切な変換が行われていることが保証できないため、原文を参照されるのが好ましいです。

前置き

日本に住んでいても、情報を収集する際に英語の記事を読む機会は必然と増えていきます。 日本語であれば、斜め読みである程度概要を抑えることはできるのですが、英語となると単語や文法でつまずいてしまいます。 その結果、時間をかけて読んだ内容が本題とは程遠い前置きだったときには徒労感が拭えません。

そのため、 優先度を決めて、優先度の高い記事だけ目を通しておきたいです。 なので、いったん要約したものを翻訳すれば優先度にズレがないのでは、と思い試してみました。

今回、有名な sumy という Python 製のライブラリが CLI に対応していることを知ったので紹介します。

https://github.com/miso-belica/sumy

環境

❯ sumy --version
0.8.1

❯ python --version
Python 3.9.0

❯ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.7
BuildVersion:   19H15

導入

brew では提供されていなかったので pip でインストールします。

pip install sumy

docker image も用意されているとのことです。

各種言語への対応には一手間が必要です。 例えば下記のようなライブラリを入れたり、コマンドを実行する必要があります。

# 日本語用
pip install tinysegmenter

# 英語用
python -c "import nltk; nltk.download('punkt')"

使い方

アルゴリズムを必ず指定する必要があります。 また、オプションで言語(デフォルトは英語), フォーマット(デフォルトは plaintext), 長さを指定できます。 フォーマットには plaintext のほか、html も対応しています。

sumy text-rank --url=https://classmethod.jp/ --language=ja

pbpaste | docker run -i --rm misobelica/sumy luhn --format=plaintext --length=20%

対象のアルゴリズムについては下記を参考にすると良さそうです。

https://github.com/miso-belica/sumy/blob/master/docs/summarizators.md

翻訳用コマンドの導入

私は英語が読めないので、Google Translate を Terminal から実行するコマンドも入れます。

https://github.com/soimort/translate-shell

brew install translate-shell

実際の使用例

実際に URL からテキストを取得して要約して、翻訳するやり方です。 google translate に実行制限数があるのか不明ですが、時々真っ白になるので手前でファイルに落とし込んでおくと吉です。

curl -sSL "${url}" \
  | sumy text-rank --format=html --language=en \
  | tee /tmp/x \
  | trans en:ja --brief

TIPS

英語と日本語が含まれていると上手く要約できない

日本語と英語が入り混じっていると、要約がうまくいかない場合がありました。 その際は 対象の箇所だけを抜き出すと良いです。ある程度崩れた HTML でも読み込んでくれるので。

例えば Golang では下記のような HTML を抽出するのを楽にしてくれるライブラリがあります。 雑に扱う CLI を作って対応しました。

# go get -v github.com/mijime/dotfiles/gotools/cmd/go-queryh/...


curl -sSL "https://dev.classmethod.jp/articles/mapping-lambda-error-to-apigateway-with-sls/" \
  | go-queryh -query=div.content \
  | sumy text-rank --format=html \
  | trans en:ja --brief

動画の字幕ファイルを要約する

各字幕ファイルをテキストにして、要約すれば動画を見る必要がないのでは。と思ったんですが、 実際の字幕ファイルのフォーマットには時間や装飾が入っているため、そのままでは難しいです。

例えば Golang では下記のような SRT, WebVTT をパースしてくれるツールがあります。 雑に扱う CLI を作って対応しました。

# go get -v github.com/mijime/dotfiles/gotools/cmd/go-vtt2txt/...

# 字幕ファイルはブラウザから DeveloperConsole を開いて適当に流れてきたものをダウンロードします。

cat "${vtt}" \
  | go-vtt2txt \
  | sumy text-rank \
  | trans en:ja --brief

SPA で構築された記事を読む

ブログ系は ServerSideRendering されていることが多いのか、あまり困ったことはないのですが。

一応 puppeteer を使った headless browser で HTML を出力するようにスクリプトを用意しました。

https://github.com/puppeteer/puppeteer

https://github.com/mijime/dotfiles/blob/master/scripts/pcurl.js

node pcurl.js --out "${url}" | sumy text-rank

RSS で流れてきた記事を読む

こちらは大変質の高い Developers.IO という技術ブログの内容を垂れ流す例です。

画像と code block が多いためか、上手く要約できていません。 また、記載されている言語も豊富なのですが、要約は日本語だけになっています。

# brew install jq
# go get -v github.com/mijime/dotfiles/gotools/cmd/go-feedj/...
# go get -v github.com/mijime/dotfiles/gotools/cmd/go-queryh/...
# go get -v github.com/mijime/dotfiles/gotools/cmd/uniqline/...


while true; do \
  curl -sSL https://dev.classmethod.jp/feed/ \
  | go-feedj  \
  | jq -rc "[.link,.title]|@tsv"; \
  sleep 5m; done \
  | uniqline  \
  | while read -r url title; do \
  echo -e "\n# $title\n\n- $url\n"; \
  curl -sSL "${url}" \
  | go-queryh -query=div.content \
  | sumy text-rank --format=html --language=ja; \
  sleep 1m; \
done

出力例です。

# 【速報】低コストでプロビジョニング可能!新しいEBSボリュームのgp3が発表されました!#reinvent

- https://dev.classmethod.jp/articles/ebs-gp3/

項目gp2gp3耐久性99.9%99.9%IOPS100 IOPS ~ 16,000 IOPS 3,000 IOPS ~ 16,000 IOPSスループット〜 250 MiB/秒 250 MiB/秒 〜 1,000 MiB/秒 ストレージ料金 (月あたり、1GBあたり、東京リージョン)$0.12 $0.096 IOPS料 金(月あたり、1GBあたり、東京リージョン)- 3,000 IOPSまで無料 、 $0.006/IOPS (3,000IOPS超える場合)スループット料金(月あたり、1GBあたり、東京リージョン)- 125 MB/秒まで無料 、 $0.048 MB/s (125 MB/sを超える場合) gp2はボリュームサイズによってIOPSが割り当てられ、ベースラインパフォーマンスで100IOPSが保証されておりました。
gp3は 3,000IOPS がベースラインとして保証され、さらにそれ以上のIOPSが求められる場合は追加料金を払うことで最大16,000IOPSまで拡張できます。
また、追加料金を支払うことで個別にスループットとIOPSを拡張できますので、アプリケーション要件に合わせて使用することができます。
ベースラインパフォーマンスは大幅に上がっているので、これまでのように不要なボリューム追加やプロビジョンドIOPSを使わなくて済むケースが増えると思います。

# [速報] 機械学習に特化したAWSの二つ目のカスタムチップ「Trainium」が発表されました! #reinvent

- https://dev.classmethod.jp/articles/202012-reinvent-breaking-trainium/

前述の通りTrainiumが使えるようになるのは2021年を予定していますが、早期アクセスのためのサインアップが出来るようになっています。

感想

sumy という CLI を使って、本文を要約するようにしました。 本当に適切だったかどうかについては翻訳したテキストと比較しているため、精度は不明ではあります。 ただ、元の言語に馴染みがない場合は強く恩恵を受けているように感じられますので、是非馴染みのない言語の記事を読む際はお試しください。