Pythonで日本語文字列を高速に半角・全角変換できるライブラリ「mojimoji」を紹介します。
mojimojiは、Pythonでの全角・半角変換を高速に行うことが出来ます。こちらで紹介した方法を使って、内部的にCython及びC++のunordered_mapを用いて変換処理をしており、従来実装よりかなり高速に動作します。
インストール
% pip install mojimoji
概要
mojimojiには、han_to_zenとzen_to_hanの二つのメソッドがあります。また、それぞれkana、digit、asciiというキーワード引数を取り、カタカナ、数字、アルファベットの変換をそれぞれ無効化できます。
全角から半角への変換
>>> import mojimoji
>>> print mojimoji.zen_to_han(u'アイウabc012')
アイウabc012
>>> print mojimoji.zen_to_han(u'アイウabc012', kana=False)
アイウabc012
>>> print mojimoji.zen_to_han(u'アイウabc012', digit=False)
アイウabc012
>>> print mojimoji.zen_to_han(u'アイウabc012', ascii=False)
アイウabc012
半角から全角への変換
>>> import mojimoji
>>> print mojimoji.han_to_zen(u'アイウabc012')
アイウabc012
>>> print mojimoji.han_to_zen(u'アイウabc012', kana=False)
アイウabc012
>>> print mojimoji.han_to_zen(u'アイウabc012', digit=False)
アイウabc012
>>> print mojimoji.han_to_zen(u'アイウabc012', ascii=False)
アイウabc012
パフォーマンス
同じくPythonで半角・全角を変換するライブラリzenhan及びjctconvと動作速度を比較してみます。
% pip install zenhan
% pip install jctconv
% ipython
In [1]: import mojimoji
In [2]: import zenhan
In [3]: import jctconv
In [4]: s = u'アイオエオ012345' * 10
In [5]: %time for n in range(1000000): mojimoji.zen_to_han(s)
CPU times: user 3.90 s, sys: 0.03 s, total: 3.93 s
Wall time: 3.97 s
In [6]: %time for n in range(1000000): zenhan.z2h(s)
CPU times: user 71.05 s, sys: 0.16 s, total: 71.22 s
Wall time: 71.45 s
In [7]: %time for n in range(1000000): jctconv.z2h(s)
CPU times: user 19.75 s, sys: 0.06 s, total: 19.81 s
Wall time: 19.86 s
Pure Pythonで実装されたzenhanライブラリと比較して約18倍、jctconvと比較して約5倍、高速に処理できていることが分かります。