论坛: POPFile 全般 (Thread #9353)

Kakasi の分かち書きで使う辞書に単語を追加するには (2005-11-17 00:44 by amatubu #17891)

2ch の POPFile スレッドで、Kakasi で使う辞書に単語を追加するという
話が出ていて、おもしろそうだと思ったので簡単にできる方法を考えて
みました。
Mac OS X 上でのみの動作確認なのですべての環境で動くかどうかは
わかりませんが、以下にその方法を書いてみます。

・辞書ファイルの作成

テキストファイルで辞書を作成します。文字コードは EUC あるいは JIS で、
改行コードは LF にしておきます。
1 行に 1 単語で、「ふりがな(タブ)漢字」という形式で記載します。
このファイルを、POPFile のプログラムが入ったフォルダ
(popfile.pl があるフォルダ)に置いておきます。

・POPFile ソースコードの書き換え

POPFile を終了させて、POPFile フォルダの Classifier/MailParse.pm を
適当なテキストエディタで開き、ファイルの終わりの方にある

Text::Kakasi::getopt_argv("kakasi", "-w", "-ieuc", "-oeuc");

という行を探します(バージョン 0.22.3 の場合)。
そして、この行を

Text::Kakasi::getopt_argv("kakasi", "-w", "-ieuc", "-oeuc", "./dict.txt");

というように変更します(dict.txt というファイル名の場合)。

これで POPFile を再起動すると、作成した辞書が読み込まれ、
分かち書きに反映されるようになります。

ファイル名固定で、追加の辞書ファイルがあれば読み込むような
形でパッチを作成すれば単語の追加が比較的簡単にできるように
なるかもしれないですね。
次の日本語パッチ作成の際にでも考えてみようと思います。

動作報告などいただけるとうれしいです。

RE: Kakasi の分かち書きで使う辞書に単語を追加するには (2005-11-17 14:11 by saiki #17903)

面白そうですね。
できれば辞書の場所は POPFile のユーザーパス内にあると嬉しい
のですが、ソースをざっと見た限りでは、ライブラリが popfile
loadable moudle じゃないとユーザーパスを取得できないみたいで
すね。

MailParse.pm は popfile loadable module ではないので、ユーザ
ーパスを取得するのは難しいでしょうか…。
回复到 #17891

RE: Kakasi の分かち書きで使う辞書に単語を追加するには (2005-11-17 19:14 by amatubu #17908)

ご意見ありがとうございます。
確かにそうですね。stopwords もユーザディレクトリに
ありますし、そのほうがよさそうですね。

現在のバージョンに限定して言えば、Bayes.pm の初期化部分
(initialize 関数あたり)でパスを取得しておけば
よさそうな気がします。

あまり検証していませんが、Bayes.pm の initialize
関数の最後に

$self->{parser__}->{kakasi_extra_dictionary_} = $self->get_user_path_( "dict.txt" ) if ( -e $self->get_user_path_( "dict.txt" ) );

というような行を追加して、MailParse.pm の方では
$self->{kakasi_extra_dictionary_} を参照するように
すればよさそうです。

ただし、0.22.3 の MailParse.pm にある init_kakasi
関数では、$self の参照ができませんので、呼び出し
部分を「$self->init_kakasi」に変更するとともに、
init_kakasi の最初に「my ( $self ) = @_;」を追加
する必要があります。

もう少し検証したらパッチを作ってみようと思います。
回复到 #17903

RE: Kakasi の分かち書きで使う辞書に単語を追加するには (2005-11-17 21:18 by saiki #17910)

なるほど。
Bayes.pm で $self->{'__parser'} のリファレンスに直接値を設定
するわけですね。

あともう一点気づいたことですが、Kakasi は日本語環境でしか使
わないので、dict.txt のような普遍的なファイル名ではなくて、
kakasidict.txt とか、jpdict.txt のようなファイル名にした方が
良いと思います。
回复到 #17908

RE: Kakasi の分かち書きで使う辞書に単語を追加するには (2005-11-18 02:08 by amatubu #17915)

>Bayes.pm で $self->{'__parser'} のリファレンスに直接値を設定

そのとおりです。
「本当の」マルチユーザに対応した際には、ユーザごとの設定を
参照する必要がありますのでそう簡単にはいかなくなるでしょうが、
今はこの方法が使えます。

>dict.txt のような普遍的なファイル名ではなく

おっしゃるとおりですね。他の名前にしようと思います。

しかし、少し試してみましたら、Windows 環境ではなぜかうまく
動かないことが判明しました。コマンドラインで直接 kakasi を
動かしたときには辞書の内容が反映されるので、Text::Kakasi
の Windows 版に問題があるのかなと思っているのですが……。
(ファイルが存在しない場合はエラーが発生するので、
 ファイル名自体は正しく渡っているようで、それも不思議です)

Windows 環境だけの問題かもしれませんが、もう少し検証が
必要なようです。
回复到 #17910

RE: Kakasi の分かち書きで使う辞書に単語を追加するには (2005-12-06 02:53 by amatubu #18314)

うまく動かないのではなく、分かち書きへの辞書の反映のされ方が
ちょっと違うようです。
既に登録されている単語からなる複合語を新たに登録した場合、
Mac OS X ではその新しい複合語が分かち書きに使用されるのに対し、
Windows では反映されず、元の単語で分かち書きが行われます。
例えば、「受信」「拒否」という単語が辞書に登録されていて、
そこに「受信拒否」という単語を入力した追加辞書ファイルを
作成しても、Windows では「受信」「拒否」という 2 つの単語に
分かち書きされてしまいます。

この原因はわかっていないのですが、とりあえずパッチを作成して
みました。
が、なぜかパッチセクションにファイルを投稿しようとすると
「Invalid filename」というエラーが出てしまって登録できない
ため、
http://amatubu.skr.jp/popfile/ex_kakasi/Bayes.pm
http://amatubu.skr.jp/popfile/ex_kakasi/MailParse.pm
にファイルを置きました。

パッチの使用方法については
https://sourceforge.jp/tracker/index.php?func=detail&aid=7679&group_id=759&atid=2945
を参照してください。

また、辞書ファイルのサンプルは
http://amatubu.skr.jp/popfile/ex_kakasi/ex_kakasi.dict
にあります。

動作報告などいただけたら幸いです。
回复到 #17915