右も左も分からないような初心者がFuctional APIで翻訳機を作ってみた。

# はじめに
現在　n高等学校に通ってる者です。
Keras初めたての右も左もわからないかつ、
プログラミングもそこまでやってるわけではない初心者が
試行錯誤の末、架空言語の性能の悪い翻訳機を作った記事です。
記事を書くのも初めてなので、至らぬ点も多々あるかと思いますが、
少しでも同じ初心者の方の参考になれば幸いです。

# もくじ
- 動作環境
- 学習用データの用意
- データ作り
- 学習
- 実行
- まとめ
- 全コード
# 動作環境
- mac OS Big Sur
- anaconda Navigator 1.10.0
- Jupyter Notebook 6.4.3
- Keras 2.3.1
- TensorFlow 2.0.0
- numpy 1.19.2

# 学習用データの用意
今回使用した学習用データは
日本語と架空言語の対訳データで、
英語で表すなら
```wordlist_fl.txt
sushi
I like sushi.
I'm from Japan.
```
```wordlist_ja.txt
すし
わたしはすしがすきです
わたしはにほんからきました
```
みたいな英語とひらがなの対訳データを
私はざっと900個ほど用意しました。
(全然少ないので、もっと多い方が良いと思います)

# データ作り
ここからは、Jupyter notebook
で色々していきます。

勿論、学習させるためには、英語と日本語の対訳データを
AIが読み込めるような形にしなければなりません。
ここでは対訳データの文字を整数にしてそれを配列にします。

まず初めに多分必要なものをインポートします。
```1個目のセル.py
import pickle
```

次にファイルを読み込みます
```1個目のセル.py
# 例文や単語読み込み
with open('架空言語データ.txt', 'r') as f:
    text_fl = f.read().split("\n")
with open('日本語データ.txt', 'r') as f:
    text_ja = f.read().split("\n")
```
次に文字列を数値の配列にする関数を入れます。

※font_arrayに入る要素を増やして、
152って書いてあるところにfont_arrayの要素数を入れれば対応文字増やせます
```1個目のセル.py
#文字数値化関数
def text_to_array(text):
    font_array = [' ','１','２','３','４','５','６','７','８','９',' ','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','l','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','!','?',"'",',','.','"','…',';','あ','い','う','え','お','か','き','く','け','こ','が','ぎ','ぐ','げ','ご','さ','し','す','せ','そ','ざ','じ','ず','ぜ','ぞ','た','ち','つ','て','と','だ','ぢ','づ','で','ど','な','に','ぬ','ね','の','は','ひ','ふ','へ','ほ','ば','び','ぶ','べ','ぼ','ぱ','ぴ','ぷ','ぺ','ぽ','ま','み','む','め','も','や','ゆ','よ','ら','り','る','れ','ろ','わ','を','ん','ぁ','ぃ','ぅ','ぇ','ぉ','ゃ','ゅ','ょ','っ','ー']
    result = [text[i:i+1] for i in range(0,len(text), 1)]
    for i in range(len(result)):
        for i2 in range(152):
            font_array_id = str(i2)
            result[i] = result[i].replace(font_array[i2],font_array_id)
        result[i] = int(result[i])
    for i in range(64 - len(result)):
        result.append(0)
    return result
```
あとは順番
ファイルを保存したらセルはここで一区切りです。
```1個目のセル.py
x_item = []
y_item = []
for i in range(単語や文の数): 
    fl_item = text_to_array(text_fl[i])
    ja_item = text_to_array(text_ja[i])
    x_train.append(fl_item)
    y_train.append(ja_item)
    print(result)
    print(random_word)

items = [x_train, y_train]

with open("example_data.pkl", "wb") as f:
    pickle.dump(items, f)
```
# 学習
次に、学習用のセルに入っていきます。
まずは必要そうなものをインポートします。
```2個目のセル.py
import tensorflow as tf
import pickle
from tensorflow import keras
from tensorflow.keras.layers import Dense, Input
from tensorflow.keras.models import Model
```
次に保存した例文のデータを読み込みます。
```2個目のセル.py
with open("example_data.pkl", "rb") as f:
    data = pickle.load(f)
(x_train, y_train) = data
```
最後に学習を行なって、保存をします。
```2個目のセル.py
#入力層 -入れる配列の要素数を決めます
inputs = keras.Input(shape=(64))
#中間層
x = keras.layers.Dense(10000, activation="relu")(inputs)
#出力層 -出力される配列の要素数を決めます
outputs = keras.layers.Dense(64)(x)

#モデルをまとめて
model = keras.Model(inputs=inputs, outputs=outputs)
#コンプリートする。ここで損失関数とかいじれます。損失関数はmaeだと調子良さそうな気がします。
model.compile(loss="mae", optimizer="adam", metrics=["mae"])
model.summary()

model.fit(x_train, y_train, epochs=学習する回数)

#ここで保存します
model.save('ファイル名.h5', include_optimizer=True)
```
# 翻訳

インポートして、
```3個目のセル.py
import tensorflow as tf
import numpy as np
import math
from tensorflow import keras
```
文字を配列化とその逆を行う関数を配置して
```3個目のセル.py
def text_to_array(text):
    font_array = [' ','１','２','３','４','５','６','７','８','９',' ','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','l','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','!','?',"'",',','.','"','…',';','あ','い','う','え','お','か','き','く','け','こ','が','ぎ','ぐ','げ','ご','さ','し','す','せ','そ','ざ','じ','ず','ぜ','ぞ','た','ち','つ','て','と','だ','ぢ','づ','で','ど','な','に','ぬ','ね','の','は','ひ','ふ','へ','ほ','ば','び','ぶ','べ','ぼ','ぱ','ぴ','ぷ','ぺ','ぽ','ま','み','む','め','も','や','ゆ','よ','ら','り','る','れ','ろ','わ','を','ん','ぁ','ぃ','ぅ','ぇ','ぉ','ゃ','ゅ','ょ','っ','ー']
    result = [text[i:i+1] for i in range(0,len(text), 1)]
    for i in range(len(result)):
        for i2 in range(152):
            font_array_id = str(i2)
            result[i] = result[i].replace(font_array[i2],font_array_id)
        result[i] = int(result[i])
    for i in range(64 - len(result)):
        result.append(0)
    return result
def array_to_text(text):
    font_array = [' ','１','２','３','４','５','６','７','８','９',' ','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','l','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','!','?',"'",',','.','"','…',';','あ','い','う','え','お','か','き','く','け','こ','が','ぎ','ぐ','げ','ご','さ','し','す','せ','そ','ざ','じ','ず','ぜ','ぞ','た','ち','つ','て','と','だ','ぢ','づ','で','ど','な','に','ぬ','ね','の','は','ひ','ふ','へ','ほ','ば','び','ぶ','べ','ぼ','ぱ','ぴ','ぷ','ぺ','ぽ','ま','み','む','め','も','や','ゆ','よ','ら','り','る','れ','ろ','わ','を','ん','ぁ','ぃ','ぅ','ぇ','ぉ','ゃ','ゅ','ょ','っ','ー']
    for i in range(64):
        if i == 0:
            a = round(text[i])
            if a < 152:
                result = font_array[a]
            else:
                a = 151
                result = font_array[a]
        else:
            if a < 152:
                a = round(text[i])
            else:
                a = 151
                result = font_array[a]
            result += font_array[a]
    return result
```
モデルを読み込み、文字列を変換して、モデルに突っ込むことで、
翻訳することができます。
```3個目のセル.py
model = keras.models.load_model("watashi2.h5")
def test(text):
    x = np.array([text_to_array(text)])
    r = model.predict(x)
    print(array_to_text(r[0]))
test("翻訳したい文章")
```
# まとめ
ただの初心者が何のためかもよくわからず、
適当に書いた記事になってしまいましたが、
誰かのお役に立てたら幸いです。
# 全コード
1個目のセル
```.py
# 例文や単語読み込み
with open('架空言語データ.txt', 'r') as f:
    text_fl = f.read().split("\n")
with open('日本語データ.txt', 'r') as f:
    text_ja = f.read().split("\n")
#文字数値化関数
def text_to_array(text):
    font_array = [' ','１','２','３','４','５','６','７','８','９',' ','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','l','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','!','?',"'",',','.','"','…',';','あ','い','う','え','お','か','き','く','け','こ','が','ぎ','ぐ','げ','ご','さ','し','す','せ','そ','ざ','じ','ず','ぜ','ぞ','た','ち','つ','て','と','だ','ぢ','づ','で','ど','な','に','ぬ','ね','の','は','ひ','ふ','へ','ほ','ば','び','ぶ','べ','ぼ','ぱ','ぴ','ぷ','ぺ','ぽ','ま','み','む','め','も','や','ゆ','よ','ら','り','る','れ','ろ','わ','を','ん','ぁ','ぃ','ぅ','ぇ','ぉ','ゃ','ゅ','ょ','っ','ー']
    result = [text[i:i+1] for i in range(0,len(text), 1)]
    for i in range(len(result)):
        for i2 in range(152):
            font_array_id = str(i2)
            result[i] = result[i].replace(font_array[i2],font_array_id)
        result[i] = int(result[i])
    for i in range(64 - len(result)):
        result.append(0)
    return result
x_item = []
y_item = []
for i in range(単語や文の数): 
    fl_item = text_to_array(text_fl[i])
    ja_item = text_to_array(text_ja[i])
    x_train.append(fl_item)
    y_train.append(ja_item)
    print(result)
    print(random_word)

items = [x_train, y_train]

with open("example_data.pkl", "wb") as f:
    pickle.dump(items, f)
```
2個目のセル
```.py
import tensorflow as tf
import pickle
from tensorflow import keras
from tensorflow.keras.layers import Dense, Input
from tensorflow.keras.models import Model


次に保存した例文のデータを読み込みます。
with open("example_data.pkl", "rb") as f:
    data = pickle.load(f)
(x_train, y_train) = data
#入力層 -入れる配列の要素数を決めます
inputs = keras.Input(shape=(64))
#中間層
x = keras.layers.Dense(10000, activation="relu")(inputs)
#出力層 -出力される配列の要素数を決めます
outputs = keras.layers.Dense(64)(x)

#モデルをまとめて
model = keras.Model(inputs=inputs, outputs=outputs)
#コンプリートする。ここで損失関数とかいじれます。損失関数はmaeだと調子良さそうな気がします。
model.compile(loss="mae", optimizer="adam", metrics=["mae"])
model.summary()

model.fit(x_train, y_train, epochs=学習する回数)


#ここで保存します
model.save('ファイル名.h5', include_optimizer=True)
```
3個目のセル
```.py
import tensorflow as tf
import numpy as np
import math
from tensorflow import keras

#文字数値化関数
def text_to_array(text):
    font_array = [' ','１','２','３','４','５','６','７','８','９',' ','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','l','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','!','?',"'",',','.','"','…',';','あ','い','う','え','お','か','き','く','け','こ','が','ぎ','ぐ','げ','ご','さ','し','す','せ','そ','ざ','じ','ず','ぜ','ぞ','た','ち','つ','て','と','だ','ぢ','づ','で','ど','な','に','ぬ','ね','の','は','ひ','ふ','へ','ほ','ば','び','ぶ','べ','ぼ','ぱ','ぴ','ぷ','ぺ','ぽ','ま','み','む','め','も','や','ゆ','よ','ら','り','る','れ','ろ','わ','を','ん','ぁ','ぃ','ぅ','ぇ','ぉ','ゃ','ゅ','ょ','っ','ー']
    result = [text[i:i+1] for i in range(0,len(text), 1)]
    for i in range(len(result)):
        for i2 in range(152):
            font_array_id = str(i2)
            result[i] = result[i].replace(font_array[i2],font_array_id)
        result[i] = int(result[i])
    for i in range(64 - len(result)):
        result.append(0)
    return result
def array_to_text(text):
    font_array = [' ','１','２','３','４','５','６','７','８','９',' ','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','l','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','!','?',"'",',','.','"','…',';','あ','い','う','え','お','か','き','く','け','こ','が','ぎ','ぐ','げ','ご','さ','し','す','せ','そ','ざ','じ','ず','ぜ','ぞ','た','ち','つ','て','と','だ','ぢ','づ','で','ど','な','に','ぬ','ね','の','は','ひ','ふ','へ','ほ','ば','び','ぶ','べ','ぼ','ぱ','ぴ','ぷ','ぺ','ぽ','ま','み','む','め','も','や','ゆ','よ','ら','り','る','れ','ろ','わ','を','ん','ぁ','ぃ','ぅ','ぇ','ぉ','ゃ','ゅ','ょ','っ','ー']
    for i in range(64):
        if i == 0:
            a = round(text[i])
            if a < 152:
                result = font_array[a]
            else:
                a = 151
                result = font_array[a]
        else:
            if a < 152:
                a = round(text[i])
            else:
                a = 151
                result = font_array[a]
            result += font_array[a]
    return result

model = keras.models.load_model("watashi2.h5")
def test(text):
    x = np.array([text_to_array(text)])
    r = model.predict(x)
    print(array_to_text(r[0]))
test("翻訳したい言葉")
```