カタカナ・ひらがなを統一する

3.7.2

カタカナ・ひらがなを統一する

最終更新 2020-02-12 読了時間 1 分
まとめ
  • カタカナとひらがなを相互変換して表記を統一する。
  • Unicodeコードポイントのオフセット(0x60)で片仮名⇄平仮名を変換する。
  • 名寄せや音声検索で、かな表記のゆれを吸収したいときに使う。

ふりがなやフードメニューなど、片仮名と平仮名が混在すると集計がずれます。用途に合わせて片仮名に揃えたり、平仮名に落としたりするユーティリティを用意しておきましょう。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import unicodedata

HIRA_START = ord("ぁ")
HIRA_END = ord("ゖ")
KATA_START = ord("ァ")

def kata_to_hira(text: str) -> str:
    chars = []
    for ch in text:
        code = ord(ch)
        if KATA_START <= code <= ord("ヺ"):
            chars.append(chr(code - 0x60))
        else:
            chars.append(ch)
    return "".join(chars)

def hira_to_kata(text: str) -> str:
    chars = []
    for ch in text:
        code = ord(ch)
        if HIRA_START <= code <= HIRA_END:
            chars.append(chr(code + 0x60))
        else:
            chars.append(ch)
    return "".join(chars)

samples = ["ファミリーマート", "ファミリーマート", "ふぁみりーまーと"]
for s in samples:
    s_nfkc = unicodedata.normalize("NFKC", s)
    print(s_nfkc, "→", kata_to_hira(s_nfkc))

NFKC 正規化を挟むと半角カタカナも自動的に全角へ揃えられます。業務システムではカタカナで統一することが多いので、hira_to_kata を通してから保存する運用が定番です。

追加の工夫 #

  • など拗音・促音の揺れは別処理が必要です。辞書ベースで例外を作るか、案件に応じた置換テーブルを併用してください。
  • 送り仮名付きの漢字(例: 申し込み)から読みを取り出したい場合、機械学習の前処理として fugashiSudachiPy の出力を平仮名へ変換すると安定します。