まずはターゲットとなる人名辞書をダウンロード。ただし、今回はテキストで提供されている辞書がターゲット。ダウンロードしたlzhを解凍しておく。
lzhのアーカイバが無かったので探してから導入。
$ su - Password: # aptitude search lha p jlha-utils - command-line lzh archiver written in Java p lha - lzh archiver p libjlha-java - LHA compress/decompress library for Java p libjlha-java-doc-ja - Japanese documentation for libjlha-java, the # aptitude -R install lha Reading package lists... Done Building dependency tree Reading state information... Done Reading extended state information Initializing package states... Done Reading task descriptions... Done The following NEW packages will be installed: lha 0 packages upgraded, 1 newly installed, 0 to remove and 0 not upgraded. Need to get 59.5kB of archives. After unpacking 176kB will be used. Writing extended state information... Done Get:1 http://ftp.jp.debian.org lenny/non-free lha 1.14i-10.3 [59.5kB] Fetched 59.5kB in 0s (147kB/s) Selecting previously deselected package lha. (Reading database ... 34800 files and directories currently installed.) Unpacking lha (from .../lha_1.14i-10.3_i386.deb) ... Processing triggers for man-db ... Setting up lha (1.14i-10.3) ... Reading package lists... Done Building dependency tree Reading state information... Done Reading extended state information Initializing package states... Done Writing extended state information... Done Reading task descriptions... Done # exit
で展開。内容チェックするとディレクトリ無いのでディレクトリ作ってその中にlzhファイルを移動。オプションの付け方はtar.gzと同じ感じ。
$ mkdir name_mtk $ cd name_mtk $ mv ../name_mtk.lzh . $ ls name_mtk.lzh $ lha xf name_mtk.lzh name-mtk.txt - Melted : oooooooooooooooooooooooooooooooooooooooo name-mtk.doc - Melted : o $ ls name-mtk.doc name_mtk.lzh name-mtk.txt
とりあえずnkfでエンコーディングをチェック。Shift_JISなのでutf8に変換。内容の確認。カンマ区切りで、1カラム目に読み仮名、2カラム目にダブルクォートで囲んで漢字、3カラム目に人名*。1カラム目と2カラム目だけ抽出し、2カラム目については””をはし、タブ区切りにする。で、抽出されていることを確認。
$ nkf --guess * name-mtk.doc:Shift_JIS name_mtk.lzh:BINARY name-mtk.txt:Shift_JIS $ nkf --utf8 name-mtk.txt > name-mtk.txt.utf8 $ head name-mtk.txt.utf8 アイ,"藍",人名* アイ,"阿井",人名* アイ,"安居",人名* アイイソ,"相磯",人名* アイウチ,"相内",人名* アイウラ,"相浦",人名* アイオ,"相尾",人名* アイカワ,"愛川",人名* アイカワ,"合川",人名* アイカワ,"会川",人名* $ perl -F, -lane 'print "$F[0] $1" if$F[1]=~m/"(.*)"/;' name-mtk.txt.utf8 > name-mtk.txt.utf8.extract $ head name-mtk.txt.utf8.extract アイ 藍 アイ 阿井 アイ 安居 アイイソ 相磯 アイウチ 相内 アイウラ 相浦 アイオ 相尾 アイカワ 愛川 アイカワ 合川 アイカワ 会川
必要なレコードの抽出が終わったので読みをひらがなに変換する。日本語ひらがなカタカナの相互変換はUnicode::Japaneseで。
$ perl -MUnicode::Japanese -lane '$F[0]=Unicode::Japanese->new($F[0])->kata2hira->get; print "@F"' name-mtk.txt.utf8.extract > name-mtk.txt.utf8.extract.kana2hira $ head name-mtk.txt.utf8.extract.kana2hira あい 藍 あい 阿井 あい 安居 あいいそ 相磯 あいうち 相内 あいうら 相浦 あいお 相尾 あいかわ 愛川 あいかわ 合川 あいかわ 会川
- 全角かたかなを、ひらがなに変換する。 - iRSSの日記
- [を] Perlでカタカナひらがな変換
- Unicode::Japanese - Convert encoding of japanese text - search.cpan.org
- perl ひらがな かたかな|カタカナ - Google 検索
次は、ひらがなにしたよみをローマ字にしたいわけだが、Tatsuhiko MiyagawaのLingua::JA::Hepburn::Passportを使う。ソース見る限りではpure perlの様子。まぁ宮川印だし、信頼します。ということでインストール。
# su - Password: # cpan -i Lingua::JA::Hepburn::Passport # exit
で、変換。上手く出来ている様子だが、9068行目でなんだかおかしい。この行をチェック。おそらくnkfで長音がハイフンに変換された様子。この行だけを削除。
$ perl -MLingua::JA::Hepburn::Passport -MEncode -lane 'BEGIN{$h= Lingua::JA::Hepburn::Passport->new;} $F[0]=$h->romanize(decode_utf8($F[0])); print "@F"' name-mtk.txt.utf8.extract.kana2hira > name-mtk.txt.utf8.extract.kana2hira.romanize Wide character in print at -e line 1, <> line 9068. $ head name-mtk.txt.utf8.extract.kana2hira.romanize AI 藍 AI 阿井 AI 安居 AISO 相磯 AIUCHI 相内 AIURA 相浦 AIO 相尾 AIKAWA 愛川 AIKAWA 合川 AIKAWA 会川 $ -n 9068 head name-mtk.txt.utf8.extract.kana2hira.romanize | tail -1 DEIゅKU å¼è² $ head -n 9068 name-mtk.txt.utf8.extract.kana2hira | tail -1 でぃゅーく 弟育 $ head -n 9068 name-mtk.txt.utf8.extract | tail -1 ディューク 弟育 $ head -n 9068 name-mtk.txt.utf8 | tail -1 ディューク,"弟育",人名* $ sed -e '9068d' name-mtk.txt.utf8.extract.kana2hira.romanize > name-mtk.txt.utf8.extract.kana2hira.romanize.9068d $ head -n9070 name-mtk.txt.utf8.extract.kana2hira.romanize| tail -10 TENJI 天智 TENZO 典三 TEMBI 展眉 TEMMU 天武 TEMMEI 天明 TENRAI 天来 TENRYU 天竜 DEIゅKU å¼è² DEI 出井 DEUSHI 出牛 $ head -n9070 name-mtk.txt.utf8.extract.kana2hira.romanize.9068d| tail -10 TENJI 天智 TENZO 典三 TEMBI 展眉 TEMMU 天武 TEMMEI 天明 TENRAI 天来 TENRYU 天竜 DEI 出井 DEUSHI 出牛 DESAKI 出崎
- Lingua::JA::Hepburn::Passport でヘボン式ローマ字変換: blog.bulknews.net
- Lingua::JA::Hepburn::Passport - Hepburn Romanization using Japanese passport rules - search.cpan.org
- perl ヘボン ひらがな|かたかな|カタカナ - Google 検索
最後に大文字より小文字のほうがうれしいので変換。
$ perl -lpe 'tr/[A-Z]/[a-z]/' name-mtk.txt.utf8.extract.kana2hira.romanize.9068d > name-mtk.txt.utf8.extract.kana2hira.romanize.9068d.tr $ head name-mtk.txt.utf8.extract.kana2hira.romanize.9068d.tr ai 藍 ai 阿井 ai 安居 aiso 相磯 aiuchi 相内 aiura 相浦 aio 相尾 aikawa 愛川 aikawa 合川 aikawa 会川
これで完成。16152個の名前or苗字のリストが出来た。
反省点
これで苗字と名前の区別がつけばいいんだけど。今回は最初の辞書選択をミスった感じ。姓名の区別のある辞書を選択するべきだった。しかし本当の問題は、このようなシステム辞書強化用の辞書では特殊な姓名がリストアップされているが、一般的な姓名が登録されていない。この点も問題。skkの辞書を使うほうがいいかも。
やっぱりテストさん。きついねloop修