01.7.2
カタカナ・ひらがなを統一する
ord と chr で 0x60 を足し引きするだけで片仮名と平仮名を相互変換できます。半角カナは先に unicodedata.normalize("NFKC") で全角に揃えると同じ関数に通せます。名寄せや音声検索の前処理として、かな表記のゆれをどちらか一方に寄せたいときに使います。直感 #
ふりがな欄やフードメニューには、「ふぁみりーまーと」「ファミリーマート」「ファミリーマート」のように同じ読みの別表記が混ざり、value_counts() を取ると 3 行に割れます。文字コード表を見ると、ひらがなの「あ」は U+3042、カタカナの「ア」は U+30A2 で、差は 0x60(10 進で 96)です。「ん」と「ン」まで同じ差です。だから 1 文字ずつ 0x60 を引けばカタカナ→ひらがな、足せばひらがな→カタカナになります。半角カナだけは別のブロック(U+FF66 以降)にあるため、先に NFKC 正規化で全角カタカナに直してから同じ式に通します。
Python で変換する #
次のコードは kata_to_hira と hira_to_kata の 2 関数を定義し、半角・全角カタカナ・ひらがなの 3 サンプルを NFKC 正規化してから kata_to_hira に通して、すべて同じひらがなになることを確かめます。
| |
実行結果の読み方 #
3 行の出力はいずれも矢印の右側が「ふぁみりーまーと」で、左側も NFKC 後の文字列なので 1 件目の半角カナは「ファミリーマート」として表示されます。ひらがなの 3 件目は kata_to_hira の範囲に 1 文字も入らず、何も変わらずに通過しています。変換後の列で nunique() を取ると 3 から 1 に減るので、名寄せの効果を数値で確認できます。
使いどころと落とし穴 #
「ヴ」は kata_to_hira で「ゔ」(U+3094) に写りますが、ひらがなの文章では「ヴ」を「ぶ」と書くことが多いので、「ヴァイオリン」と「ばいおりん」のゆれは 0x60 の変換だけでは吸収できません。「ヵ」「ヶ」も「ゕ」「ゖ」になるものの、住所の「三ヶ日」のような固有名詞では元の表記を残したいはずです。こうした例外は辞書ベースの置換テーブルを kata_to_hira の後に挟んで案件ごとに調整してください。送り仮名付きの漢字(「申し込み」)から読みを取り出したい場合は、fugashi や SudachiPy が返す読み(カタカナ)を kata_to_hira に通すと、ひらがな表記で安定したキーが作れます。