LoginSignup
31

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-01-03

はじめに

こんにちは、避雷です。
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=あらゆるげんじつをすべてじぶんのほうへねじまげたのだ

レスポンス:


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

なるほど、検索候補を可能性が高い順に返してくれるみたいです。この文章型月っぽくてよくないですか?
当然ネットワークに繋がっていないと使えない点に注意。

解説

漢字→カタカナ

Mecabを使って漢字をカタカナに変換します。Mecabからの返り値を扱いやすくする処理についてはこちらなどを参考にしてください。
PythonでMeCabの出力をリスト化するモジュール(mecab-python)
この記事では返された文字列を,でsplitしてlistに格納しています。

            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]が読みの部分に当たります。このように抽出した読みが漢字をカタカナ変換したものとして使えます。

カタカナ→ひらがな

この部分はカタカナ、ひらがなの変換用の辞書を作って対応します。

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単語の場合の送信、受け取りの方法を見てみます。

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))

の部分をいじりましょう。

ひらがな→カタカナ

カタカナ→ひらがなと逆の辞書を作って対応します。

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に突っ込みましょう。

最後に

これでひらがな、カタカナ、漢字変換の6方向の変換ができるようになりました。問題としては漢字変換が絡む変換の精度についてですが、これには多少の妥協が必要そうです。まぁ個人的に変換を駆使して遊ぶ程度ならなんとかなるでしょう。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31