COTOHA API で空耳アワー

# 空耳
なぜか、英語が日本語のように聞こえることがある。

[空耳アワー](https://www.tv-asahi.co.jp/tamoriclub/#/?category=variety)では、英語を含む外国語の歌が日本語に聞こえるようなフレーズを紹介してくれている。

そんな空耳をまとめてくれているのが、[空耳アワーアップデート](http://www7a.biglobe.ne.jp/~soramimiupdate/)だ。
過去の空耳作品がまとめられていて貴重なデータベースになっている。
例えば "I HEAR BABIES CRY" は「あ、返品ですかい」と聞こえるそうだ。（[2019年5月24日放送](http://www7a.biglobe.ne.jp/~soramimiupdate/past/2019.htm)）

こんな空耳を自然言語処理を使って生成できないだろうか。
（誰かがすでにやっていそうなので、あえて調べないでやってみる。）


# COTOHA API
[この前の記事](https://qiita.com/dakikd/items/f15d4814a52ef17670cd)で [COTOHA API](https://api.ce-cotoha.com/contents/index.html) を使えば、日本語だけでなく、英語も解析できることが分かった。

例えば、"happy" を COTOHA API で解析すると、"ハッピー" というカタカナ読みが得られる。

今回も COTOHA API の英語の解析結果を使ってみよう。


# 空耳生成システム
大量の英文を解析して、日本語に聞こえるようなフレーズを見つけるのは大変そうだ。
今回は、日本語に聞こえるような英語を生成することにしよう。
つまり、日本語文を入力として、入力文と似たような読みになる英語文を出力する。

空耳生成システムの概略は以下のとおりだ。

## [1] 日本語文の解析
まず、日本語文を COTOHA API で解析して、日本語としての読み（カタカナ）を取得する。
そして、読みのカタカナをローマ字に変換する。
※長音の「ー」は削除する。

カタカナのままだと、"カ" と "コ" は全く違う文字となってしまうが、ローマ字に変換すれば、"ka" と "ko" は "k" が一致するため、読みの類似性を吸収してくれそうだ。

例えば、"自然言語処理" => "シゼンゲンゴショリ" => "s i z e n g e n g o s y o r i" のように変換する。


## [2] 類似英単語の検索
上記の "自然言語処理" の "sizen" と読みが一致する英単語は見つからない。
そのため、読みが完全に一致するのではなく、読みが類似した単語を検索することにする。

類似検索には、編集距離で高速に類似検索を行える [symspell](https://qiita.com/daimonji-bucket/items/1f40bc3242a3d26133d0)
を使う。
日本語の読みのローマ字で、英語のローマ字読みを検索する。

例えば、"自然言語処理" の "言" のローマ字の "gen" で類似検索を行うと、
1文字違い（編集距離＝1）の "ten"、"pen" などが得られる。

ここで、コスト ＝ 編集距離 ÷（入力と辞書とで短い方のローマ字長）とし、コストが小さいローマ字の英単語を返すようにする。

類似検索を行うにあたって、事前に辞書を作成しておく必要があるが、
今回も『[詳解 ディープラーニング 第2版] (https://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-%E7%AC%AC2%E7%89%88-TensorFlow-Keras%E3%83%BBPyTorch%E3%81%AB%E3%82%88%E3%82%8B%E6%99%82%E7%B3%BB%E5%88%97%E3%83%87%E3%83%BC%E3%82%BF%E5%87%A6%E7%90%86-%E5%B7%A3%E7%B1%A0/dp/4839969515)』で紹介されている日英対訳コーパスの英語文を利用し、約4000語の英単語のローマ字辞書を作成した。


## [3] 空耳度による英文生成
類似する英単語を並べるだけでは、元の日本語の読みから大きくずれてしまう。
そのため、類似検索での各英単語のコストの合計を「空耳度」とし、空耳度が最小となるような英単語の組み合わせを出力とする。

例えば、"自然言語処理" の "sizen" は ["s", "i", "z", "e", "n"]、["s", "iz", "en"]、 ["siz", "en"] など、いろいろな組み合わせがあり得るが、辞書に "si"（she:シ） と "zen"（then:ゼン）が登録されている場合、
["si", "zen"] の組み合わせがコスト＝0 の最適な組み合わせとなる。
※"she" の読みは "シー" だが、ローマ字に変換する際に長音「ー」は削除

そして、入力の日本語の読みのローマ字列から、コスト最小で英語ローマ字列を対応づけるには、形態素解析などに使われているビタビアルゴリズムを使う。

"自然言語処理" で、空耳度が最小がとなったのが以下のフレーズだ。
"she then ten go theory"（シー ゼン テン ゴー セオリー）

口に出して "she zen tengo theory" を読んでみてほしい。
"自然言語処理" に聞こえるのではないか。

なお、今回は英語としての自然さは一切考慮していないので、変な英語になっているる。


# 空耳例
いくつかの日本語文から、どんな英文が生成されるかみてみよう。

　（入力）今日は晴れている
　（カナ）キョウハハレテイル
⇒（出力）キュー ハー ハリー ティル
　（カナ）queue her hurry till
　なかなかいい感じだが、助詞の「は」の読みを「ワ」にするような処理をいれておけばよかったか。

　（入力）私は日本人です。
　（カナ）ワタシハニホンジンデス
⇒（出力）mutter she  her  knee phon genius
　（カナ）マター シー ハー ニー ホン ジーニアス
　自己紹介で、いきなり "genius" とは。。。

　（入力）電車がすいていた
　（カナ）デンシャガスイテイタ
⇒（出力）danger gas teacher
　（カナ）デンジャー ガス ティーチャー
　穏やかな雰囲気が、一気に危険な感じに。。。

　（入力）はまちは好きですか
　（カナ）ハマチハスキデスカ
⇒（出力）her  march her  ski   death car
　（カナ）ハー マーチ ハー スキー デス カー
　まさかの "death car"。。。

　（入力）自然言語処理は面白い
　（カナ）シゼンゲンゴショリハオモシロイ
⇒（出力）she  then ten  go   theory   her  ought  silly
　（カナ）シー ゼン テン ゴー セオリー ハー オート シリィ
　「面白い」はよい単語がなかったようだ。

■おわりに
日本語文から似たような読みになる英語文を生成する空耳システムを作ってみた。

自然言語処理の割には不自然な英語になってしまったが、より大規模なコーパスを使って、語彙数を増やしたり、単語の並びの統計情報を使えば、自然な英文に近づくだろう。

最後にもう一文試してみよう。

　（入力）コトハAPIは賢い
　（カナ）コトハエーピーアイハカシコイ
⇒（出力）koto happy   eye  her car  she boy
　（カナ）コト ハッピー アイ ハー カー シー ボーイ

　"COTOHA API" には "happy" が含まれていた！