見出し画像

[Python]もらったデータが全角や半角が混在していた時の対処法[unicode正規化]

データの表記ゆれにどう対処するか?

以前、あるクライエントから大量のテキストデータをもらったことがありまして、その校正作業を頼まれたことがあります。

細かな表記ゆれなどの修正でしたが、意外に手間がかかる作業として、「ア」「ァ」「1」「1」といった全角半角問題もありました。

置き換え機能でポチポチと置き換えていたのですが、置き換える数が多いと結構辛かった…

そこで今思うと試したかったのが、「unicode正規化」です。

unicode正規化とは

例えば「1」と「1」は同じ「イチ」です。が、表記が違うわけです。片方は全角で、もう片方は半角ですね。この表記法を統一する用途で使われることが多い技術となります。

詳しいことは下記のサイトなどもご参照ください。

Pythonでのunicode正規化

Pythonでunicode正規化を行う場合はunicodedataモジュールのnormalize()関数を使用します。とても簡単に正規化ができるのがメリットです。
実際に書いてみましょう。

# モジュールのインポート
import unicodedata

unicodedata.normalize('NFKC','アア11')

結果は
''アア11''

となります。NFKCというのは正規化の形式です。詳しいことは上記の参考記事をお読みいただければと思いますが、正規化の形式は4つあります。

「NFD (Normalization Form Canonical Decomposition)」
「NFC (Normalization Form Canonical Composition)」
「NFKD (Normalization Form Compatibility Decomposition)」
「NFKC (Normalization Form Compatibility Composition)」
NFDとNFCは正準等価性 (Canonical Equivalent) によって分解. 同一文字とみなす条件がより厳しい.
NFDの後, 再度合成するのがNFC
NFKDの後, 再度合成するのがNFKC

Unicode正規化

けっこう複雑ですね…。とりあえず日本語を全角にして、英数字を半角にするといった用途でしたら、NFKDを使用することが良いらしいです。

注意点:バックアップは必ず取ったうえで行うこと

これは重要なポイントです。元データは必ずバックアップを取った後で正規化を行うようにしてください。
期待していたこととは異なる変換がなされた場合、もとに戻らなくなりましたといったことがあると大変ですので。


いいなと思ったら応援しよう!