Prog-G

岐阜大学プログラミングサークル

OpenNMTで機械翻訳

自然言語処理 機械学習

この記事で取り扱うこと

この記事で取り扱わないこと

機械翻訳概要

現在の機械翻訳は対訳コーパスと呼ばれるビッグデータを利用した、機械学習(ディープラーニング)により実装されています。 対訳コーパスは、翻訳元の言語(原言語)と翻訳先の言語(目的言語)の文が対となったデータのことです。 小さいものでも約 10 万文対、大きいものだと 1000 万文対以上もあります。 現在は EncoderDecoder と呼ばれるディープラーニングモデルを利用するのが主流です。 詳しい説明は省きますが簡単に言うと、EncoderDecoder はある時系列データを別の時系列データに変換するモデルです。 EncoderDecoder をはじめとするディープラーニングモデルを 1 から実装するのは大変です。 そこで今回はオープンソースである OpenNMT-py を利用して実装します。

実行環境

機械翻訳をはじめとする、多くのディープラーニングタスクでは計算に膨大がかかり、それゆえ GPU の利用が推奨されています。 しかし、すべての人が GPU を用意できるわけではありません。 そこで今回はクラウドサービス、Google Colaboratory(通称 Colab)を利用することにより GPU を使用します。 Colab はこちらからアクセスできます。 Colab を利用するためには Google アカウントが必要になります。 また今回は対訳コーパスとして京都関連文書対訳コーパス (KFTT) を使用します。 KFTT は Wikipedia の京都関連の記事を対象とした約 44 万文対からなる日英対訳コーパスです。 KFTT にはすでに分かち書き済みのテキストがあるため、それを使用します。 今回は学習時間の都合上、日英ともに文長が 10 以下である文対のみを対象とします。 翻訳モデルは先述の通り、OpenNMT-py を利用します。

実装

実装の手順を紹介します。 なお、今回紹介するノートブックはこちらで公開しています。

Notebook を立ち上げる

Colab にアクセスし、ファイル -> ノートブックを新規作成 を選択します。 Jupyter Notebook 形式のページが表示されるはずです。

GPU を利用可能にする

ランタイム -> ランタイムのタイプを変更 を選択し、「ハードウェアアクセラレータ」を GPU に設定します。

GPU の種類を確認する

ノートブックのセルに以下のように記述し、Ctrl + Enter で実行します。

# GPUの種類を確認する
!nvidia-smi

実行すると以下のようなフォーマットが出力されます。

Wed Apr  8 06:09:41 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.64.00    Driver Version: 418.67       CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla P4            Off  | 00000000:00:04.0 Off |                  N/A |
| N/A   50C    P8     8W /  75W |      0MiB /  7611MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

Colab では記事投稿時、4 種類の性能が異なる GPU を提供しており、それらはランタイム接続時にランダムで割り当てられます。 今回は「Tesla P4」が割り当てられました(出力結果の中央参照)。 筆者の感覚では、「Tesla K80」「Tesla P4」は性能が低く、「Tesla T4」「Tesla P100」は性能が高いです。 性能の高い GPU は性能の低い GPU よりも約 3 倍速いと言われています(参考)。

対訳データを用意する

続いて以下のセルを実行します。

# 京都関連文書対訳コーパス(KFTT)をダウンロードする。
!wget http://www.phontron.com/kftt/download/kftt-data-1.0.tar.gz
# tar.gzファイルを解凍する。
!tar -zxvf /content/kftt-data-1.0.tar.gz
# Googleドライブに分かち書き済みの対訳データをコピーする。
!cp -r kftt-data-1.0/data/tok/ 'drive/My Drive/'

上記では KFTT をダウンロードし、解凍し、分かち書き済みのデータを Google Drive に保存します。 実際にうまくいってるか確かめるために以下のコードを実行します。

!ls '/content/drive/My Drive/tok'

うまくいっていれば以下のように出力されるはずです。

kyoto-dev.en  kyoto-test.en  kyoto-train.cln.en  kyoto-train.en  kyoto-tune.en
kyoto-dev.ja  kyoto-test.ja  kyoto-train.cln.ja  kyoto-train.ja  kyoto-tune.ja

実行準備をする

まず、%cd drive/My Drive でカレントディレクトリを変更します。 次に、ボキャブラリおよびモデルを保存するためのディレクトリを作成します。

!mkdir data
!mkdir save

最大文長を制限する

最大文長を制限するために以下の関数を作成します。

def limiter(data_dir, src_data, tgt_data, n=50):
  '''limiter
  コーパスの最大文長を制限する。
  ----------------------------------------
  引数
  data_dir : コーパスのディレクトリ
  src_data : 原言語のデータ
  tgt_data : 目的言語のデータ
  n : 最大文長
  ----------------------------------------
  '''
  # 書き込み用のデータファイルを作成する。
  with open(f'{data_dir}/limit-{src_data}', 'w', encoding='utf8') as wsrc:
    with open(f'{data_dir}/limit-{tgt_data}', 'w', encoding='utf8') as wtgt:
      # 元のデータファイルを読み込む
      with open(f'{data_dir}/{src_data}', encoding='utf8') as rsrc:
        with open(f'{data_dir}/{tgt_data}', encoding='utf8') as rtgt:
          # それぞれ一行ずつ読み込みリストに格納する。
          src_lines = rsrc.read().strip().split('\n')
          tgt_lines = rtgt.read().strip().split('\n')
          for src, tgt in zip(src_lines, tgt_lines):
            # 最大文長がn以下のもののみ書き込む。
            if len(src.split()) <= n and len(tgt.split()) <= n:
              wsrc.write(src + '\n')
              wtgt.write(tgt + '\n')

次に以下のセルを実行し、上記の関数を適用します。

## 文長制限するファイルの一覧
files = ['train', 'dev', 'test']
for f in files:
  # 最大文長10とする
  limiter('tok', f'kyoto-{f}.en', f'kyoto-{f}.ja', n=10)

実行後、もう一度 !ls tok でディレクトリの確認を行います。 結果以下のようになります。

kyoto-dev.en   kyoto-train.cln.en  kyoto-tune.en       limit-kyoto-test.en
kyoto-dev.ja   kyoto-train.cln.ja  kyoto-tune.ja       limit-kyoto-test.ja
kyoto-test.en  kyoto-train.en      limit-kyoto-dev.en  limit-kyoto-train.en
kyoto-test.ja  kyoto-train.ja      limit-kyoto-dev.ja  limit-kyoto-train.ja

以下のセルで、文長制限をしたファイルのサイズを確認します。

# 文長制限ができているか確認する。
!wc -l tok/limit-kyoto-train.en
!wc -l tok/limit-kyoto-train.ja
結果
71683 tok/limit-kyoto-train.en
71683 tok/limit-kyoto-train.ja

これにより文対数を約 70000 まで削減したことが分かります。

OpenNMT-py をインストールする

セルに以下のように記述し、実行します。

!pip install OpenNMT-py

これで OpenNMT-py をインストールできます。

前処理を実行する

以下のセルを実行し、前処理を行います。

# データの前処理をする。
!onmt_preprocess -train_src tok/limit-kyoto-train.en \
                 -train_tgt tok/limit-kyoto-train.ja \
                 -valid_src tok/limit-kyoto-dev.en \
                 -valid_tgt tok/limit-kyoto-dev.ja \
                 -save_data data/demo

実行後 !ls data で data ディレクトリの中身を確認すると以下のようになっています。

demo.train.0.pt  demo.valid.0.pt  demo.vocab.pt

学習を実行する

今回は EncoderDecoder の中でも、Transformer と呼ばれるモデルを使用し学習します。 Transformer は 2017 年に提案されたモデルで計算速度、性能ともに以前までのモデルを上回り、話題となりました。 以下のセルを実行し、学習を実行します。学習は性能の低い GPU で約 15 分かかります。

!onmt_train -data data/demo \
            -save_model save \
            -layers 6 -rnn_size 512 -word_vec_size 512 -transformer_ff 2048 -heads 8  \
            -encoder_type transformer -decoder_type transformer -position_encoding \
            -train_steps 10000  -max_generator_batches 2 -dropout 0.1 \
            -batch_size 1024 -batch_type tokens -normalization tokens  -accum_count 2 \
            -optim adam -adam_beta2 0.998 -decay_method noam -warmup_steps 4000 -learning_rate 2 \
            -max_grad_norm 0 -param_init 0  -param_init_glorot \
            -label_smoothing 0.1 -valid_steps 2000 -save_checkpoint_steps 2000 \
            -world_size 1 -gpu_ranks 0

実行完了後、save ディレクトリに _step_2000.pt が保存されているはずです。

実際に翻訳する

以下のセルで limit-kyoto-test.en 内のコードが翻訳できます。

!onmt_translate -model save/_step_2000.pt \
                -src tok/limit-kyoto-test.en \
                -output tok/limit-kyoto-output.ja \
                -replace_unk -verbose

実行すると翻訳結果が出力されていきます。

[2020-04-08 10:03:29,467 INFO] Translating shard 0.

SENT 1: ['Infobox', 'Buddhist']
PRED 1: 森澤 楽 ( かちょう )
PRED SCORE: -11.8644

SENT 2: ['The', 'founder', 'of', 'Soto', 'Zen']
PRED 2: 曹洞 宗 の 僧
PRED SCORE: -5.4882

SENT 3: ['1228', '-', 'Returned', 'to', 'Japan', '.']
PRED 3: いずれ も 日本 に 従 っ た 。
PRED SCORE: -8.9473

SENT 4: ['Cause', 'of', 'death', 'was', 'a', 'boil', '.']
PRED 4: 享年 88 。
PRED SCORE: -4.0019

SENT 5: ['The', 'true', 'teaching', 'is', 'different', '.']
PRED 5: これ が 多 い 。
PRED SCORE: -8.9989

SENT 6: ['"', 'Shobogenzo', '"']
PRED 6: 『 一雨 記 』
PRED SCORE: -6.1978

SENT 7: ['"', 'Eihei', 'Shingi', '"']
PRED 7: 『 一雨 詩偈 』
PRED SCORE: -5.8702

SENT 8: ['"', 'Tenzo', 'Kyokun', '"']
PRED 8: 『 一雨 戦場 記 』
PRED SCORE: -6.3736

SENT 9: ['Reference', 'Works']
PRED 9: 参考 書
PRED SCORE: -5.3466

SENT 10: ['Taijo', 'TAMAMURO', ':', '"', 'Dogen', '"', 'Shin-Jinbutsuoraisha', ',', '1971']
PRED 10: ※ 日付 = 旧暦
PRED SCORE: -4.7212

SENT 11: ['Koshiro', 'TAMAKI', ':', '"', 'Dogen', '"', 'Shunjusha', ',', '1996']
PRED 11: ※ 日付 = 旧暦
PRED SCORE: -6.0158

SENT 12: ['Ume']
PRED 12: 千 宗旦
PRED SCORE: -5.9351

SENT 13: ['Japanese', 'National', 'Railways', 'Steam', 'Locomotive', 'Class', '8620', '-', 'Working']
PRED 13: 近畿 日本 鉄道 - 鉄道 徒歩 1 分
PRED SCORE: -9.2944

SENT 14: ['Transferred', 'from', 'the', 'Hirosaki', 'Transport', 'Area', '.']
PRED 14: 客貨 取扱 を 開始 。
PRED SCORE: -4.6722

SENT 15: ['Registration', 'deleted', 'in', '1979', '(', 'for', 'working', 'preservation', ')', '.']
PRED 15: ホーム 有効 長 は 留学 。
PRED SCORE: -12.0755

SENT 16: ['Japanese', 'National', 'Railways', 'Steam', 'Locomotive', 'Class', '9600']
PRED 16: 近畿 日本 鉄道 徒歩 1 分
PRED SCORE: -6.7966

SENT 17: ['Transferred', 'from', 'the', 'Otaru', 'Switch', 'Yard', '.']
PRED 17: 世田谷 に 師事 。
PRED SCORE: -9.0856

SENT 18: ['Registration', 'deleted', 'in', '1979', '(', 'for', 'working', 'preservation', ')', '.']
PRED 18: ホーム 有効 長 は 留学 。
PRED SCORE: -12.0755

SENT 19: ['Put', 'into', 'static', 'preservation', 'in', '1987', '.']
PRED 19: ※ 日付 = 旧暦
PRED SCORE: -6.2148

SENT 20: ['Japanese', 'National', 'Railways', 'Steam', 'Locomotive', 'Class', 'B20', '-', 'Working']
PRED 20: 近畿 日本 鉄道 北 近畿 日本 自動 車
PRED SCORE: -12.8495

SENT 21: ['Manufactured', 'in', '1946', 'by', 'Tateyama', 'Heavy', 'Industries', '.']
PRED 21: 昭和 16 年 ( 1928 年 ) に 設置 。
PRED SCORE: -11.5587

SENT 22: ['Transferred', 'from', 'the', 'Kagoshima', 'Engine', 'Depot', '.']
PRED 22: 鹿児島 から 移転 する 。
PRED SCORE: -7.2828

SENT 23: ['Registration', 'deleted', 'in', '1979', '.']
PRED 23: 1982 年 に 設立 。
PRED SCORE: -8.6031

SENT 24: ['Japanese', 'National', 'Railways', 'Steam', 'Locomotive', 'Class', 'C11']
PRED 24: 近畿 日本 鉄道 徒歩 1 分
PRED SCORE: -6.5465

SENT 25: ['Registration', 'deleted', 'in', '1987', '.']
PRED 25: ドイツ に おけ る 。
PRED SCORE: -6.5260

SENT 26: ['Japanese', 'National', 'Railways', 'Steam', 'Locomotive', 'Class', 'C51', '*']
PRED 26: 近畿 日本 鉄道 徒歩 1 分
PRED SCORE: -6.4775

SENT 27: ['Scrapped', 'at', 'the', 'Niitsu', 'Transport', 'Area', 'in', '1962', '.']
PRED 27: 1931 年 に 開館 する 。
PRED SCORE: -7.3883

SENT 28: ['Japanese', 'National', 'Railways', 'Steam', 'Locomotive', 'Class', 'C53', '*']
PRED 28: 近畿 日本 鉄道 徒歩 1 分
PRED SCORE: -6.4775

SENT 29: ['Scrapped', 'in', '1950', 'at', 'the', 'Umekoji', 'Engine', 'Depot', '.']
PRED 29: - 梅小路 蒸気 機関 車 に よ る 。
PRED SCORE: -8.9613

SENT 30: ['Japanese', 'National', 'Railways', 'Steam', 'Locomotive', 'Class', 'C55']
PRED 30: 近畿 日本 鉄道 徒歩 1 分
PRED SCORE: -6.7966

SENT 31: ['Manufactured', 'in', '1935', 'by', 'Kawasaki', 'Rolling-Stock', 'Mfg', '.', 'Co', '.']
PRED 31: - 眞山 青果 大賞 。
PRED SCORE: -9.3887

SENT 32: ['Transferred', 'from', 'the', 'Asahikawa', 'Rail', 'Yard', '.']
PRED 32: 一般 国道 に 移転 。
PRED SCORE: -8.6779

SENT 33: ['Registration', 'deleted', 'in', '1979', '.']
PRED 33: 1982 年 に 設立 。
PRED SCORE: -8.6031

SENT 34: ['Manufactured', 'in', '1939', 'by', 'Kawasaki', 'Rolling-Stock', 'Mfg', '.', 'Co', '.']
PRED 34: 1961 年 に 入社 。
PRED SCORE: -8.1801

SENT 35: ['Transferred', 'from', 'the', 'Matsumoto', 'Transport', 'Area', '.']
PRED 35: 北 近畿 タンゴ 鉄道 に よ る 。
PRED SCORE: -9.6190

SENT 36: ['Manufactured', 'in', '1937', 'by', 'Kawasaki', 'Rolling-Stock', 'Mfg', '.', 'Co', '.']
PRED 36: 昭和 38 年 ( 1937 年 ) に 設置 。
PRED SCORE: -12.4337

SENT 37: ['Transferred', 'from', 'the', 'Sakura', 'Engine', 'Depot', '.']
PRED 37: - 眞山 青果 に 行 う 。
PRED SCORE: -12.5149

SENT 38: ['Japanese', 'National', 'Railways', 'Steam', 'Locomotive', 'Class', 'C58']
PRED 38: 近畿 日本 鉄道 徒歩 1 分
PRED SCORE: -6.1135

SENT 39: ['Transferred', 'from', 'the', 'Kitami', 'Rail', 'Yard', '.']
PRED 39: 客貨 取扱 を 開始 。
PRED SCORE: -4.0971

SENT 40: ['Registration', 'deleted', 'in', '1987', '.']
PRED 40: ドイツ に おけ る 。
PRED SCORE: -6.5260

SENT 41: ['Japanese', 'National', 'Railways', 'Steam', 'Locomotive', 'Class', 'C59']
PRED 41: 近畿 日本 鉄道 徒歩 1 分
PRED SCORE: -6.7966

SENT 42: ['Manufactured', 'in', '1946', 'by', 'Hitachi', ',', 'Ltd', '.']
PRED 42: 1986 年 ( 昭和 16 年 ) 開発 。
PRED SCORE: -9.6515

SENT 43: ['Transferred', 'from', 'the', 'Nara', 'Rail', 'Yard', '.']
PRED 43: 奈良 鉄道 から 徒歩 15 分 。
PRED SCORE: -8.7678

SENT 44: ['Registration', 'deleted', 'in', '1979', '.']
PRED 44: 1982 年 に 設立 。
PRED SCORE: -8.6031

SENT 45: ['Manufactured', 'in', '1948', 'by', 'Mitsubishi', 'Heavy', 'Industries', ',', 'Ltd', '.']
PRED 45: 昭和 40 年 ( 昭和 40 年 ) 設立
PRED SCORE: -10.1885

SENT 46: ['Transferred', 'from', 'the', 'Miyazaki', 'Engine', 'Depot', '.']
PRED 46: 宮崎 山 から 移転 。
PRED SCORE: -9.4733

SENT 47: ['Registration', 'deleted', 'in', '1979', '(', 'for', 'working', 'preservation', ')', '.']
PRED 47: ホーム 有効 長 は 留学 。
PRED SCORE: -12.0755

SENT 48: ['Registration', 'restored', 'in', '1987', '.']
PRED 48: 1987 年 に 開館 する 。
PRED SCORE: -6.2705

SENT 49: ['Japanese', 'National', 'Railways', 'Steam', 'Locomotive', 'Class', 'C62', '*']
PRED 49: 近畿 日本 鉄道 徒歩 1 分
PRED SCORE: -6.6945

SENT 50: ['Manufactured', 'in', '1948', 'by', 'Hitachi', ',', 'Ltd', '.']
PRED 50: 昭和 40 年 ( 昭和 23 年 )
PRED SCORE: -9.4229

コーパスの文の数を制限したため、ほとんどの翻訳はうまくいっていませんが、単語レベルで一部拾っている例も見受けられます。 よりよい翻訳をするためには、より大きなコーパスでより時間をかけて学習する必要があります。

実際により大きなサイズでより時間をかけて学習を行い同様に翻訳した結果が以下です。 上の結果よりは良く翻訳できていること分かります。

SENT 1: ['Infobox', 'Buddhist']
PRED 1: 仏教
PRED SCORE: -2.5140

SENT 2: ['The', 'founder', 'of', 'Soto', 'Zen']
PRED 2: 曹洞 宗 の 開祖 。
PRED SCORE: -1.7647

SENT 3: ['1228', '-', 'Returned', 'to', 'Japan', '.']
PRED 3: 安貞 2 年 ( 1228 年 ) 、 帰国 。
PRED SCORE: -3.5501

SENT 4: ['Cause', 'of', 'death', 'was', 'a', 'boil', '.']
PRED 4: 死因 は . 。
PRED SCORE: -4.1021

SENT 5: ['The', 'true', 'teaching', 'is', 'different', '.']
PRED 5: 実際 の 教え は 異な る 。
PRED SCORE: -6.9144

SENT 6: ['"', 'Shobogenzo', '"']
PRED 6: 『 正法 眼蔵 』
PRED SCORE: -0.8672

SENT 7: ['"', 'Eihei', 'Shingi', '"']
PRED 7: 新義
PRED SCORE: -3.2755

SENT 8: ['"', 'Tenzo', 'Kyokun', '"']
PRED 8: Tenzo
PRED SCORE: -4.4306

SENT 9: ['Reference', 'Works']
PRED 9: 参考 作品
PRED SCORE: -1.2372

SENT 10: ['Taijo', 'TAMAMURO', ':', '"', 'Dogen', '"', 'Shin-Jinbutsuoraisha', ',', '1971']
PRED 10: 大 沽 砲台 : 『 道元 』 1971 年
PRED SCORE: -9.8080

SENT 11: ['Koshiro', 'TAMAKI', ':', '"', 'Dogen', '"', 'Shunjusha', ',', '1996']
PRED 11: 玉置 小四郎 : 『 文藝 春秋 』 1996 年
PRED SCORE: -8.1949

SENT 12: ['Ume']
PRED 12: ウメ
PRED SCORE: -1.5128

SENT 13: ['Japanese', 'National', 'Railways', 'Steam', 'Locomotive', 'Class', '8620', '-', 'Working']
PRED 13: 国鉄 8620 形 蒸気 機関 車
PRED SCORE: -3.7100

SENT 14: ['Transferred', 'from', 'the', 'Hirosaki', 'Transport', 'Area', '.']
PRED 14: 弘前 地域 から 転属 。
PRED SCORE: -7.5704

SENT 15: ['Registration', 'deleted', 'in', '1979', '(', 'for', 'working', 'preservation', ')', '.']
PRED 15: 1979 年 に 品種 登録 。
PRED SCORE: -4.3973

SENT 16: ['Japanese', 'National', 'Railways', 'Steam', 'Locomotive', 'Class', '9600']
PRED 16: 国鉄 9600 形 蒸気 機関 車
PRED SCORE: -1.7480

SENT 17: ['Transferred', 'from', 'the', 'Otaru', 'Switch', 'Yard', '.']
PRED 17: 小樽 方面 から 移転 。
PRED SCORE: -4.8450

SENT 18: ['Registration', 'deleted', 'in', '1979', '(', 'for', 'working', 'preservation', ')', '.']
PRED 18: 1979 年 に 品種 登録 。
PRED SCORE: -4.3973

SENT 19: ['Put', 'into', 'static', 'preservation', 'in', '1987', '.']
PRED 19: 1987 年 ( 昭和 62 年 ) に は 、 保存 性 を 確保 し て い る 。
PRED SCORE: -15.8516

SENT 20: ['Japanese', 'National', 'Railways', 'Steam', 'Locomotive', 'Class', 'B20', '-', 'Working']
PRED 20: 国鉄 B20 形 蒸気 機関 車
PRED SCORE: -3.1673

SENT 21: ['Manufactured', 'in', '1946', 'by', 'Tateyama', 'Heavy', 'Industries', '.']
PRED 21: 昭和 21 年 ( 1946 年 ) 、 Tateyama Tateyama Tateyama に よ る Tateyama Tateyama 。
PRED SCORE: -15.3832

SENT 22: ['Transferred', 'from', 'the', 'Kagoshima', 'Engine', 'Depot', '.']
PRED 22: 鹿児島 車庫 から 転属 。
PRED SCORE: -5.1691

SENT 23: ['Registration', 'deleted', 'in', '1979', '.']
PRED 23: 1979 年 に 品種 登録 。
PRED SCORE: -3.4306

SENT 24: ['Japanese', 'National', 'Railways', 'Steam', 'Locomotive', 'Class', 'C11']
PRED 24: 国鉄 C11 形 蒸気 機関 車
PRED SCORE: -2.2371

SENT 25: ['Registration', 'deleted', 'in', '1987', '.']
PRED 25: 1987 年 に 廃車 。
PRED SCORE: -3.7378

SENT 26: ['Japanese', 'National', 'Railways', 'Steam', 'Locomotive', 'Class', 'C51', '*']
PRED 26: 国鉄 C51 形 蒸気 機関 車 ※
PRED SCORE: -2.0839

SENT 27: ['Scrapped', 'at', 'the', 'Niitsu', 'Transport', 'Area', 'in', '1962', '.']
PRED 27: 1962 年 ( 昭和 37 年 ) の Niitsu 地区 で の 宮津 自動 車 運送 事業 。
PRED SCORE: -18.7891

SENT 28: ['Japanese', 'National', 'Railways', 'Steam', 'Locomotive', 'Class', 'C53', '*']
PRED 28: 国鉄 C53 形 蒸気 機関 車 ※
PRED SCORE: -2.0839

SENT 29: ['Scrapped', 'in', '1950', 'at', 'the', 'Umekoji', 'Engine', 'Depot', '.']
PRED 29: 1950 年 ( 昭和 25 年 ) 、 梅小路 車庫 で の . 。
PRED SCORE: -8.9858

SENT 30: ['Japanese', 'National', 'Railways', 'Steam', 'Locomotive', 'Class', 'C55']
PRED 30: 国鉄 C55 形 蒸気 機関 車
PRED SCORE: -1.7480

SENT 31: ['Manufactured', 'in', '1935', 'by', 'Kawasaki', 'Rolling-Stock', 'Mfg', '.', 'Co', '.']
PRED 31: 昭和 10 年 ( 1935 年 ) 、 川崎 造船 所 にて 。
PRED SCORE: -9.0913

SENT 32: ['Transferred', 'from', 'the', 'Asahikawa', 'Rail', 'Yard', '.']
PRED 32: 旭川 鉄道 区 から 転属 。
PRED SCORE: -5.5211

SENT 33: ['Registration', 'deleted', 'in', '1979', '.']
PRED 33: 1979 年 に 品種 登録 。
PRED SCORE: -3.4306

SENT 34: ['Manufactured', 'in', '1939', 'by', 'Kawasaki', 'Rolling-Stock', 'Mfg', '.', 'Co', '.']
PRED 34: 1939 年 、 川崎 造船 所 にて 。
PRED SCORE: -7.2440

SENT 35: ['Transferred', 'from', 'the', 'Matsumoto', 'Transport', 'Area', '.']
PRED 35: 松本 地区 より 転属 。
PRED SCORE: -5.4569

SENT 36: ['Manufactured', 'in', '1937', 'by', 'Kawasaki', 'Rolling-Stock', 'Mfg', '.', 'Co', '.']
PRED 36: 1937 年 ( 昭和 12 年 ) 、 川崎 造船 所 にて 。
PRED SCORE: -8.6035

SENT 37: ['Transferred', 'from', 'the', 'Sakura', 'Engine', 'Depot', '.']
PRED 37: 佐倉 車庫 から 転属 。
PRED SCORE: -5.9957

SENT 38: ['Japanese', 'National', 'Railways', 'Steam', 'Locomotive', 'Class', 'C58']
PRED 38: 国鉄 C58 形 蒸気 機関 車
PRED SCORE: -2.0051

SENT 39: ['Transferred', 'from', 'the', 'Kitami', 'Rail', 'Yard', '.']
PRED 39: 岩野 電鉄 より 転属 。
PRED SCORE: -7.0427

SENT 40: ['Registration', 'deleted', 'in', '1987', '.']
PRED 40: 1987 年 に 廃車 。
PRED SCORE: -3.7378

SENT 41: ['Japanese', 'National', 'Railways', 'Steam', 'Locomotive', 'Class', 'C59']
PRED 41: 国鉄 C59 形 蒸気 機関 車
PRED SCORE: -1.7480

SENT 42: ['Manufactured', 'in', '1946', 'by', 'Hitachi', ',', 'Ltd', '.']
PRED 42: 1946 年 日立 製作 所
PRED SCORE: -3.6834

SENT 43: ['Transferred', 'from', 'the', 'Nara', 'Rail', 'Yard', '.']
PRED 43: 奈良 電気 鉄道 区 から 移転 。
PRED SCORE: -5.4310

SENT 44: ['Registration', 'deleted', 'in', '1979', '.']
PRED 44: 1979 年 に 品種 登録 。
PRED SCORE: -3.4306

SENT 45: ['Manufactured', 'in', '1948', 'by', 'Mitsubishi', 'Heavy', 'Industries', ',', 'Ltd', '.']
PRED 45: 1948 年 ( 昭和 23 年 ) 、 三菱 Mitsubishi 工業 株式 会社 が 設立 。
PRED SCORE: -11.0433

SENT 46: ['Transferred', 'from', 'the', 'Miyazaki', 'Engine', 'Depot', '.']
PRED 46: 宮崎 車庫 から 転属 。
PRED SCORE: -3.9425

SENT 47: ['Registration', 'deleted', 'in', '1979', '(', 'for', 'working', 'preservation', ')', '.']
PRED 47: 1979 年 に 品種 登録 。
PRED SCORE: -4.3973

SENT 48: ['Registration', 'restored', 'in', '1987', '.']
PRED 48: 1987 年 に 品種 登録 。
PRED SCORE: -3.9173

SENT 49: ['Japanese', 'National', 'Railways', 'Steam', 'Locomotive', 'Class', 'C62', '*']
PRED 49: 国鉄 C62 形 蒸気 機関 車 ※
PRED SCORE: -1.8432

SENT 50: ['Manufactured', 'in', '1948', 'by', 'Hitachi', ',', 'Ltd', '.']
PRED 50: 1948 年 日立 製作 所
PRED SCORE: -3.5343

今後の課題