自己紹介
こんにちは,ZOZOテクノロジーズの内定者さっとです.
普段は,インフラやサーバサイドを主に勉強していますが,最近はReactを触ったりしています.
※本記事はZOZOテクノロジーズ#5の2日目です.
概要(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に上げています.
環境構築方法や使い方も詳しく書いているのでやってみたい方はアクセスしてください.
事前準備
- フォーマットしたい論文の文章を事前に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に結合し文章を構築していきます.
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
セクション又はサブセクションを判定する
セクション又はサブセクションは以下のように表現されることが多いと思います.
1. hogehoge
1.2. fugafuga
正規表現を使って行頭が数字とピリオドで構成されているかをチェックして判断します.
# 読み込んだ行がsectionやsubsectionだったら
if line.match(/^[0-9]+.*$/)
report += line
next
この条件に引っかかった場合,行の末尾の改行を除去せずそのままreportに結合します.
空行があった場合
正規表現でタブを含む空白全般は\s
で表します.
# 空行があった場合
elsif line.match(/^\s*$/)
report += "\n" + line
next
end
行が空白だった場合は,改行してから空白を入れます.
また,空白の末尾にも改行があるので,つまり
hogehogehoge改行
空白空白空白改行
← 次の行からここに結合
といったようになります.
行末が-だった場合
英語の論文ではよく以下のような行を見ることがあるかと思います.
hogehoge hogehoge hogehoge ho-
gehoge.
そのまま改行すると単語が崩れてしまうので,ハイフンをいれて次の行に続くことを表しています.
これを考慮するためにプログラムでは行末に"-"があるかないか判断しています.
# 文字列の最後が-なら-を消して行を結合
if report[-1] == "-"
report = report.chomp("-") + line.chomp
next
end
ハイフンがある場合は,ハイフンを消して,さらに,行の末尾の改行を消して結合します.
それ以外の行
普通の文章であれば,先頭に空白を入れて,行末の改行を消して結合します.
report += " " + line.chomp
実行
プログラムを実行してみます.
文章量によって多少時間がかかるかもしれません.
$ ruby main.rb
フォーマットされた文章がformat-report.txt
出力されます.
1. Introduction
hogehoge. hogehogehoge. hogehogehogehoge.hogehoge.hogehogehogehogehogehogehogehogehoge, hogehogehogehogehogehogehogehogehogehoge.
2. Related Works
hogehoge. hogehogehoge. hogehogehogehoge.hoge. hoge.hogehogehoge.hogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehoge.
こちらをGoogle翻訳に貼り付ければ上手く翻訳してくれそうですね.
ちなみに,以前にGoogle翻訳APIを無料で作る方法という記事を書いているので,
これと連携すればシームレスに翻訳できるかもしれません.
Google翻訳でまとめて翻訳 (追記)
論文フォーマットを友人に教えたところ,
Googleドキュメント翻訳を使って便利そうに翻訳していたので,その方法を紹介したいと思います.
Googleドキュメント翻訳
様々な言語で書かれたドキュメントを翻訳してくれるサービスです.
字数制限の上限が一般的なGoogle翻訳に比べ大きいので,一気にたくさん翻訳できると思います.
フォーマットしたファイルを翻訳
- ドキュメントページに飛び,format-report.txtを貼り付ける
- 最後に翻訳ボタンを押すと,翻訳してくれます.
途中で,翻訳されず,英語が返ってくる場合は,文字数制限に引っかかっているので
切り取るなどして調節してください.
おわりに
今回は,Rubyを使って英語論文をGoogle翻訳へ貼り付けるためにフォーマットするツールを紹介しました.
本来はこんなツール使わずに読めることが大事ですが...
こちらのツールはGitHubで公開しているので,興味ある方はぜひ使ってみてくださいね!
https://github.com/sattosan/report-formattaro