LoginSignup
13
1

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-12-13

はじめに

現在 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("翻訳したい言葉")
13
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
1