Re.ゼロから始める自動翻訳機開発!その1


何をするのか?

中学3年間で習う英文法のエッセンスを詰め込んで文法的に正確な翻訳できるプログラムを作る。そして、アプリ化する。もちろん現在の翻訳サービス、DeeplやGoogleTranslationなどが英文法を使っていないのは百も承知。もし仮にも英文法をサービスに組み込んで置きながらあのガバガバ翻訳だったら怖い。ですが、そんな機械学習を用いた翻訳は今機械学習の入門書を読んでいるうp主には無理。という理由もあるが、実際は英語学習のモチベを保つ為であるのは内緒です。英文法を勉強するだけではうp主のモチベが折れて、勉強しなくなってしまう。それを避ける為に今回のプロジェクトを立てた理由です。

仕様を考える

と言われても今作りたい物がアバウト過ぎるのでしっかりと仕様を考える。まずは日本語を英語にするのかそれとも英語を日本語にするのかだが、後者を選択したいと思う。なぜなら日本語は主語が無くても通じる節があり、その文の主語を補う方法が思いつかない。よって消去法により後者、英語を日本語に自動翻訳するシステムにしようと思う。次に決めるのはプログラミング言語を選定して行く。まずパッと思い付くのはJavaScriptやCやPython。この3つの言語ならどれにするべきか?言語処理などのライブラリーが多いのはPythonが多いいらしい(ソースは俺)。あとアプリ化の件についてだが、JSはプログラムはエレクトロンなどでアプリ化出来た気がする、PythonではkivyやTkinterなど他にも沢山ある。Cは全くアプリの作り方は分からない。自然言語処理の便利なライブラリーがありそうで、簡単にアプリ化出来そうな言語と言う事でPythonで作るのとに使用。

開発環境

テキストエディター

テキストエディターはVSCodeを使用します。
一応VSCodeに入れている拡張機能を箇条書きして置きます。

  • Git History
  • GitHub Pull Requests and Issues
  • GitLens — Git supercharged
  • Japanese Language Pack for Visual Studio Code
  • Jupyter
  • Python
  • SQLite
  • Tabnine Autocomplete AI: JavaScript, Python, TypeScript, PHP, Go, Java, Ruby, C/C++, HTML/CSS, C#, Rust, SQL, Bash, Kotlin, React

ターミナル

iTerm2を使用します。なおターミナルにはpip,pip3,git,homebrewがインストール済み

Pythonバージョン

3.6.5を使用します。

セットアップ

初めにiTerm2でプロジェクトフォルダーを作成しますターミナルを立ち上げ、次のコマンドを実行して下さい。

% cd Documents/
% mkdir translation
% cd translation/
% touch main.py
% git init
% git add .
% git commit -m "first commit"

次にGitHubに行って新規リポジトリを作成します。GithubのプラスボタンからNew repositoryを押して、次のページに移動してください。設定は写真の通りにして大丈夫です。プライベートで開発した場合はPrivateを選択するといいかもしれません。
上の写真の様になれば成功です。
最後にremoteリポジトリとローカルリポジトリを関連付けしてローカルの内容をpushします。次のコマンドを実行して下さい。

% git remote add origin https://github.com/lot-uni/translation.git
% git push origin master

httpsの所はQuick setupの所をコピーして自身のURLに置き換えて下さい。

開発開始

いよいよ開発開始です、張り切っていきましょう。外部のファイルにpythonのリスト型で単語帳を作っていきます。iTermから次のコマンドを実行して下さい。

% touch writes.py

次にGoogleスプレットを新規で作成して次の様に単語をシートごとに分類してcsvファイルを作成します。今回作ったスプレットシートのリンクはこちらからどうそ。ファイルのcsvをそれぞれのシートをダウンロードして前についているen_words - を削除して現在開発しているディレクトリーにファイルを移動させて下さい。

次にコードを書いて行きます。
pickleライブラリを使って外部に英単語辞書を作成するので、別のPythonファイルを作成します。次に今作ったこのコードを書いて行きます。VSCodeを開きましょう(特にコードは長くないのでvimで編集しちゃったのは内緒)

import pickle
import pandas as pd

list_csv=["subject","verb","noun"]
word_list=[]

for i in list_csv:
    list0=[]
    list1=[]
    data = pd.read_csv(i+".csv", header=None).values.tolist()
    for word in data:
        list0.append(word[0])
    for word in data:
        list1.append(word[1])
    WordList=dict(zip(list0,list1))
    word_list.append(WordList)

with open("Words.pickle", mode='wb') as f:
    pickle.dump(word_list, f)

これを実行すると、Words.pickleというバイナリー化されたファイルが生成できます。これで何か追加があればスプレットシートに書き込みcsvをダウンロードしてプログラムを実行するだけで、データの更新ができる用になりました。最後にバイナリー化した単語達を取り出して行きましょう。main.pyにプログラムを書いていきます。

import pickle

with open('Words.pickle', 'rb') as f:
    fruits_color_dict_pkl = pickle.load(f)
for i in range(3):
    print(fruits_color_dict_pkl[i])

#出力
#{'student': '学生', 'teacher': '先生', 'engineer': 'エンジニア'}
#{'i': '私', 'you': 'あなた', 'he': '彼', 'she': '彼女'}
#{'am': 'be_verb', 'are': 'be_verb', 'is': 'be_verb'}

最後にGithubに今回の成果をpushしましょう。iTerm2を開いて開発しているディレクトリに移動してから次のコマンドを打って下さい!

% git add .
% git commit -m "英単語をバイナリー化して外部保存できる様にしたのぜ!"
% git push origin master

終わりに

疲れたので今回はこれで終わりにしたいと思います。多分今週中にはいよいよ中学一年のbe動詞の範囲から順々に実装して行くので、よかったらまた見て下さい。プログラムはまだまだ未熟なので、色々コードに不満があったらコメント送って下さい!あと今回作ったファイルはこちらからクローンするのが手っ取り早いかと。良ければ使って下さい