はじめに
Rinna から提供されている gpt モデルを使って遊んでみています。
という流れからの、実装です。
何を実装したのか
mozc が変換時は Viterbi の結果をそのまま使っているようなので
- A*アルゴリズムを実装して Viterbi の結果を利用しつつ NBest パスを見つける。(今回 10 固定)
- 前確定文字列も含んでいる NBest パスを、Rinna GPT モデルで評価してみる。Batch として N 個のパスを渡しているのでモデルの起動は一度だけです。
- NBest パスで、異なっている文字列の部分だけ logits を取得して softmax を計算し、確率とする。ちなみに、普通にかけるとすぐアンダーフロー起こすので sum(log(softmax)) を計算結果とします。
- もっとも高い確率のパスで、Viterbi の結果をリプレースする。
という感じで、変換結果を入れ替えています。
デモスクリーンショット
うまく変換するサンプル
確定済み文字列 | 入力 | 変換結果 |
---|---|---|
部屋で犬を | かう | 飼う |
店で犬を | かう | 買う |
彼の足はとても | はやい | 速い |
彼は朝がとても | はやい | 早い |
山をゆっくり | のぼる | 登る |
朝日がゆっくり | のぼる | 昇る |
わかりやすいサンプルは、文末の動詞ですが、文中の入力でも
確定済み文字列 | 入力 | 変換結果 |
---|---|---|
東京支社に彼は | いどう | 異動 |
東京に会場は | いどう | 移動 |
と変換はします。
とはいえ
いろいろ入力すると、うまく同音異義語を選ばない場合や、明らかな副作用があったりで、調整は必要ですね。(というか、mozc の CRF&Word Cost の値と、GPT の確率値とでは、線形補間できるか不明ですが)
また、mozc の性能評価は、何かツールがあるんでしょうかね。知っている方、ご教示願います。