DDN's Library

強化学習に関する論文まとめやちょっとしたシステム開発について

arxivライブラリを用いたSlackでの翻訳bot

「arxivAPIを叩いてsummaryをとってきて,その翻訳結果をSlackに投げる」という内容のブログが既に多く公開されています.

ただ,Pythonarxivライブラリを用いて処理を行なっているものが見当たらなかったため,これを用いて簡単に行う方法を掲載します.

流れとしては以下の通りです.

  1. arxivライブラリを用いてを情報を抽出する
  2. Googletranslatorライブラリを用いて翻訳
  3. Slackへ翻訳結果を返す

実行例

f:id:ddnpaa:20191024105508p:plain

さらに,herokuを用いて定期実行を設定することで,定期的に翻訳結果をslackに返すことができます.

1. arxivライブラリによるsummaryの抽出

はじめに,arxivライブラリを用いてsummaryの情報を抽出します.

今回は以下のようなフォーマットにするため,

  1. タイトル
  2. URL
  3. summary

の3つを抽出します.

''タイトル:
{}

URL:
{}

abstract 原文:
{}

abstract 日本語訳:
{}

arxiv.queryで情報を抽出します.今回は例として「off policy」という用語がabstractに含まれている論文のなかで,最も新しいものを1つ抽出します.

l = arxiv.query(query='abs:"off policy"',max_results=1,sort_by="lastUpdatedDate")

また,抽出したデータに対してKeyを指定することで,狙ったデータをさらに抽出することができます.詳しくは以下のリンク先をご参照ください.

https://note.nkmk.me/python-arxiv-api-download-rss/

今回は.[“title”],[“id”],[“summary”]でタイトル,URL,abstractを抽出します.

title=l[0]["title"]
url=l[0]["id"]
summary_en=l[0]["summary"]

実装コードまとめ

import arxiv
import time

l = arxiv.query(query='abs:"off policy"',max_results=1,sort_by="lastUpdatedDate")

#情報の抽出
title=l[0]["title"]
url=l[0]["id"]
summary_en=l[0]["summary"]

2. Googletranslatorライブラリを用いて翻訳

次に,抽出したデータを翻訳します.翻訳にはGoogletranslatorを用います.

from googletrans import Translator
translator = Translator() 

ここで,単に抽出したデータを翻訳関数に渡すと,改行により翻訳精度が落ちるため

summary_en = summary_en.replace('\n', ' ')

によって,改行を省きます.

翻訳はGoogletranslatorインスタンスのtranslate関数に,(翻訳したい文章,翻訳後の言語)を渡すことで行えます.

summary=translator.translate(summary_en,dest="ja").text

実装コードまとめ

from googletrans import Translator
translator = Translator() 

summary_en = summary_en.replace('\n', ' ')

summary=translator.translate(summary_en,dest="ja").text

3. slackへ翻訳結果を送信

次に,2で翻訳した結果をslackに送信します.

そのために,slackの拡張機能である「Incomming Webhook」を用います.

Incomming Webhookの設定

簡単に説明すると,以下の手順でWebhook URLを取得するのが目的となります.

  1. Slackをインストールし,チャンネルを作成する
  2. slackアプリストアの検索エンジンで「incoming-webhooks」を検索しページに飛ぶ
  3. incoming-webhooksを設定に追加する

f:id:ddnpaa:20191023180520p:plain

4.最後に得られる「Webhook URL」をコピーしておく

実装コード

まず,Webhook URLを変数に格納します.

slack_url ='Webhook URL'

続いて,2での翻訳結果を含めたタイトルなどの情報を,1で示したフォーマットにして変数に格納します.

text = '''タイトル:
{}

URL:
{}

abstract 原文:
{}

abstract 日本語訳:
{}


'''.format(title, url, summary_en,summary)

最後に,json形式で「requests.post」で渡して,slackに翻訳結果を送信します.

data = json.dumps({
'username': 'arxiv summary',
'text': text
})

requests.post(slack_url, data=data)

実装コードまとめ

import requests
import json

slack_url ='https://hooks.slack.com/services/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'

text = '''タイトル:
{}

URL:
{}

abstract 原文:
{}

abstract 日本語訳:
{}


'''.format(title, url, summary_en,summary)


data = json.dumps({
'username': 'arxiv summary',
'text': text
})

requests.post(slack_url, data=data)

4. herokuによる定期的に実行

定期的に実行するためにherokuを用います.

準備

会員登録をしてから以下の手順でコマンドを実行してください

  1. heroku login
  2. heroku create -a 任意の名前
  3. heroku buildpacks:set heroku/python -a 2で決めた名前
  4. 必要なライブラリが記述されたファイルを「requirements.txt」として作成
  5. git init
  6. heroku git:remote -a アプリ名 1.git add .
  7. git commit -m ‘init’
  8. git push heroku master

requirements.txtの中身

arxiv==0.5.1
googletrans==2.4.0
requests==2.21.0

テスト

ファイル名をmain.pyとした場合

heroku run python main.py

でプログラムが動作すればok

定期実行

  1. heroku addons:create scheduler:standard --app アプリ名
  2. heroku addons:open scheduler
  3. 以下の画面がブラウザで開くため,「Create job」をクリック

f:id:ddnpaa:20191023204601p:plain

4.「Choose an 〜〜」で実行頻度を設定,「Run Command」で実行コマンドを記述

f:id:ddnpaa:20191023204811p:plain

5.以下の画面でscheduleを確認

f:id:ddnpaa:20191023204841p:plain

まとめ

arxivで取得した文章を翻訳し,Slackに送信するプログラムを定期的に実行する方法を掲載しました. また,文章取得はarxivライブラリ,翻訳モデルはgoogletranslatorを用いるため,簡潔に実装することができました. 今後は,翻訳モデルを自分で構築して,自然言語処理の知見を高めようと考えております.