ECサイトの商品データや顧客リストなど、全角と半角が混在するテキストデータを扱う際、表記揺れを統一する「正規化」は必須の処理です。Python標準のライブラリでも変換は可能ですが、日本語処理においては mojimoji ライブラリが圧倒的に高速で、かつ細かい制御が可能です。
今回は、商品管理システムを想定し、乱雑に入力された商品データの全角・半角を mojimoji を使ってきれいに整形する方法を解説します。
目次
mojimojiのインストール
mojimoji はC言語で実装された高速な外部ライブラリです。
pip install mojimoji
実装例:商品データの正規化
入力された商品名に含まれる英数字は「半角」に統一したいが、カタカナの商品名は読みやすさを考慮して「全角」のままにしたい、といったケースはよくあります。mojimoji なら引数一つでこの制御が可能です。
以下のコードは、全角英数・全角カナ・全角記号が混じった商品データを整形する例です。
import mojimoji
def main():
# データベースに登録されている表記揺れのある商品名
# "Super PC モデルA 198000円"
# 全角英字、全角スペース、全角カナ、全角数字が混在
product_name = "Super PC モデルA 198000円"
print(f"【元のデータ】\n{product_name}\n")
# 1. すべてを半角に変換する (デフォルト)
# 英数、スペース、カナのすべてが半角になります
normalized_all = mojimoji.zen_to_han(product_name)
print(f"全変換(すべて半角): {normalized_all}")
# 2. カナは「全角」のまま、英数字・記号のみ半角にする (kana=False)
# 日本語の可読性を保ちつつ、英数字を統一したい場合に最適です
normalized_smart = mojimoji.zen_to_han(product_name, kana=False)
print(f"カナ除外(英数のみ半角): {normalized_smart}")
# 3. 数字は「全角」のままにする (digit=False)
# 金額などの数字表記を全角で維持したい場合に使用します
normalized_no_digit = mojimoji.zen_to_han(product_name, digit=False)
print(f"数字除外(数字は全角維持): {normalized_no_digit}")
# 4. 英字は「全角」のままにする (ascii=False)
normalized_no_ascii = mojimoji.zen_to_han(product_name, ascii=False)
print(f"英字除外(英字は全角維持): {normalized_no_ascii}")
# --- 逆変換の例 ---
# 5. 半角を全角に戻す (han_to_zen)
# レガシーシステム連携などで全角固定長フォーマットが必要な場合に使用します
half_width_text = "MacBook Pro M3"
full_width_text = mojimoji.han_to_zen(half_width_text)
print(f"\n【逆変換】半角→全角: {full_width_text}")
if __name__ == "__main__":
main()
コードの解説
mojimoji.zen_to_han(text, ...) 全角文字を半角文字に変換します。この関数の強力な点は、以下のオプション引数で変換対象を細かくフィルタリングできることです。
kana=False: カナ文字(カタカナ)を変換対象から外します。商品名や氏名のフリガナなど、カタカナは全角で扱いたい場合に非常に便利です。digit=False: 数字(0-9)を変換対象から外します。ascii=False: アルファベットや記号(ASCII文字)を変換対象から外します。
実務での活用ポイント 正規表現を使って同様の処理を書くことも可能ですが、mojimoji は実装がシンプルでバグが入りにくく、処理速度も桁違いに速いため、大量のログデータやCSV処理を行うバッチ処理などで特に威力を発揮します。
