私が開発している Python の日本語変換モジュール "Utsuho" をアップグレードしました。
日本語を含むデータを取り扱う際に半角と全角、ひらがなとカタカナといった表記の違いに悩まされることは、よくあります。
例えば、日本郵便株式会社の郵便番号データ、総務省の全国地方公共団体コードといった住所関連のオープンデータは、住所の仮名表記が半角カタカナであったり、全角ひらがなであったりと統一されていません。
そんなよくある日本語の問題に対処すべく、私がオープンソースソフトウェアとして公開しているのが、"Utsuho" です。
日本語変換モジュールは、数多く公開されていますが、文字のマッピングがドキュメントに明記されていなかったり、必要以上に多機能であったり、業務で採用しづらいと感じることも多くありました。
"Utsuho" は、ドキュメントファーストで開発をおこなっており、文字のマッピングといった仕様がドキュメントに明記されています。現時点のドキュメントは、日本語で公開しています。
現時点の機能は、半角文字と全角文字の相互変換、ひらがなとカタカナの相互変換の 2 機能です。今後の機能拡充も、日本語の相互変換できる表記の違いに焦点を絞って、実施していく計画です。
又、Python モジュールとしてユーザーのアプリケーションへ組み込む以外にも、コマンドラインから直接利用していただけます。
% utsuho half-to-full "キョウトシ サキョウク ギンカクジチョウ 2"
キョウトシ サキョウク ギンカクジチョウ 2
% utsuho katakana-to-hiragana "キョウトシ サキョウク ギンカクジチョウ 2"
きょうとし さきょうく ぎんかくじちょう 2
個人開発のため、至らぬ部分もあるかと思いますが、ご利用いただければ幸いです。プロジェクトへのコントリビュートも募集しています。
私は、今後 "Utsuho" を使用して、住所文字列正規化の別モジュールを作成する予定です。
他製品との比較
全角から半角、及び半角から全角への変換を実現する他製品と比較してみました。
- jaconv
- mojimoji
unicodedata.normalize('NFKC')
尚、unicodedata.normalize('NFKC')
は、日本語変換モジュールではなく、Unicode データの正規化を実現する関数です。データクレンジングで使用されるケースも多いようなので、比較対象とします。
全角から半角への変換: jaconv と mojimoji との違い
jaconv と mojimoji は、結果が同じでした。utsuho との相違点は、次の通りです。
- 半角カタカナの定義があるワ行の
ワ
とヲ
の合成済み文字の濁音は全角のまま変換されません。 - 結合文字の濁音記号と半濁音記号の変換されずに結合文字として残ります。
- カタカナに続くかどうかは問わず、結合文字ではない単独の濁音記号と半濁音記号は全角のまま変換されません。
- 異体字セレクターは除去されずに残ります。
- 波線は全角のまま変換されません。全角チルダは半角へ変換されます。
全角カタカナの ヷ
と ヺ
は Unicode の katakana チャートに含まれており、半角カタカナに ワ
と ヲ
も定義されているため、utsuho では半角文字へ変換します。ヸ
と ヹ
は Unicode の katakana チャートに含まれていますが、半角カタカナに旧字体の ヰ
と ヱ
が定義されていないため、utsuho でも半角文字へは変換しません。
Unicode に結合文字としての半角の濁音記号と半濁音記号が定義されていません。utsuho では直前のカタカナと結合できる場合とカタカナに続くと判断できる場合に限り、全角の結合文字としての濁音記号と半濁音記号を結合文字ではない半角の濁音記号と半濁音記号へ変換します。
全角の疑問符や感嘆符は異体字セレクターを使用することで、フォントの実装によりますが、左右や中央揃えで表示することができるとされています。半角の疑問符や感嘆符には、その定義はありません。Utsuho では半角に定義のない異体字セレクターは除去します。
歴史的な経緯とフォントが似ていることから、日本語環境では波線と全角チルダは同等に扱われることが多いです。Utsuho では全角の波線も半角のチルダへ変換します。
全角から半角への変換: unicodedata.normalize('NFKC')
との違い
unicodedata.normalize('NFKC')
と utsuho の相違点は、次の通りです。
- カタカナと濁点、半濁点、句読点、鍵括弧、中黒、長音記号は全角のまま変換されません。
- 結合文字の濁音記号と半濁音記号は直前の文字と結合され、合成済み文字の濁音と半濁音へ変換されます。
- 直前の文字との結合により、合成済み文字を形成できない場合は変換されません。
- 異体字セレクターは除去されずに残ります。
- 波線は全角のまま変換されません。全角チルダは半角へ変換されます。
unicodedata.normalize('NFKC')
は Unicode における正規化をおこなうため、全角カタカナを半角カタカナへ変換する機能はありません。同様に異体字セレクターの除去や厳密に同じとみなせない全角の波線の半角のチルダへの変換もおこないません。
結合文字を定義されている合成済み文字へ変換する処理は、Unicode における正規化に該当するため、実施されます。又、いわゆる ASCII コード範囲の全角のアルファベットと数字、記号も半角へ変換されます。