kana-kanji conversion using n-gram
TRANSCRIPT
N-gram かな漢字変換
真鍋宏史 (Google)
自己紹介
• はてダ: http://d.hatena.ne.jp/takeda25/
• Twitter: @takeda25
• Googleで日本語入力のチームにいます
• 悩みの多い日々を送っています
概要
• N-gram かな漢字変換→低次では精度がよくない→高次の N-gram を利用→ノードが増える→刈り込み
動機
•言語モデル配布 by @gologo13 さん
•現代日本語書き言葉均衡コーパス(BCCWJ)
•大きい
•精度もけっこういい
これまで
•クラス 2-gram by 森信介先生→ Google 日本語入力(Mozc) も
•単語 1-gram、2-gram も
•それなりにうまくいくっぽい?
2-gram やってみる
•「かいじょうではのうさんぶつやとくさんひん、てづくりひんのはんばい、きっさやげーむこーなーなどのてんとがならんだ。」
結果
•「会場では農産物や特産品、手作り品の販売、喫茶やゲームコーナーなどのテントが並んだ。」
完璧!
別のテキスト
•「きょうはいいてんきですね。」
結果
•「今日は言い天気ですね。」
がっかり
なぜか•@gologo13 さんのN-gramデータ:“超短単位”
•品詞情報等なし
•用言の語幹と活用語尾分離
• “言/い い/い ま/ま す/す” とか
2-gram• “今日-は”:自然(コーパスに多くある)
• “は-言”:自然
• “言-い” : 自然
• “い-天気”:自然
•…
全体
• “今日-は-言-い-天気-で-す-ね”:?
超短単位が悪い?•超短単位を捨てる?
• “言い-天気”:不自然とわかる
•超短単位にはいいところも
• “に-言-う”と“に-言-い”が2-gramを共有するので汎用的に扱える
N を増やす
• “言-い-天気”:不自然
•いけそう
• 3-gram にしてみる?
ところで
• 2-gram デコードはどうやるか
共通接頭辞検索•marisa-trie 使用
•検索キーの接頭辞(前からの部分文字列)にマッチするキー・値を返す
•日本語の単語をひらがなで入れたら:「くるまで」→「く」「くる」「くるま」
•それぞれに対する表記候補を列挙
やってみる
•例:「かれがくるまでまつ」
ノードか蚊彼枯れ
レが蛾学額区来る繰る
車流
間 …
連接か蚊彼枯れ
レが蛾学額区来る繰る
車流
間
ある位置で終わるノードとその位置で始まるノードをくっつけて2-gramを調べる
(計算量:ひとつの位置で始まるノード数の2乗)
2-gramか蚊彼枯れ
レが蛾学額区来る繰る
車流
間
の2-gram確率が 来る
が に至るまでの一番もっともらしいルートの確率×
2-gramか蚊彼枯れ
レが蛾学額区来る繰る
車流
間
の2-gram確率蛾 来る
蛾×
に至るまでの一番もっともらしいルートの確率
2-gramか蚊彼枯れ
レが蛾学額区来る繰る
車流
間
どっちが高いか比べる
2-gramか蚊彼枯れ
レが蛾学額区来る繰る
車流
間
高い方の確率を来る に至るまでの一番もっともらしいルートの確率とする
2-gramか蚊彼枯れ
レが蛾学額区来る繰る
車流
間
採用したのがどこだったか覚えておく
2-gramか蚊彼枯れ
レが蛾学額区来る繰る
車流
間
最後まで終わったら、一番もっともらしい左ノードをたどっていく
3-gram
複合ノードか蚊彼
枯れ
レ
が
レレ
が彼 蛾
枯れが蛾
レ が蛾
彼 学彼 額枯れ枯れ
学額
レレ 学
額区
区
すべての2-gramに対してノードを作る元のノード数の2乗のオーダー
注意か蚊彼
枯れ
レ
が
レレ
が彼 蛾
枯れが蛾
レ が蛾
彼 学彼 額枯れ枯れ
学額
レレ 学
額区
区
こういう遷移はあるけど
こういう遷移はない(遷移元ノードが「が」で終わっていない)ので
遷移のオーダーは複合ノード数の2乗(元のノード数の4乗)にはならない
3-gram確率か蚊彼
枯れ
レ
が
レレ
が彼 蛾
枯れが蛾
レ が蛾
彼 学彼 額枯れ枯れ
学額
レレ 学
額区
区
の3-gram確率が
が に至るまでの一番もっともらしいルートの確率×
彼
区彼
計算量
•位置ごとのノード数:元のノード数^2
•連接:元のノード数と同じ
•計算量:元のノード数^3
元々のノード数
•「か」→「か」or「蚊」?
•実際はたくさん「か」→か、蚊、可、香、火、課、化、家、過、価…
•その3乗とかきつい
節約したい
ここに戻ってか蚊彼
枯れ
レ
が
レレ
が彼 蛾
枯れが蛾
レ が蛾
彼 学彼 額枯れ枯れ
学額
レレ 学
額区
区
ここに戻ってか蚊彼
枯れ
レ
が
レレ
が彼 蛾
枯れが蛾
レ が蛾
彼 学彼 額枯れ枯れ
学額
レレ 学
額区
区
こういうノードは本当に要るのか(2-gramもなさそうなノード)
3-gramに必要?か蚊彼
枯れ
レ
が
レレ
が彼 蛾
枯れが蛾
レ が蛾
彼 学彼 額枯れ枯れ
学額
レレ 学
額区
区
蚊 レ がここで の確率がほしいから
蚊 レ のノードが必要?
Backoff
区
蚊 レ が
蚊 レ
の確率がほしい→
蚊 レ が の3-gramが存在しない→
のbackoff scoreと レ が の2-gram確率から計算
Backoff
区
蚊 レ が
蚊 レ
の確率がほしい→
蚊 レ が の3-gramが存在しない→
のbackoff scoreと レ が の2-gram確率から計算
蚊 レ の2-gramが存在しなかったら?→ レ が の2-gram確率しか使わない
蚊 レ のノードは持つ必要がない
手順か蚊彼枯れ
か蚊彼枯れ
レ ←この2-gramはあるとする
手順
←複合ノードを作る
か蚊彼枯れか レ
手順
元ノードは覚えておく
か蚊彼枯れか レ
手順
←この2-gramはないとするか蚊彼枯れか レ
レ
手順
は必要ないので削る
か蚊彼枯れか レ
レ
手順
蚊←蚊
元ノードは覚えておく
か蚊彼枯れか レ
レ
手順
か蚊彼枯れか レ
レ
が ←この2-gramはあるとする
手順
か蚊彼枯れか レ
レ←複合ノードを作る彼 が
手順
か蚊彼枯れか レ
レ
←この2-gramはないとする
彼 が
が
手順
か蚊彼枯れか レ
レ彼 が
は必要ないので削るが
手順
←枯れ 枯れ
か蚊彼枯れか レ
レ彼 が
が
←この3-gramはあるとするが
手順
か蚊彼枯れか レ
レ彼 が
が←3-gramのモデルであれば、次に使うのはレ がレ が ? という3-gramまでなので、
手順
か は捨てる(より高次のモデルなら残す)
か
か蚊彼枯れか レ
レ彼 が
が
←この2-gramはある
レ が
が
手順
か蚊彼枯れか レ
レ彼 が
がレ がレ が ←ここで複合ノードを作るところだが
手順
か蚊彼枯れか レ
レ彼 が
がレ がレ が
←既存のノードとかぶっている
手順
か蚊彼枯れか レ
レ彼 が
がレ がレ が
←2つの確率を比べる
手順
か蚊彼枯れか レ
レ彼 が
がレ がレ が
←より確率の高い左ノードを覚えておく
手順
ここまでの図か蚊彼枯れか レ
レ彼 が
がレ が
文末からたどるか蚊彼枯れか レ
レ彼 が
がレ が
学額
が 来る繰るが来る繰る
複合ノードか蚊彼枯れか レ
レ彼 が
がレ が
左側の要素は自明か蚊彼枯れか レ
レ彼 が
がレ が
省略か蚊彼枯れ
レレ
ががが
次数だけ覚えておくか蚊彼枯れ
レレ
ががが (2)
(2)
(2)
手順まとめ•既存のノードに候補をつなげてN-gram確率を求める
• N-gramが存在しない履歴と最高次の履歴は切り捨てる
•削った結果を新しいノードにするすでにあれば、より確率の高いものを残す
3-gramでも足りない•「ほんをかいたい」を3-gram変換→「本を書いたい」
• “書-い-た”と“い-た-い”はどちらも自然
• 4-gramにすると解決
•「書-い-た-い」vs.「買-い-た-い」
定量的な評価•やってませんごめんなさい
•@nokuno さんが「Ngramかな漢字変換とMozc辞書の比較」という記事を書いてくださっているので見ていただければ…
•その代わり適当な変換例をご覧ください
変換例(成功)•きょうはいいてんきですね→今日はいい天気ですね
•ほんをかいたい→本を買いたい
•ぼくとうみにいかないか→ぼくと海に行かないか(cf. 木刀見に行かないか)
変換例(失敗)
•いちにちじゅうあつかった→一日中扱った
•ほんさいとはきょうでしゅうりょうです→本妻とは京で終了です
課題• 文節区切りがない
→文節区切りのあるデータから学習?
• 文頭・文末の影響が強い→元データは文単位、変換は(数)文節単位、現状は前後に「、」をつけて変換
• まだけっこう遅い→Pythonだから?C++で書いて実用的になったらいいなぁ
• 辞書大きい(60M)→N-gramの格納法工夫?
まとめ•高次N-gramによる変換
•必要ない履歴を削除してコンパクトに
•ヒューリスティックなしにしては結構うまくいってるんじゃないでしょうか
• https://github.com/hiroshi-manabe/ngram-converter
時間があれば
•オンデマンドで変換しますのでお申し付けください(文頭/文末処理の都合上、前後に「、」を足して変換します)