3記事続けてのユニコード正規化の話です。
これまで標準ライブラリのunicodedata.normalize
を使っていましたが、
実はpandasのDataFrameやSeriesにもユニコード正規化のメソッドが実装されています。
ドキュメント: pandas.Series.str.normalize
これを使うと大量の文字列を一気に正規化できるので、個人的にはこちらを使うことが多いです。
機械学習で、学習時はpandasのnormalizeを使い、
その後、個々のデータを予測する時にunicodedata.normalize
を使ってしまうと、結果変わってしまう恐れがあるのではないかと
心配して調べたことがあるのですが、pandasのnormalizeはunicodedataのラッパーになっていて、
中では同じモジュールを使っているので問題ありませんでした。
(ドキュメントを読んでもわかりますね。)
pandas の v0.25.0 のコードから抜粋しますが、この通り、unicodedata.normalizeを呼び出しているだけです。
@forbid_nonstring_types(["bytes"])
def normalize(self, form):
"""
Return the Unicode normal form for the strings in the Series/Index.
For more information on the forms, see the
:func:`unicodedata.normalize`.
Parameters
----------
form : {'NFC', 'NFKC', 'NFD', 'NFKD'}
Unicode form
Returns
-------
normalized : Series/Index of objects
"""
import unicodedata
f = lambda x: unicodedata.normalize(form, x)
result = _na_map(f, self._parent)
return self._wrap_result(result)
実際に使うと、次のようになります。
Seriesを例にとりましたが、DataFrameの列を対象にする場合も同様です。
import pandas as pd
series = pd.Series(
[
"パピプペポ",
"①⑵⒊",
"㍾㍽㍼㍻",
"㌢ ㌔ ㍍"
]
)
print(series.str.normalize("NFKC"))
# 以下出力
'''
0 パピプペポ
1 1(2)3.
2 明治大正昭和平成
3 センチ キロ メートル
dtype: object
'''