「ほん訳コンニャク」 を食べて 論文を読もう

# TL;DR;

　以下の<font color="#0f3c4b"><b>「ほん訳こんにゃく」</b></font>を作った。

[![Translation-Gummy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308700/aa1d86f1-cb24-0a09-f119-915a5fa2166c.png)](https://elb.translation-gummy.com/)

[![PyPI version](https://badge.fury.io/py/Translation-Gummy.svg)](https://pypi.org/project/Translation-Gummy/) [![GitHub version](https://badge.fury.io/gh/iwasakishuto%2FTranslation-Gummy.svg)](https://github.com/iwasakishuto/Translation-Gummy) [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/iwasakishuto/Translation-Gummy/blob/master/examples/Colaboratory.ipynb) [![Documentation](https://img.shields.io/badge/Documentation-portfolio-001d34?style=flat-radius)](https://iwasakishuto.github.io/Translation-Gummy/index.html) [![website](https://img.shields.io/badge/website-Translation--Gummy-lightblue)](https://elb.translation-gummy.com/) [![Add to Slack](https://platform.slack-edge.com/img/add_to_slack.png)](https://elb.translation-gummy.com/slack_auth_begin)

（※ 上記のbadgeを 2020/12/18 に追記しました。 ）

## 作りたかったもの

　研究室配属で、かねてから取り組みたかった **「シナプス可塑性におけるmiRNA機能とそれらが記憶や学習などの高次認知機能に与える影響の解明」** を自分の研究テーマ<sup><b>（※暫定）</b></sup>にすることができ、生物系の論文を読む機会が圧倒的に増えたのですが、元々深層学習系統の論文しか読んでいなかったため、常識や背景知識不足に悩まされ、<font color="red"><b>[DeepL](https://www.deepl.com/en/translator)や[Google Translate](https://translate.google.co.jp/#)なしには論文が読めない</b></font>という日々が続いていました。

　論文を読みながら適宜翻訳するのは非効率ですし、iPadにPDFを保存して電車内で読むなんてこともできず、かといって全部一度翻訳するのは非常に面倒で、「これ、自動化したいな〜」と思ったので、<font color="red"><b>「論文のURLを投げれば、全文翻訳付きのPDFを生成するプログラム」</b></font>を作りました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">論文たくさん読みたいけど英語の勉強もしたいので、url投げたら全文翻訳付きのPDFに変換してもらうことにした。 <a href="https://t.co/dMvqU2PBa4">pic.twitter.com/dMvqU2PBa4</a></p>&mdash; しゅーと (@cabernet_rock) <a href="https://twitter.com/cabernet_rock/status/1277621714382254080?ref_src=twsrc%5Etfw">June 29, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## Python Package

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308700/745c14c9-8cea-5a2e-a7e6-4d8bc938b7b8.png)


　まず、Pythonで<b>[ライブラリ(Translation-Gummy)](https://pypi.org/project/Translation-Gummy/)</b>を作成しました。先に述べたことを実現するために必要な機能は

1. URLから論文の内容をスクレイピング → [`requests`](https://pypi.org/project/requests/),[`Beautiful Soup`](https://pypi.org/project/beautifulsoup4/),[`pdfminer`](https://pypi.org/project/pdfminer/), [`pylatexenc`](https://pypi.org/project/pylatexenc/)
2. スクレイピングした内容（英語）を日本語に翻訳 → [`selenium`](https://pypi.org/project/selenium/), [DeepL](https://www.deepl.com/en/translator), [Google Translate](https://translate.google.co.jp/#)
3. 両者を並べたPDFを作成 → [`jinja2`](https://pypi.org/project/Jinja2/),[`pdfkit`](https://pypi.org/project/pdfkit/)

ですが、それぞれ右に記した各種ライブラリ/サービスを使えば、実現可能です。

　なお、翻訳の際に `selenium` の **WebDriver** を使っていますが、これは以下のように `requests.get` でサイト（[https://translate.google.co.jp/#ja/en/これはペンです](https://translate.google.co.jp/#ja/en/これはペンです)）の内容を取得しても、**動的なサイト**であるため翻訳結果を取得することができないためです。

```py
# coding:utf-8
import requests
from bs4 import BeautifulSoup

html = requests.get("https://translate.google.co.jp/#ja/en/これはペンです").content
soup = BeautifulSoup(markup=html, features="html.parser")
:
```

※ より詳しいプログラムコードが見たい方は、[Github](https://github.com/iwasakishuto/Translation-Gummy/tree/master/gummy)からどうぞ。


（↓ 2020/08/28 追記 ↓）

導入方法を <a href="https://qiita.com/cabernet_rock/items/1f9bff5e0b9363da312d"><font color="#55c500"><b>『「ほん訳コンニャク」 を使ってみよう。』</b></font></a> で紹介しました。

（↓ 2020/09/30 追記 ↓）

ドキュメントを作成し、<a href="https://iwasakishuto.github.io/Translation-Gummy/index.html"><font color="#0f3c4b"><b>GitHub Pages</b></font></a> で公開しました。


## PDF converter
　
　<font color="red"><b>ローカルにあるPDFファイルを翻訳してくれるWebサイト</b></font>があれば良いなと思い、作成しました。ここでは [`pdfminer`](https://pypi.org/project/pdfminer/)を用いて翻訳を行っていますが、かなり雑な実装になってしまっているので、**Pull requests** をお待ちしています。<sub>（[`gummy.journals.LocalPDFCrawler`](https://github.com/iwasakishuto/Translation-Gummy/blob/master/gummy/journals.py) というクラスを用いています。）</sub>

　なお、WebサイトはAWSのEC2を使って公開しております。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308700/8d012e84-ac4d-bcf0-a6c7-0ebb8fc832e7.png)

　PythonしかかけないけどWebサイトを公開したい、という方はこの記事：[『PythonかければWebアプリぐらい作れる。』](https://qiita.com/cabernet_rock/items/852fc7c5d382fdc422a3)が参考になるかと思います。<sub>（自分の記事を紹介してしまい、すみません。）</sub>

## Slack App

　<font color="red"><b>Slack App として、コマンドで呼び出せれば楽</b></font>だと思い、作成し公開しました。

<img width="1153" alt="Screen Shot 2020-07-31 at 16.34.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308700/e24fb71a-b8f6-ec8d-935c-abdea25291b7.png">

　この時、

- OAuth認証を用いてワークスペースに基づいた `SLACK ACCESS TOKEN` を取得し、BOT投稿するためにPrivate Subnet内のRDSに `SLACK ACCESS TOKEN` を保存する。
- lambdaからデータベースへの多すぎるコネクションにより過負荷になることを避けるため、RDS PRoxyを使用し、コネクションプールを確立および管理をする。
- Slack Botに3秒以内にレスポンスを返さないといけないためlambdaからlambdaを非同期で呼ぶ。
- Private Subnet内のlambdaから直接lambdaを呼べないため、Public subnetに配置したNAT Gatewayを利用する。
- 負荷を分散するためにLoad Balancerを設置する。

などの機能を実現するため、以下のような少し複雑な構成となってしまいました。<sub>（改良点等あればコメントでご指摘ください🙇‍♂️）</sub>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308700/7ccd716f-6146-1d54-18e8-27b180d8b637.png)


## 終わりに

　自分の欲しい機能を全て実現したサービスができたと思います。対応ジャーナルの数を増やしたり、PDFの解析をより正確に行ったり、PDFをより綺麗に整えたりとまだまだ足りない機能は多々ありますが、使っていただけると幸いです。

<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>