ズッキーニの味噌煮込みBlog版

コンピュータのこと、食べ物のこと、なんでもないこと、とんでもないこと。

ATOKのユーザ辞書をAnthyに持ち込む

2009年05月07日 07時37分37秒 | コンピュータ
まぁ、そういう言い方をすれば、「パンツと靴下を取りに本宅に立ち寄った」というところか(おのれ、まだ言うか)。

Anthyでも親指シフト(NICOLA)がまともに使えるようになったので目出度いが、長年にわたりATOKと一緒に鍛えてきたユーザ辞書が使えなくなるのは痛い。必要の都度登録していけばいいようなものだが、なんとか一気に持ち込むことはできないものか。楽するためには努力を惜しまず。

できるんだね、これが。元ネタはここ。作業に取りかかる前に、Windows からubuntuにファイルを持ち込む手段を用意しておくといい。アタシの場合はubuntuにもDropboxを入れておいた。

これで確かにATOKのユーザ辞書をAnthyで参照できる辞書に変換できるのだが、ひとつだけ困ったことがある。変換後の辞書を見て分かったのだが、おなじ読みのデータは(たぶん最後の)ひとつしか残っていないのだ。スクリプトの最後の sort keys あたりがぁゃιぃと踏んだのだが、Perlは使ったことがない。踏み違い(笑)もあるだろうし、分かったところで直せる自信もない。

しかし情報を探っていくうちにヒントを見つけた。このスクリプトはどうもATOKのユーザ辞書をcanna形式の辞書に変換しているらしい。Anthyはcanna形式の辞書も読めるのだそうだ。もしかしたら、ATOKのユーザ辞書をcanna形式に変換する別のスクリプトもあるのではないか。源流に遡れば根本的な解決が見つかることがあるという経験則に基づき、さらに検索を続けると…あった

※ 参照元を見つけられなかった。スクリプトのみの紹介で作者さん、ごめんなさい。

こちらの方がPerl素人のアタシにもわかりやすく、見よう見まねのnkfで改行コードを変換してちょっと読んでみた。ここで問題をひとつ発見。

アタシはATOKの「独立語」を多用する。人名からメールアドレスへの変換のように、通常の文脈の中に出て来る読みでは変換してほしくない単語は、この品詞で登録している。「おかべ」から岡部さんのメールアドレスに変換したいが、「おかべさんと」の時にはメールアドレスは出てきてほしくない、というような使い方だ。

ところがこのatok2canna.plは、その品詞には未対応だ。しかし大丈夫。変換のロジックは読まなくとも、変換元と変換先はテーブルになっているので、その末尾に追加してやればいいことが分かる。リテラルはロジック中に記述するよりテーブルにまとめた方が、一般的にはわかりやすいコードになるという実例。

かくしてでっち上げたのが以下のスクリプト。手を加えたところは赤色にしてある。

========================================================
#!/usr/bin/perl

@atok = (
"名詞","固有人名","固有名詞","固有地名","固有組織",
"名詞サ変","ワ行五段","カ行五段","ガ行五段","サ行五段",
"タ行五段","ナ行五段","バ行五段","マ行五段","ラ行五段",
"一段動詞","形容詞","形容動詞","副詞","感動詞",
"接続詞","連体詞","独立語" );

@canna = (
"#T35","#JIN","#JN","#CK","#KK",
"#T30","#W5","#K5","#G5","#S5",
"#T5","#N5","#B5","#M5","#R5",
"#KS","#KY","#T05","#F04","#CJ",
"#CJ","#RT","#KJ" );

$item_num = @atok;

open ( BF , "<$ARGV[0]");
	@data = <BF>;
	$data_num = @data;
close (BF);

$j = 0;
while ( $j < $data_num ){
$buf = $data[$j]; $buf =~ s/\n//g; $buf =~ s/\r//g; $buf =~ s/\*$//g; $buf =~ s/\$$//g; if ( $buf !~ /^\!/ && $buf ne "" ){ @col = split ( /\t/ , $buf ); $i = 0; $flag = 0; while ( $i < $item_num ){
if ( $col[2] eq $atok[$i] ){ $col[2] = $canna[$i]; $flag = 1; } $i++; } if ( $flag == 1 ){ print "$col[0] $col[2]*500 $col[1]\n"; } } $j++; } ========================================================


テーブルへの品詞の追加のほかにもう一ヶ所、標準出力に書き出しているところに "*500" というリテラルを追加している。これは "atok2anthy.pl" がこうなっていたので、なにかのおまじないかもしれないと思って合わせたものだ。この方面に詳しい人、ぜひコメントください。

なお、atok2anthy.plのオリジナル記事の末尾にも書かれているが、生成された辞書をディレクトリに収めただけではうまくいかない場合があり、念のためにkasumiを起動して「保存」ボタンを押しておくことをお勧めする。アタシの場合は変換後の辞書には存在している単語が変換しても候補に出てこないことがあって、kasumiで「保存」ボタンを押すと候補に出てくるようになった。

最新の画像もっと見る

コメントを投稿