Python 、Mecab、GoogleTranslitrateAPIで漢字→カタカナ→ひらがな→漢字変換をする。

#はじめに
こんにちは、避雷です。
Pythonでひらがな、カタカナ、漢字変換をする方法ついてググってみたところ、一部の方向の変換のみに偏った検索結果が出て来たのでここでまとめてみようと思います。　
#使うものの説明
##Mecab
日本語文章解析ライブラリです。形態素解析したり漢字の読み仮名をカタカナで返してくれたりします。
http://taku910.github.io/mecab/
Pythonでこれを使えるようにする設定に関してはここでは取り扱いません。参考記事を載せておくのでそれを見てください。

##GoogleTranslitrateAPI
Googleの提供する、ひらがなに対応する変換をjsonで返すwebAPIです。
https://www.google.co.jp/ime/cgiapi.html

http://www.google.com/transliterate にパラメータをつけてリクエスト(文章)を送ると文節で区切った上で各々の文節に対して変換候補を集めたjsonを返します。
ちょっと例をあげてみると
リクエスト：`http://www.google.com/transliterate?langpair=ja-Hira|ja&text=あらゆるげんじつをすべてじぶんのほうへねじまげたのだ`

レスポンス：

```json

[["あらゆる",["あらゆる","アラユル","有らゆる","汎ゆる","ｱﾗﾕﾙ"]],
["げんじつを",["現実を","幻日を","ゲンジツを","現實を","玄日を"]],
["すべて",["すべて","全て","総て","∀","凡て"]],
["じぶんのほうへ",["自分の方へ","自分のほうへ","ジブンの方へ","時分の方へ","ジブンのほうへ"]],
["ねじまげたのだ",["捻じ曲げたのだ","ねじ曲げたのだ","ねじまげたのだ","捩じ曲げたのだ","ネジマゲたのだ"]]]

```

なるほど、検索候補を可能性が高い順に返してくれるみたいです。~~この文章型月っぽくてよくないですか？~~
当然ネットワークに繋がっていないと使えない点に注意。
#解説
##漢字→カタカナ
Mecabを使って漢字をカタカナに変換します。Mecabからの返り値を扱いやすくする処理についてはこちらなどを参考にしてください。
[PythonでMeCabの出力をリスト化するモジュール(mecab-python)](https://qiita.com/menon/items/2b5ad487a98882289567)
この記事では返された文字列を`,`でsplitしてlistに格納しています。

```python
            if wclass[6] == None:
                word_class.append((word,wclass[0],wclass[1],wclass[2],""))
            else:
                word_class.append((word,wclass[0],wclass[1],wclass[2],wclass[6]))
```

の部分を書き換えれば臨む出力のタプルやらリストやらが得られます。
これにも書いてあるように、MeCabの各語に対する出力形式は

```
品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音
```

のようになっているのでここから読みの部分だけを抽出してあげましょう。上記の例だと`wclass[7]`が読みの部分に当たります。このように抽出した読みが漢字をカタカナ変換したものとして使えます。
##カタカナ→ひらがな
この部分はカタカナ、ひらがなの変換用の辞書を作って対応します。

```python
def convert_kata_to_hira(katakana):
    hira_tupple = ('あ','い','う','え','お','か','き','く','け','こ','さ','し','す','せ','そ','た','ち','つ','て','と','な','に','ぬ','ね','の','は','ひ','ふ','へ','ほ','ま','み','む','め','も','や','ゆ','よ','ら','り','る','れ','ろ','わ','を','ん','っ','ゃ','ゅ','ょ','ー','が','ぎ','ぐ','げ','ご','ざ','じ','ず','ぜ','ぞ','だ','ぢ','づ','で','ど','ば','び','ぶ','べ','ぼ','ぱ','ぴ','ぷ','ぺ','ぽ')
    kata_tupple = ('ア','イ','ウ','エ','オ','カ','キ','ク','ケ','コ','サ','シ','ス','セ','ソ','タ','チ','ツ','テ','ト','ナ','ニ','ヌ','ネ','ノ','ハ','ヒ','フ','ヘ','ホ','マ','ミ','ム','メ','モ','ヤ','ユ','ヨ','ラ','リ','ル','レ','ロ','ワ','ヲ','ン','ッ','ャ','ュ','ョ','ー','ガ','ギ','グ','ゲ','ゴ','ザ','ジ','ズ','ゼ','ゾ','ダ','ヂ','ヅ','デ','ド','バ','ビ','ブ','ベ','ボ','パ','ピ','プ','ペ','ポ')
    k_to_h_dict = dict()
    for i in range(len(hira_tupple)):
        k_to_h_dict[kata_tupple[i]] = hira_tupple[i]
    hiragana = ""
    for i in range(len(katakana)):
        hiragana += k_to_h_dict[katakana[i]]
    return hiragana
```

##ひらがな→漢字
ひらがなをGoogleWebAPIに送信して、変換候補の入ったJsonを受け取ります。これに関しては変換に誤りが生じてしまう可能性を排除できません。概ね正しい変換を返す、というぐらいの精度だと割り切りましょう。
試しに1単語の場合の送信、受け取りの方法を見てみます。

```python
url = "http://www.google.com/transliterate?"
param = {'langpair':'ja-Hira|ja','text':yomi_hira}
paramStr = urllib.parse.urlencode(param)
print(url + paramStr)
readObj = urllib.request.urlopen(url + paramStr)
response = readObj.read()
data = json.loads(response)
fixed_data = json.loads(json.dumps(data[0], ensure_ascii=False))

```

jsonファイルに全角文字が含まれていると意図しない挙動になったので文字コード周りの処理で手間取ってます。いい方法あったら教えてください。`fixed_data`の中身は、

```
[元のひらがな,[変換候補1,変換候補2,...,変換候補n]]
```

という風になっています。一番それらしい候補を表示するには`fixed_data[1][0]`とすればいいことがわかります。
複数単語の変換を同時にやりたいときは

```
fixed_data = json.loads(json.dumps(data[0], ensure_ascii=False))
```

の部分をいじりましょう。
##ひらがな→カタカナ
カタカナ→ひらがなと逆の辞書を作って対応します。

```python
def convert_hira_to_kata(hiragana):
    hira_tupple = ('あ','い','う','え','お','か','き','く','け','こ','さ','し','す','せ','そ','た','ち','つ','て','と','な','に','ぬ','ね','の','は','ひ','ふ','へ','ほ','ま','み','む','め','も','や','ゆ','よ','ら','り','る','れ','ろ','わ','を','ん','っ','ゃ','ゅ','ょ','ー','が','ぎ','ぐ','げ','ご','ざ','じ','ず','ぜ','ぞ','だ','ぢ','づ','で','ど','ば','び','ぶ','べ','ぼ','ぱ','ぴ','ぷ','ぺ','ぽ')
    kata_tupple = ('ア','イ','ウ','エ','オ','カ','キ','ク','ケ','コ','サ','シ','ス','セ','ソ','タ','チ','ツ','テ','ト','ナ','ニ','ヌ','ネ','ノ','ハ','ヒ','フ','ヘ','ホ','マ','ミ','ム','メ','モ','ヤ','ユ','ヨ','ラ','リ','ル','レ','ロ','ワ','ヲ','ン','ッ','ャ','ュ','ョ','ー','ガ','ギ','グ','ゲ','ゴ','ザ','ジ','ズ','ゼ','ゾ','ダ','ヂ','ヅ','デ','ド','バ','ビ','ブ','ベ','ボ','パ','ピ','プ','ペ','ポ')
    h_to_k_dict = dict()
    for i in range(len(hira_tupple)):
        h_to_k_dict[hira_tupple[i]] = kata_tupple[i]
    katakana = ""
    for i in range(len(hiragana)):
        katakana += h_to_k_dict[hiragana[i]]
    return katakana
```

##漢字→ひらがな
漢字→カタカナ変換とカタカナ→ひらがな変換を続けて適用します。
Mecabから生成したカタカナをひらがなにコンバートしましょう。
##カタカナ→漢字
カタカナ→ひらがな変換とひらがな→漢字変換を続けて適応します。
カタカナをひらがなにコンバートした後GoogleTranslitrateAPIに突っ込みましょう。
#最後に
これでひらがな、カタカナ、漢字変換の６方向の変換ができるようになりました。問題としては漢字変換が絡む変換の精度についてですが、これには多少の妥協が必要そうです。まぁ個人的に変換を駆使して遊ぶ程度ならなんとかなるでしょう。