English Japanese Kawa.netxp [Perl] Lingua::*::Romanize::* 日中韓/ローマ字変換モジュール

Lingua::*::Romanize::* は、日本語・中国語・韓国語の UTF-8 文字列の各国語の読みを ローマ字化するPerlモジュール群です。

Lingua::JA::Romanize::Japanese は、 日本語(漢字かな混じり文) をローマ字化します。→詳細
Japanese 付属の Juman・MeCab モジュールで、形態素解析を利用した読み下しにも対応します。

Lingua::ZH::Romanize::Pinyin は、 中国語(標準語読み) をローマ字(ピンイン)化します。→詳細
Pinyin 付属の Cantonese モジュールで、香港などの広東語読みをサポートします。

Lingua::KO::Romanize::Hangul は、 韓国語(ハングル文字) をローマ字化します。→詳細

ダウンロード

ダウンロードは、CPAN またはこちら↓からどうぞ。

日本語用: Lingua-JA-Romanize-Japanese-0.23.tar.gz TARGZ CPAN SVN
中国語用: Lingua-ZH-Romanize-Pinyin-0.23.tar.gz TARGZ CPAN SVN
韓国語用: Lingua-KO-Romanize-Hangul-0.20.tar.gz TARGZ CPAN SVN

Perl 5.005/5.6.x/5.8.x で利用できます。
バージョン 0.20 以降は、utf8 フラグに対応しています。 (Perl 5.8.1以降)
開発中のソースコードは、 Google Code 上に置いています。

インストール手順

CPAN からインストールできます。
ソースからインストールする場合も、通常通りです。

perl Makefile.PL && make && make test
sudo make install

日本語版のインストール中、Makefile.PL 時に 拡張辞書ファイル をダウンロードするか否かが聞かれます。
ダウンロードしない場合は、添付の SKK-JISYO.S 辞書を利用します。
デフォルトは [y](HTTP経由で辞書ファイルをダウンロードする)です。

中国語版・韓国語版のインストール時は、特に確認メッセージはありません。

依存モジュール

日本語用は、 DB_File モジュールが必須です。
Perl 5.005/5.6.x の場合は、追加で Jcode モジュールも必要です。(Perl 5.8.xでは不要)
拡張辞書ファイルをダウンロードする場合は、 LWP::UserAgent モジュールも必要です。
オプション機能の JUMAN・MeCab の形態素解析を利用する場合は、 こちら を参照して下さい。

中国語用は、 Storable モジュールが必須です。
Perl 5.005/5.6.x の場合は、追加で Unicode::Map モジュールと Unicode::String モジュールも必要です。(Perl 5.8.xでは不要)

韓国語用は、特に必須の依存モジュールはありません。

オンライン・デモ

オンライン・デモ は別ページに移動しました。

簡単な使い方・メソッド説明

各クラスはそれぞれ new() コンストラクタに加えて、 以下の3つのメソッドを提供しています。
サンプルは日本語の場合ですが、どのクラスも使い方は同じです。

    use Lingua::JA::Romanize::Japanese;

    my $conv = Lingua::JA::Romanize::Japanese->new();

    my $kanji = "字";
    my $roman = $conv->char( $kanji );
    printf( "<ruby><rb>%s</rb><rt>%s</rt></ruby>", $kanji, $roman );

char() メソッドは、漢字等の1文字をローマ字に変換します。
戻り値はローマ字(半角英字)です。
ローマ字に変換できない場合は、undefが返ります。
漢字などでローマ字に複数の候補がある場合は、/ 区切りで並んで返ります。

    my $string = "文字列の場合";
    print $conv->chars( $string ), "\n";

chars() メソッドは、漢字等を含む文字列をローマ字に変換します。
漢字(または単語)が複数ある場合は、半角スペースで区切られて格納されます。

    my @array = $conv->string( $string );
    foreach my $pair ( @array ) {
        my( $raw, $ruby ) = @$pair;
        if ( defined $ruby ) {
            printf( "<ruby><rb>%s</rb><rt>%s</rt></ruby>", $raw, $ruby );
        } else {
            print $raw;
        }
    }

string() メソッドは、漢字等を含む文字列をローマ字に変換します。
戻り値は2次元配列になっています。
元の漢字とローマ字のペア(配列リファレンス)が並ぶ配列になっています。

    $array[0]           # 最初の文字のペア(配列リファレンス)
    $array[1][0]        # 2文字目の元の漢字
    $array[1][1]        # 2文字目のローマ字(半角英字)

日本語については文字単位で読みを切れないことが多いため、 単語単位でペアを組む場合があります。
中国語・韓国語については、必ず文字単位で区切られます。

@array = Lingua::JA::Romanize::MeCab->new()->string('動物園でパンダを見た。');

例えば、↑の実行結果として以下のような配列が返ります。

@array = (
    [ '動物',   'doubutsu' ],
    [ '園',     'en'       ],
    [ 'で',     'de'       ],
    [ 'パンダ', 'panda'    ],
    [ 'を',     'wo'       ],
    [ '見',     'mi'       ],
    [ 'た',     'ta'       ],
    [ '。'                 ],
);

Lingua::JA::Romanize 日本語処理の補足

日本語版の Lingua::JA::Romanize::Japanese モジュールでは SKKの辞書 を利用した読み下し処理を行います。
具体的には SKK-JISYO.L、SKK-JISYO.jinmei、SKK-JISYO.geo、 SKK-JISYO.station、SKK-JISYO.propernoun の各辞書を使用しています。

辞書データファイルは、モジュールインストール時(Makefile.PL)に 内部処理用の DB_File (Berkeley DB) 形式に変換しています。
2006年4月現在のSKK L辞書からは、453,936キーワード(単語)が登録されます。
DB_File でなく NDBM_File であればほぼ全ての Perl 実行環境で利用できますが、 NDBM_File では exists 関数が使えないため、使用できませんでした。
また、SDBM_File は全ての Perl 実行環境で利用できるものの、 ファイルサイズがDB_Fileの倍近くと大きくなり、動作も遅いため、使用できませんでした。

Makefile.PLを利用しない場合は、 アーカイブを展開したディレクトリで 手動で以下のコマンドを実行してください。
lib ディレクトリ内に辞書ファイルが生成されるので、 この lib ディレクトリごとコピーすれば make install せずに本モジュールを利用できます。

perl -Ilib -MLingua::JA::Romanize::DictJA -e 'Lingua::JA::Romanize::DictJA->update();'

ひらがな・カタカナ→ローマ字の変換処理は、 Lingua::JA::Romanize::Kana モジュールが担当します。
変換ルールは、 ヘボン式 を基本にしています。(パスポートの表記に近い)
ただし、長音(訓令式の^記号)は処理しません。

また、オプション機能として JUMAN (の Perl バインディング Juman.pm)がインストールされた環境では、 Lingua::JA::Romanize::Juman モジュールにより JUMAN の形態素解析を利用した読み下し処理が利用可能です。 (Juman.pm のインストール手順については コチラ
JUMAN サーバ機能を利用せずにコマンド版の juman を利用する場合は 予め juman コマンドに PATH を通しておく必要があります。 (/usr/bin/juman 等に入っていればOK)

同様に、 MeCab (の Perl バインディング MeCab.pm)がインストールされた環境では、 Lingua::JA::Romanize::MeCab モジュールにより MeCab の形態素解析を利用した読み下し処理が利用可能です。 (MeCab.pm のインストール手順については コチラ

※かな→ローマ字変換処理は、完全なヘボン式ではありません。
Miyagawa さんの Lingua::JA::Hepburn::Passport の方が正確なようです。
Dan さんの Lingua::JA::Kana というモジュールもあります。
(どちらも、かな→ローマ字のみ対応です。漢字には対応していません)

Lingua::ZH::Romanize 中国語処理の補足

中国語版の Lingua::ZH::Romanize::Pinyin モジュールでは cxterm 付属の辞書ファイル PY.tit(GB2312&BIG5版)を利用して、 ローマ字(ピンイン)変換を行います。

広東語版の Lingua::ZH::Romanize::Cantonese モジュールでは 同じく cxterm 付属の辞書ファイル CTLau.tit(GB2312版)と CTLauBig5.tit(BIG5版)を利用して、 ローマ字変換を行います。

どちらも、モジュールインストール時(Makefile.PL)に 内部処理用の Storable 形式に変換しています。
Makefile.PLを利用しない場合は、 アーカイブを展開したディレクトリで 手動で以下のコマンドを実行してください。

perl -Ilib -MLingua::ZH::Romanize::DictZH -e 'Lingua::ZH::Romanize::DictZH->update();'

lib ディレクトリ内に辞書ファイルが生成されるので、 この lib ディレクトリごとコピーすれば make install せずに本モジュールを利用できます。

Lingua::KO::Romanize 韓国語処理の補足

韓国語版の Lingua::KO::Romanize::Hangul モジュールでは Unicode の文字コード番号からハングルの初声・中声・終声のコードを計算して、 ローマ字を決定します。

初声
(0~18)
gkkndttrmbppsss-jjjchktph
中声
(0~20)
aaeyayaeeoeyeoyeowawaeoeyouwowewiyueuuii
終声
(0~27)
-gkkksnnjnhdrlglmlblsltlplhmbpssssngjcktph

ハングルでは、初声・中声・終声の3パーツの組み合わせで文字が構成されています。
(終声を付けない場合は、2パーツのみ)
Unicode のハングル文字コードは、AC00~D7A3 に規則的に並んでいます。

文字コード = AC00+(初声×21×28)+(中声×28)+(終声)

この計算式でUnicodeの文字コードを取得できます。
L::K::R::Hangul モジュールではこの逆方向の計算を行っています。
韓国語版では外部辞書ファイルは使用していません。

※上記の変換テーブルの赤字の箇所は、バージョン 0.20 で 文化観光部2000年式 に対応するのに伴い、従来と変更になった箇所です。
この変換テーブル変更以外にも、前後の子音を確認して読み替え処理を追加しています。

更新履歴

コメントはこちらへ by AjaxCom

その他のページへのリンク

このページへのトラックバック by AjaxTB

トラックバックURL:http://www.kawa.net/service/tb/ajaxtb.cgi/works/perl/romanize/romanize.html

Kawa.netxp © Copyright 2006-2008 Yusuke Kawasaki