英語論文をフォーマットして翻訳する方法

## 自己紹介
こんにちは，ZOZOテクノロジーズの内定者さっとです．
普段は，インフラやサーバサイドを主に勉強していますが，最近はReactを触ったりしています．

※本記事は[ZOZOテクノロジーズ#5](https://qiita.com/advent-calendar/2019/zozo_tech5)の2日目です．

- [ZOZOテクノロジーズ#1](https://qiita.com/advent-calendar/2019/zozo_tech)
- [ZOZOテクノロジーズ#2](https://qiita.com/advent-calendar/2019/zozo_tech2)
- [ZOZOテクノロジーズ#3](https://qiita.com/advent-calendar/2019/zozo_tech3)
- [ZOZOテクノロジーズ#4](https://qiita.com/advent-calendar/2019/zozo_tech4)


## 概要（4行）

- 電子媒体の英語論文をGoogle翻訳を使って翻訳したい
- そのままコピペすると変な改行が入ってくるため上手く翻訳できない
- 簡単に翻訳できる形にフォーマットしてくれるツールを作る！
- フォーマットした英文を一気に翻訳してみる

## やりたいこと

### ツーカラムのよくある英語論文
```
1. Introduction
hogehoge. hogehogehoge. hogehogehogehoge.hoge-
hoge.hogehogehogehogehogehogehogehogehoge,
hogehogehogehogehogehogehogehogehogehoge.

2. Related Works
hogehoge. hogehogehoge. hogehogehogehoge.hoge.
hoge.hogehogehoge.hogehogehogehogehogehoge-
hogehogehogehogehogehogehogehogehogehoge.
```
これでは，行末に改行が入っているため，
Google翻訳にそのままコピペすると文章の変な位置で区切れてしまい上手く翻訳してくれません．

### フォーマットした後の文章
```
1. Introduction
 hogehoge. hogehogehoge. hogehogehogehoge.hogehoge.hogehogehogehogehogehogehogehogehoge, hogehogehogehogehogehogehogehogehogehoge.

2. Related Works
 hogehoge. hogehogehoge. hogehogehogehoge.hoge. hoge.hogehogehoge.hogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehoge.
```

これをGoogle翻訳に貼り付ければきっと上手く翻訳してくれるはず

## Rubyを使ったフォーマットプログラム
プログラムは[GitHub](https://github.com/sattosan/report-formattaro)に上げています．
環境構築方法や使い方も詳しく書いているのでやってみたい方はアクセスしてください．

## 事前準備

- フォーマットしたい論文の文章を事前に**report.txt**に保存しておきます．

```txt:report.txt
  
1. Introduction
hogehoge. hogehogehoge. hogehogehogehoge.hoge-
hoge.hogehogehogehogehogehogehogehogehoge,
hogehogehogehogehogehogehogehogehogehoge.

2. Related Works
hogehoge. hogehogehoge. hogehogehogehoge.hoge.
hoge.hogehogehoge.hogehogehogehogehogehoge-
hogehogehogehogehogehogehogehogehogehoge.
```

### メインプログラム

- プログラムは**report.txt**を一行一行読み込んでいます．
- 読み込んだ行は**line**に代入されます．
- その行はセクション又は，サブセクションなのか？文章なのかを判定し，フォーマットを行います．
- フォーマットした行は**report**に結合し文章を構築していきます．


```ruby:main.rb
begin
  report = ""
  # ファイル読み込み
  File.open('report.txt') do |file|
    file.each_line do |line|
      # 読み込んだ行がsectionやsubsectionだったら
      if line.match(/^[0-9]+.*$/)
        report += line
        next
      # 空行があった場合
      elsif line.match(/^\s*$/)
        report += "\n" + line
        next
      end
      # 文字列の最後が-なら-を消して行を結合
      if report[-1] == "-"
        report = report.chomp("-") + line.chomp
        next
      end
      report += " " + line.chomp
    end
    puts report
  end
  # ファイル書き込み
  File.open("format-report.txt", "w") do |f|
    f.puts(report)
  end
# 例外
rescue SystemCallError => e
  puts %Q(class=[#{e.class}] message=[#{e.message}])
rescue IOError => e
  puts %Q(class=[#{e.class}] message=[#{e.message}])
end
```

### セクション又はサブセクションを判定する
セクション又はサブセクションは以下のように表現されることが多いと思います．

```text
1. hogehoge
1.2. fugafuga 
```

正規表現を使って行頭が数字とピリオドで構成されているかをチェックして判断します．

```ruby
# 読み込んだ行がsectionやsubsectionだったら
if line.match(/^[0-9]+.*$/)
  report += line
  next
```

この条件に引っかかった場合，行の末尾の改行を除去せずそのまま**report**に結合します．

### 空行があった場合
正規表現でタブを含む空白全般は```\s```で表します．

```ruby
# 空行があった場合
elsif line.match(/^\s*$/)
  report += "\n" + line
  next
end
```

行が空白だった場合は，改行してから空白を入れます．
また，空白の末尾にも改行があるので，つまり


```text
hogehogehoge改行
空白空白空白改行
← 次の行からここに結合
```
といったようになります．

### 行末が-だった場合
英語の論文ではよく以下のような行を見ることがあるかと思います．

```text
hogehoge hogehoge hogehoge ho-
gehoge.
```

そのまま改行すると単語が崩れてしまうので，ハイフンをいれて次の行に続くことを表しています．

これを考慮するためにプログラムでは行末に"-"があるかないか判断しています．

```ruby
# 文字列の最後が-なら-を消して行を結合
if report[-1] == "-"
  report = report.chomp("-") + line.chomp
  next
end
```
ハイフンがある場合は，ハイフンを消して，さらに，行の末尾の改行を消して結合します．

### それ以外の行
普通の文章であれば，先頭に空白を入れて，行末の改行を消して結合します．

```ruby
report += " " + line.chomp
```

## 実行
プログラムを実行してみます．
文章量によって多少時間がかかるかもしれません．

```bash
$ ruby main.rb
```

フォーマットされた文章が```format-report.txt```出力されます．

```text:format-report.txt
  
1. Introduction
 hogehoge. hogehogehoge. hogehogehogehoge.hogehoge.hogehogehogehogehogehogehogehogehoge, hogehogehogehogehogehogehogehogehogehoge.

2. Related Works
 hogehoge. hogehogehoge. hogehogehogehoge.hoge. hoge.hogehogehoge.hogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehoge.
```

こちらをGoogle翻訳に貼り付ければ上手く翻訳してくれそうですね．

ちなみに，以前に[Google翻訳APIを無料で作る方法](https://qiita.com/satto_sann/items/be4177360a0bc3691fdf)という記事を書いているので，
これと連携すればシームレスに翻訳できるかもしれません．

## Google翻訳でまとめて翻訳 (追記)
論文フォーマットを友人に教えたところ，
Googleドキュメント翻訳を使って便利そうに翻訳していたので，その方法を紹介したいと思います．

### Googleドキュメント翻訳
様々な言語で書かれたドキュメントを翻訳してくれるサービスです．
字数制限の上限が一般的なGoogle翻訳に比べ大きいので，一気にたくさん翻訳できると思います．

[Googleドキュメント翻訳](https://www.dropbox.com/s/mn8oecc1fovlpay/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202019-12-11%2016.51.08.png?dl=0)

### フォーマットしたファイルを翻訳
<img width="669" alt="スクリーンショット 2019-12-11 16.50.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/5cd0ee4a-2229-e033-b6f1-9ddf99430157.png">

- ドキュメントページに飛び，**format-report.txt**を貼り付ける
<img width="670" alt="スクリーンショット 2019-12-11 16.51.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/baa16ae4-d112-699f-a7a9-c757e4ac6474.png">

- 最後に翻訳ボタンを押すと，翻訳してくれます．

途中で，翻訳されず，英語が返ってくる場合は，文字数制限に引っかかっているので
切り取るなどして調節してください．


## おわりに
今回は，Rubyを使って英語論文をGoogle翻訳へ貼り付けるためにフォーマットするツールを紹介しました．

本来はこんなツール使わずに読めることが大事ですが．．．

こちらのツールはGitHubで公開しているので，興味ある方はぜひ使ってみてくださいね！
https://github.com/sattosan/report-formattaro