スポンサードリンク



こんにちは。sinyです。

この記事では、ディープラーニングのSeq2seqを使った簡単な英語→日本語翻訳アプリをDjangoで実装する方法をご紹介します。

最終的に以下のような英和翻訳のデモアプリをDjangoで作成します。

Seq2seqによるモデル学習からDjango実装までのボリュームが多いため、前編と後編に記事を分割しています。(本記事は前編です)

 DjangoやSeq2seqの基本的な仕組みやディープラーニングの基本的な知識を持った方を対象に記載していますので、基礎的な説明は割愛しています。

 

Seq2Seqの基礎については以下の記事を参考にしてください。

実装内容

 

seq2seqのコードは、以下のGitサイトに掲載されているKerasのサンプルコードを使っていきます。

また、学習に使う英語と日本語データはこちらの「Japanese - English jpn-eng.zip」を利用しました。
jpn-eng.zipを解凍するとjpn.txtというファイルがありますので、これを学習データとして利用します。

jpn.txtの中身は以下のように「英文と日本語訳」が記載されたテキストデータになっていて、1万語の文章が記載されています。

Go. 行け。
Go. 行きなさい。
Hi. やっほー。
Hi. こんにちは!
Run. 走れ。

KerasのSeq2seqで英語翻訳モデルを構築

まず最初に、必要なモジュール、初期パラメータを設定します。

 

  • 学習データは10000語あるので、num_samplesを10000に設定します。
  • data_pathには学習用のファイル「jpn.txt」を指定します。
  • その他は、keras,numpyといった必要なモジュールをインポートします。

 

英語、日本語データをベクトル化

まずは、jpn.txtを読み込んで以下の情報に分けます。

  • input_texts(英語文)
  • target_texts(日本語文)
  • input_characters(英語の単語の種類)
  • target_characters(日本語の単語の種類)

target_text(正解となる日本語文)は開始をタブ「\t」で、終了を改行「\n」で表します。

input_textsには英語、target_textsには日本語が格納されるので、試しに10個だけ値を確認してみましょう。

 

jpn.txtに格納されている英語、日本語のトークン数、最大長の値を取得します。

 

結果は以下のようになります。

 

続いて、英語、日本語トークンの辞書作成とベクトル化(One-Hot表現)を行います。
辞書は以下のような形で日本語と英語それぞれについて作成します。

  • input_token_index = {'A': 20, 'B': 21, 'C': 22, 'D': 23, 'E': 24, 'F': 25, 'G': 26, 'H': 27,・・・・}
  • target_token_index ={'ぁ': 44, 'あ': 45, 'い': 46, 'う': 47, 'え': 48, 'ぉ': 49, 'お': 50,・・・}

 

  • decoder_target_dataは1タイムステップ進んでいるので、時刻tにおける正解データとするために1ステップ前(t-1)の位置にセットします。(以下の部分)

    decoder_target_data[i, t - 1, target_token_index[char]] = 1.

 

英語、日本語のone-hot表現後の形状は以下のようになります。

・英語の形状 (10000, 22, 72)
日本語の形状 (10000, 32, 1476)

Seq2seqモデルの定義

seq2seqモデルを以下のように定義します。

  • encoderに入力データ(英語)を与え、内部状態(2つ)を出力する。
  • decoderには、(日本語)データを与え、初期状態にencoderが出力した内部状態をセットする。
  • 完全な出力シーケンスを返すようにデコーダを設定する。
  • decoderも内部状態を返すが、学習では使わないが、推論時に利用する。

 

 

学習モデルは以下のようになります。

学習の実行

続いて以下のコードで学習を行います。

 

学習はインプットにencoder_input_data(英語)と decoder_input_data(日本語)を、アウトプットに予測値となる日本語をセットします。

Eealyストップを設定して検証のLOSSが5連続で改善されない場合学習を終了するようにしています。

ちなみに23エポックくらいで完了しました。

念のため誤差の推移を確認すると以下のようになりました。

 

予測用モデルの構築

予測モデルは以下のようにエンコーダーモデルとデコーダーモデルを構築します。

  • encoder:入力を受け取って状態を返す。
  • decoder:入力と状態を受け取って出力と状態を返す。

 

逆引きトークンインデックスを作成

続いて、予測の際にトークンのIndexから単語を取得するため逆引きトークンインデックスを作成します。

input_token_index(英語)とtarget_token_index(日本語)それぞれに対してキーと値を入れ替えた辞書を生成します。

以下のようなイメージですね。

■【変換前】
input_token_index: ('A', 20), ('B', 21), ('C', 22), ('D', 23), ('E', 24), ('F', 25),
target_token_index: ('ぁ', 44), ('あ', 45), ('い', 46), ('う', 47), ('え', 48), ('ぉ', 49)
■【変換後】
reverse_input_char_index: (20, 'A'), (21, 'B'), (22, 'C'), (23, 'D'), (24, 'E'), (25, 'F'),
reverse_target_char_index: (44, 'ぁ'), (45, 'あ'), (46, 'い'), (47, 'う'), (48, 'え'), (49, 'ぉ')

予測値作成用関数の作成

続いて、入力に英文の状態ベクトルを与えて、出力(日本語訳)を出すdecode_sequence関数を定義します。

     

    動作を確認してみます。

    訓練データ(英文)からランダムに3つの文を選択して翻訳し、上記decode_sequence関数に与えることで日本語の返答結果を確認します。

     

    実行結果例です。
    精度はあまり高くありませんが、文章によっては割と正確に翻訳できているものもあります。

     

    インタラクティブに翻訳を実行

    続いて、インタラクティブに英文を入力して、翻訳された結果を表示できるようにしてみます。

     

    is_invalid関数は、辞書に登録されていない単語が入力された場合に「英文を入力してください」という表示をさせるために使います。

    sentence_to_vector関数は、入力された英文をOn-Hot表現に変換する関数です。

     

     

    上記コードを実行すると、入力受付待ちになるので、英文を入力してEnterキーを押すと、翻訳された結果が下に表示されます。

     

    以上、ディープラーニング+Djangoで言語翻訳デモアプリの作成【前編】でした。

    後編では、この記事で学習させた翻訳モデルをDjangoに実装していきます。

     

    おすすめの記事