CRFを用いたオンドゥル語の翻訳

いろんなものから逃げたくて、こんなことをしているshogoです。

JO_RI_botオンドゥル語翻訳機能をつけてみました。
オンドゥル語については http://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%B3%E3%83%89%E3%82%A5%E3%83%AB%E8%AA%9E とかを参照。
で、つけたはいいですが、少し微妙です。オリジナルのオンドゥル語よりも濁音がかなり多い気がします(オディジナドゥドオンドゥゥドゥゴヨディボダグオンガカナディオオイクガシバズ)。

この翻訳は前後関係を一切見ずに単純な置換のみで翻訳を行なっています。
しかし、まとめサイトにかかれたオンドゥル語を見る限り、毎回同じ音に濁音をつけているわけではなさそうです。
http://www.doumori.com/design/show.php?kiji_id=357442
同じ「タ」という音でも「ダ」と濁ったり、そのまま「タ」となっていることもあります。

このオリジナルのオンドゥル語に近づけるにはどうすればいいでしょう?
置換ルールを増やせばなんとかなりそうですが、ルールを考えるのはかなり大変そうです。
例えば「俺」という単語を見てみると「ゥレハ(俺は)」「オデノ(俺の)」「オレァ(俺は)」「オレノ(俺の)」と同じ「オレ」という音でも前後の関係によってかなり変化しています。
「俺」という一単語だけならまだしも、他の単語もいろいろ変化していそうです。
それを全部やるのは不可能でしょう。


ルールベースの翻訳には限界が見えてきました。じゃあ、どうしよう?

普通の自然言語の翻訳を参考にしてみましょう。一般的な翻訳も初期の頃はルールベースのものが研究されていました。
その方法でもある程度の性能は出せるのですが、すぐに限界が見えてきました。
そこで頭のいい人達が目をつけたのは人間がすでに翻訳した結果。これをコンピュータで分析することにより翻訳できないかと考えました。


僕たちもこれを試してみましょう。普通の翻訳タスクだと、構文解析(どれが主語でどれが述語かを判断)して、適切に並べ替えを行うという面倒なことをしなくてはいけません。しかし、オンドゥル語は日本語と語順が一致しているので、このことは考えなくてよさそうです。また、普通の翻訳に必要な意味解析も必要なく、必要なのは「読み方」だけですね。

次の文章は「ホントウニウラギッタンデスカ」という日本語が「オンドゥルルラギッタンディスカ」に翻訳される様子を表しています。

ホ/オ ン/ン ト/ド ウ/ゥ ニ/ル ウ/ル ラ/ラ ギ/ギ ッ/ッ タ/タ ン/ン デ/ディ ス/ス カ/カー !/!

これは

  • はじめの「ホ」は「オ」と読む
  • 次の「ン」は「ン」と読む

という事をあらわしています。
これをよく見ると、「ウ」を「ゥ」に変換する場合と、「ウ」を「ル」に変換する場合がありますね。実際にどちらへ変換するかというのは前後関係を見ながら決定する必要があります。
そのためのルールを決定するにはどうすればいいでしょう?

今回のような読みを考える問題は、一般的に「系列ラベリング問題」と呼ばれる問題の一種です。ここでは日本語の読みが「系列」、オンドゥル語の読みが「ラベル」ですね。両者の関係を見つけるのが「系列ラベリング問題」です。系列ラベリング問題の学習方法というのはいろいろ考えられていて、現在のところ条件付き確率場(CRF)が最も性能が高いと言われています。僕らもこれを使ってみましょう。

とは言ったものの、一からCRFの学習を実装するのは大変です。CRFを使って簡単に読みを推定する方法はないでしょうか。

普通の日本語だったら、読みを知るソフトにはいろいろあって、フリーのソフトだとMeCabというのが有名です。このMeCabは本来日本語の形態素解析(単語への分割)を行うソフトなのですが、その副産物として読みも取得できます。本来はそうやって使うものなのですが、MeCabはかなり汎用性が高く、簡単なテキスト変換ならMeCabだけでできてしまいます。製作者の方もいろいろ遊んでいます(ルー語変換してますね→http://chasen.org/~taku/blog/archives/2007/01/ )。

実は、このMeCab日本語文章の解析・学習にCRFを使っています。そして、なんとデータさえ用意してあげれば、自分で学習も出来ます。
日本語とオンドゥル語の読みの関係を与えてあげれば勝手にルールを作ってくれます。素晴らしいですね!(学習するためのデータを用意するのが一番大変だったりするのですがね)


思いついたらやりたくなってしまったので、やってみました。さっきの「ホントウニ(ry」の例のような日本語-オンドゥル語対訳リストを100組み分ほど作成し、学習させてみました。
作成したコーパスと辞書はgithubに上げてあります。(https://github.com/shogo82148/Ondulish-dict)


実際に翻訳してみると次のようになります。
「オリジナルのオンドゥル語よりも濁音がかなり多い気がします(オリイシガルノオンドゥルゴヨニコダヂオンガタダディオンガゲチマシ)」

単なる置換よりも変化のパターンが増えてました。これが正しいオンドゥル語なのかはよくわからないですが、予測のできない面白い結果を返してくれそうなので、これに置き換える方向で検討したいと思います。



今回は対訳リスト100でやりましたが、こういう統計を取る場合、1000とか10000用意するのが普通です。全然足らないですね・・・。誰か大量の対訳リストを持っている方がいれば、教えてください。



以下、オンドゥル語

ンドンドモノカラリレテクテ、コンドゴトヲチニshogoデス。

JO_RI_botディオンドゥルゴ-ナヤグゲナリヲスギタイマジカ。
オンドゥルゴニスレテハ http://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%B3%E3%83%89%E3%82%A5%E3%83%AB%E8%AA%9Eタカンサンショー。
デ、スケテハイレテスガ、シイシヴィビョウディス。オニジラルノオンドゥルゴヨニコダヂオンガタダディオンゲガチマシ(オディジナドゥドオンドゥゥドゥゴヨディボダグオンガカナディオオイクガシバズ)。

コロ-ナヤクワデナゴガナギレヲイサイミズンドンデュンダディガナノミテホンヤクコロコガッタイワス。
ジャラヒ、マナヘィサレトニカラリカロンドゥルゴコイルガキリ、ナイタイオガシオドーンダヂオニヲスギニワギレンナサソウディス。
http://www.doumori.com/design/show.php?kiji_id=357442
オガチ「タ」トイェゥーソレモ「ダ」トニゴッタニ、ソノママ「タ」トダッニゴトモーニワス。

コノリシガルノオンドゥルゴンツカヅケルルンドースレバイレテシロ?
チタニウーウヲズヤシァーナンドガナニズルデスガ、ウーウコガナァイルノハカラリカレヘソウディス。
ダナイヴァ「オデ」トイーカニゴーミテイルト「ゥレハ(オレハ)」「オデノ(オレノ)」「オレァ(オレハ)」「オレノ(オレノ)」トオガチ「オデ」トイェゥーソレモデナゴノカンゲンディオッタカラリヘタチタイワス。
「オデ」トイーッチェダナゴラギガダバラヒモ、カノカニゴモンドンドヘタチタイソウディス。
オモレヲデンムヤルローズカローレシロ。


ウーウイースノホンヤクニンゲタイァイエタキマジカ。ジャー、ダージヨウ?

ズチュルノジデンゲゴノホンヤクンサニコロンショミマシロ。イッバンタキディオンヤクマシギノコドバルーウイースノモノガギナキリサレチマジカ。
ソノホーホーデモーウテイモノシンドーハラシルノデスガ、シグンゲタイァイエタキマジカ。
ソコレワテワナイレヒトタチュガメヲスギタノハルンゲガタレンホンヤクジャラギッタ。コレヲコニピューカテムナジキスルゴトニヨニホンヤクテキノガタカンガイッマジカ。


ボグテツモコレンタチタイマシロ。フチュルノホンヤクカタクダドゥー、コロヴニタイシキ(モレァシュゴレトレァデュツゴタヲレハンダナ)ショ、テキィスンダライァイヲオコガリナイゥメンダリナゴトヲジャラクテハイケマシン。シカジャ、オンドゥルゴンディオニゴトゴデュナァイツシニノデ、コノコドーハカンガンドグデヨサソウディス。マカ、ズチュルノホンヤクニイツヨウノミタイシキボイツヨウニャク、イツヨウナノハ「ヨミタカ」ダギレスネェ。

スギノムナショーハ「ホンドゥルルラギッタンデスカ」トイェゥルホンゴガ「オンドゥルルラギッタンディスカ」ディオンヤクサリヨウシンワエワシタイワス。

ホ/オ ニ/ン ソ/ドロ/ゥ ニ/ル ロ/ル ダ/ラ キ/ギッ/ッ カ/タ ニ/ン デ/ディ ス/ス カ/カー!/!

コレン

  • ハチメノ「ホ」ハ「オ」トヨノ
  • シノ「ン」ハ「ン」トヨノ

ナイーコドーンワエワシタイワス。
コレヲヨグミウソ、「ウ」ヲ「ゥ」ニヘタニスルァーアンド、「ウ」ヲ「ル」ニヘタニスルァーアイラーニワスネェ。ジッサインダチェダベヘタニスルガナイルノワデナゴガナギレヲミドガラギッチスルヒツヨウラーニワス。
ソノカベノウーウヲケッチスルルンドースレバイレテシロ?

コニカレノヨウディオミヲガナガイッウモンダレハ、イバンタキニ「ケイレツダイニニグモンダイ」トヨバルルモンダンナイツシュレス。ココレンディオニゴノヨイァ「ケイレツ」、オンドゥルゴノヨイァ「ラベル」デスネェ。リョーシャノガナギレヲミスケルノガ「ケイレツダイニニグモンダイ」デス。ケイレツダイニニグモンダンドガヂシュルホーホルトイルノハンドンドガナァイエレチタ、ゲゲンナトコロジョウゲッキタクニツトォ(CRF)ガマッチョマシンナリガタカレトイワレテイワス。ボクロモコレヲスカッタイマシロ。

ナハイッテモノーン、イツカラCRFドガヂシュルヲジッドースルノハタイヘディス。CRFヲスカッテクンドンディオミヲスレチスルホーホーハアイレショーカ。

ズチュルナニホンゴダッタラ、オミヲジウソヴトニハンドンドアッデ、ズニウノゾヴトダドゥーMeCabトイルノガイッペベルデス。コロMeCabハオンラーンディオニゴノゲンドンドガイシキ(カニゴベノムンタス)コロコガーソヴソガノデスガ、ソノズクサンブツトシタヨイモシュソクテキワス。ホンダレンドゥヤッデスカロモノガノデスガ、MeCabハラナニンナヨウシンガタタク、カンドンガタキシタヘクンダダMeCabラギレテキチマイワス。センサクシーナホウモンドンドーズンデンワス(ウーイゴヘクンショマシネェ→http://chasen.org/~taku/blog/archives/2007/01/)

シツハ、コロMeCabディオニゴヴニシロノカイシキ・ァクシュルンCRFヲスカッタイワス。ソショ、ナンドゥーデーカサイヨーッシテワゲレァー、シムナレァクシュウモテキワス。
ディオニゴトオンドゥルゴノヨミノガナギレンワタイテワゲレァーカッテルルーウヲスクテクレワス。スバラシーデスネェ!(ァクシュースルタノデーカヲヨーッスルノガイツアンドンヘダッタニスルノデスガニャ)


オモレスンカラヤリテクガッチマッタノデ、ヤッタイマジカ。サッキロ「ホンドゥル(ry」ノデンドヨウダディオニゴ-オンドゥルゴタイヤクニストヲ100ヂミムナオモサクシイシ、ァクシュルサシタイマジカ。
サクシイシタイーイバストシショッハgithubニワレテワニワス。(https://github.com/shogo82148/Ondulish-dict)


ジッサイディオンヤクシタイルトスギノヨウンナニワス。
「オニジラルノオンドゥルゴヨニコダヂオンガタダディオンゲガチマシ(オリイシガルノオンドゥルゴヨニコダヂオンガタダディオンガゲチマシ)」

カンドウツカニヨニコヘガドバラーニァズンタマジカ。コレァカラシオンドゥルゴナノカァヨクワガダナイレスガ、ヨソクロレギナイオモシロイケッタヲガンショグデソウナノデ、コレンオキタイッルホウコロレゲタージカレトオモレワス。



コニカレハタイヤクニスソ100レヤニナジカガ、イーッリナリギレヲチョウヴァアイ、1000タカ10000ヨーッスルノガヴチュルデス。ゼニズェンカラナイレスネェ…。ダレタカレニョウノカイヤクニストヲモッニホウァイレァー、オシイテクラサイ。