2000年01月15日更新

ボット辞書最適化スクリプト

更新情報

99/12/31 約1.7倍に高速化
99/12/21 解説文でかなり変だった部分を修正。
スクリプトがかなりボロボロだった(っていうかちゃんと動いていなかった)のを修正

長文優先とは?

 ゆいチャット系のボットでは、辞書の検索の際により長いキーワードを選び出すようにはできていません。例えば、「寒い:#寒いのは嫌いです。」と「寒いから.*しよう:#それはいい考えですね。」という二つの登録がある場合、「寒いから今日はお鍋にしよう。」という発言に対しては後者の登録語のみがヒットすることが期待されますが、実際には両方の登録語がヒットしてしまいます。後者の登録語のみをヒットさせるようにするためにはいくつかの方法が考えられますが、最も手軽な方法としては、先ほどの二つの登録語をそれぞれ別の辞書に登録し、「寒いから.*しよう:#それはいい考えですね。」の登録がある辞書を検索してヒットがなかった場合のみ「寒い:#寒いのは嫌いです。」の登録がある辞書を検索することが考えられます。しかしながら、1000を越える登録語からなる辞書の内容をひとつひとつ比較し、二つの辞書に振り分けるのを手作業で行うことは不可能に近いことです。そこで、この作業を実行するPerlスクリプトを作成しました。

正規表現型キーワードについて

 例えば、「分からない」「わからない」「分かりません」「わかりません」という4つの文をPerlの正規表現で表すと、「(分|わ)か(らない|りません)」となります。この正規表現をキーワードに用いれば、ひとつの登録語で4つの文をカバーできることになります。実際には文字コードがS-JISの場合の2バイト文字には2バイト目に「|」を持つものがあり、このような文字を含むキーワードでは予想しない位置に「|」が入ってしまうので意図した通りのキーワードとして働きません。そこでチャットのプログラムではキーワード中の「|」をバックスラッシュでエスケープしてこれを回避しています(ゆいチャットの場合は「$key=~s/\|/./g;」がこれに当たります)。そこで、正規表現で特別な意味を持たず、かつ滅多に使われないような文字(うちの周辺では&&)を「|」の代わりに用いて、「|」をキャンセルした後で「&&」を「|」に置換すれば上記のような正規表現形式のキーワードを使用することができます。実際の改造としては、「$key =~ s/&&/|/g;」を「|」をキャンセルした次の行に追加するだけでこの機能が使えるようになります。余談ですがワイルドカード「.*」も実は正規表現なので、通常の形のキーワードも正規表現型と言えば正規表現型ではありますな。

 今回のスクリプトは正規表現型のキーワードに対応していますが、この型のキーワードではキーワード同士を単純に比較することができないのでプログラムがかなり複雑になってしまいました。

スクリプトのダウンロードと使い方

ボット辞書最適化スクリプト

正規表現型→通常型辞書変換スクリプト

 エラー処理を施していないので、キーワードの正規表現のミスによっては無限ループに入り込む場合があります。そこでまず、正規表現型→通常型辞書変換スクリプトで辞書をテストします。このスクリプトは正規表現型キーワードを通常型キーワードに変換した辞書を作成します。スクリプトと同じディレクトリにmain.dicというファイル名で辞書を置き、スクリプトを走らせます。何事もなく処理が終了すればout.dicというファイルが作成されます。無限ループに入り込んだ場合、その直前までの登録語を変換したものがout.dicに書き込まれ、メモリを食いつぶしてスクリプトが止まるはずです(笑)ので辞書を修正して再挑戦してください。

 チェックの終了した辞書を同じくmain.dicという名前でボット辞書最適化スクリプトと同じディレクトリに置いてスクリプトを走らせます。このとき、先ほどのチェックをすり抜けた正規表現のミスがあるとエラーが出ますので、その都度辞書を修正してやり直してください(笑)。長文用辞書がout1.dic、短文用辞書がout2.dicというファイル名で出力されます。out1.dicをメイン辞書、out2.dicをサブ辞書としてボット辞書としてお使いください。辞書の登録数が充実している場合、out2.dicをさらに処理する必要がある場合もあります。

研究開発室に戻る
トップページに戻る