綾小路龍之介の素人思考

[辞書] 人名用の辞書を作る

人生色々。名前付けることも。適当な名前を生成する必要が出来たので人名用の辞書を作ることにした。

まずはターゲットとなる人名辞書をダウンロード。ただし、今回はテキストで提供されている辞書がターゲット。ダウンロードしたlzhを解凍しておく。

  1. 松茸用 人名テキスト 16,153語(データ / 文書作成)
  2. 人名辞書 - Google 検索

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
  1. 【 lha 】 ファイルを圧縮・展開する(拡張子.lzh):ITpro
  2. linux lzh - Google 検索

とりあえず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
アイ 藍
アイ 阿井
アイ 安居
アイイソ 相磯
アイウチ 相内
アイウラ 相浦
アイオ 相尾
アイカワ 愛川
アイカワ 合川
アイカワ 会川
  1. Perl one liner 集 perl 1行野郎
  2. perl 1行 - Google 検索

必要なレコードの抽出が終わったので読みをひらがなに変換する。日本語ひらがなカタカナの相互変換は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
あい 藍
あい 阿井
あい 安居
あいいそ 相磯
あいうち 相内
あいうら 相浦
あいお 相尾
あいかわ 愛川
あいかわ 合川
あいかわ 会川
  1. 全角かたかなを、ひらがなに変換する。 - iRSSの日記
  2. [を] Perlでカタカナひらがな変換
  3. Unicode::Japanese - Convert encoding of japanese text - search.cpan.org
  4. 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 出崎
  1. Lingua::JA::Hepburn::Passport でヘボン式ローマ字変換: blog.bulknews.net
  2. Lingua::JA::Hepburn::Passport - Hepburn Romanization using Japanese passport rules - search.cpan.org
  3. 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の辞書を使うほうがいいかも。

  1. SKK辞書 - FreeStyleWiki

やっぱりテストさん。きついねloop修

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2009-04-18T14:03:24+09:00
  2. Modified: 2009-04-18T14:03:24+09:00
  3. Modified: 2010-06-06T12:49:38+09:00
  4. Generated: 2017-11-20T23:09:19+09:00