Edited at

Pythonで半角・全角の変換を高速に行う

More than 3 years have passed since last update.

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倍、高速に処理できていることが分かります。


ダウンロード