【全角⇔半角】Pythonで日本語の表記ゆれを整えるライブラリおすすめ

Pythonパイソン で『半角文字』と『全角文字』を変換するときに、おすすめのライブラリです。

  • jaconv(ジャパニーズコンバーター)
  • mojimoji(モジモジ)
  • str.maketrans()str.translate()(メイクトランス と トランスレート)

自分はこの3つを使ってきましたが、どれもおすすめです。

あと、もっと広い範囲の文字について正規化せいきか (normalizeノーマライズ) するときは、unicodedata.normalize() (ユニコードデータ ドット ノーマライズ)が便利でした。

まず、『unicodedata.normalize()』を適用してから、『jaconv.z2h() や jaconv.h2z()』を適用する、といった処理も、自分はよく使ってきました。

jaconv(ジャパニーズコンバーター)

一番使っているのは jaconv です。

pip で簡単にインストールできて、メソッド名も短いところが好きです。

変換速度もとても速かったです。特別な理由がない限り jaconv を使っています。

ありがとうございます。

GitHub – ikegami-yukino/jaconv

Python3での日本語変換モジュールの比較 – Qiita

mojimoji(モジモジ)

大量のテキストを扱うときは、mojimoji を使っています。

自分が使用したときは、いろいろとコンパイラの準備をしてから pip でインストールする必要がありました。

インストールはむずかしかったですが、確かに高速化できました。

ありがとうございます。

GitHub – studio-ousia/mojimoji

str.maketrans() と str.translate()

英数字に関しては、Python の標準モジュールでも、全角⇔半角ができました。

メイクトランス str.maketrans()トランスレート str.translate() を使った方法です。

(Python) static str.maketrans(x[, y[, z]])

(Python) str.translate(table)

はじめに、変換テーブルを作ります。

変換テーブル = str.maketrans('aA0', 'aA0')

これを、トランスレートメソッド .translate() に渡したら変換できました。

'aA0'.translate(変換テーブル)

実行結果
'aA0'

変換テーブルは、事前に for 文の外で定義しておいて、使いまわすのがいいと思います。

なるべく外部モジュールを使わずに、標準モジュールだけで書きたいときに使っています。

全角⇔半角変換のほかにも、カッコや記号の種類をまとめて置換したいときに便利でした。

1文字ずつの置換限定ですが、リプレース .replace() が3つ以上連続しちゃったときは、メイクトランス .maketrans() とトランスレート .translate() に書き換えてみるというのも、良かったです。

半角の英数字リストを出すコード

変換テーブルの作成には、半角の英数字リストがあると便利です。

以下の string モジュールをインポートして使います。

(Python) string — 一般的な文字列操作
string.ascii_letters
string.ascii_lowercase
string.ascii_uppercase
string.digits

半角の英数字リストは、以下の Python コードで出せました。

import string

print('[string.ascii_letters]')
print(string.ascii_letters)

print('\n[string.ascii_lowercase]')
print(string.ascii_lowercase)

print('\n[string.ascii_uppercase]')
print(string.ascii_uppercase)

print('\n[string.digits]')
print(string.digits)

実行結果

[string.ascii_letters]
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

[string.ascii_lowercase]
abcdefghijklmnopqrstuvwxyz

[string.ascii_uppercase]
ABCDEFGHIJKLMNOPQRSTUVWXYZ

[string.digits]
0123456789

これらをもとに、テキストエディタや jaconv で、全角の英数字リストを作ります。

自分はこのようにして、変換テーブルを作りました。

Python は初めから便利なライブラリがそろっていて、とてもありがたいです。

全角⇔半角の変換ライブラリはおすすめ

自分が Python でテキスト分析をしていた時のことです。

ウェブページの HTML や、開示情報の PDF を読み込んでいたら、どうしても表記ゆれが問題になりました。

そこで、英数字を半角に統一して、半角カナを全角に統一することにしました。

これで、『テキストの検索』や『単語の数を数える処理』が、より正確に、より効率的になりました。

あと、全角カッコも半角カッコに統一しました。

特に、開示情報リストなど、Excel で見るようなものは、省スペースで済む半角文字に変換しました。

Excel の表がとてもコンパクトになりました。

全角と半角を相互に変換するライブラリは、文字列処理で、非常に有用でした。

まずは、jaconv を試してみるのがおすすめです。

そして、1文字ずつの英数字や記号に関しては、メイクトランス .maketrans()トランスレート .translate() もおすすめです。

Python の標準モジュールだけで、変換処理を簡単に実装することができました。

unicodedata.normalize()

全角半角を含めた、もっと広い範囲の文字について変換するときは、Python 標準モジュールの unicodedata.normalize()ユニコードデータ ドット ノーマライズ が便利でした。

(Python) unicodedata.normalize(form, unistr) – form: 'NFC', 'NFKC', 'NFD', 'NFKD'.

使用例です。

import unicodedata
text = unicodedata.normalize('NFKC', text)

これで、以下のような変換ができました。

  • 全角スペース(\u3000) -> 半角スペース(\u0020, \x20)
  • \xa0 (\u00a0, non-breaking space, nbsp) -> 半角スペース
  • 全角英数字 -> 半角英数字
  • 半角カナ -> 全角カナ
  • ① -> 1
  • ㈱ -> (株)
  • 『か』+『゛』の結合文字 -> 1文字の『が』

囲み文字や結合文字といった特殊な文字まで正規化せいきかされて、さらに分析しやすくなりました。

どのような文字に変換するのかは、'NFC', 'NFKC', 'NFD', 'NFKD' で、指定することができました。

unicodedata.normalize() は、例えば Python で『日本語を全文検索ぜんぶんけんさくするプログラム』を書いたときに使用しました。

【Python】SQLite で日本語を全文検索するコード例【N-Gram, FTS4/FTS5】

テキスト分析は、とても面白い分野でした。

『文字の種類』の統一は、常に難しい問題でしたが、これらの使いやすいライブラリのおかげで、早期に実用的なプログラムを作ることができました。

ありがとうございます。

タイトルとURLをコピーしました