unoh.github.com

PHPとMecabでキーワード自動リンクを実装する

2008-01-07 16:54:38 +0900

こんにちは、山下です。
今年もどうぞよろしくお願い致します。

Webサービスを開発していると、特定のキーワードを自動でURLリンクにする処理が必要になることがあると思います。今回は、このキーワード自動リンク機能を形態素解析ツールMecabを使ってPHPで実装する方法を紹介したいと思います。

説明に入る前に少し補足しておくと、Trieの実装であるDouble-Array処理だけ利用したいのであれば、MecabからDouble-Array処理の部分を切り出したDartsというライブラリがあります。しかし、なぜMecabを使うかというと、PerlだとDartsのバインディングが公開されているのですが、現時点でPHP版はありません。また、最近のLinuxディストリビューションでは、Mecabのパッケージが最初から用意されているため、より簡単に利用できると思ったからです。

それでは、順を追って説明していきます。

1. mecabインストール



Fedora 8の場合だと、次のようにしてインストールできます。

# yum install mecab mecab-ipadic mecab-devel


2. 自動リンク用辞書の作成



辞書用のディレクトリを作って、単語辞書(url.csv), 連接表(matrix.def), 未知語の文字定義(char.def), 未知語用品詞定義(unk.def), 設定ファイル(dicrc)の5つのファイルを用意します。

# mkdir /usr/lib/mecab/dic/autolink
# cd /usr/lib/mecab/dic/autolink


まずキーワードとURLの対応を記述したファイル url.csv を作成します。文字コードに注意してください。ここでは、UTF-8で記述しました。

url.csv
Google,0,0,-5878,http://www.google.com/
Yahoo,0,0,-4472,http://www.yahoo.com/
ChaSen,0,0,-5878,http://chasen.org/
京都,0,0,-3200,http://www.city.kyoto.jp/





その他のファイルの中身は次のようにします。これらのファイルは末尾に改行があるとエラーになるので、入れないようにします。

matrix.def
1 1
0 0 0


char.def
DEFAULT 1 0 0
SPACE 0 1 0
0x0020 SPACE


unk.def
DEFAULT,0,0,0,*
SPACE,0,0,0,*


dicrc
cost-factor = 800
bos-feature = BOS/EOS
output-format-type=autolink

node-format-autolink = <a href="%H">%M</a>
unk-format-autolink = %M
eos-format-autolink = \n


辞書のコンパイルを行います。

# /usr/libexec/mecab/mecab-dict-index -f utf-8 -c utf-8
./pos-id.def is not found. minimum setting is used
reading ./unk.def ... 2
emitting double-array: 100% |#################################| 
./pos-id.def is not found. minimum setting is used
reading ./url.csv ... 4
emitting double-array: 100% |#################################| 
./matrix.def is not found. minimum setting is used.
reading ./matrix.def ... 1x1

done!


ここで、問題なく作成されているか確認します。次のようにリンクが張られば成功です。

$ mecab -d /usr/lib/mecab/dic/autolink
そうだ京都、行こう。
そうだ<a href="http://www.city.kyoto.jp/">京都</a>行こう。



次にこれをPHPから使ってみましょう。

3. php_mecabインストール



PHPからMecabを利用するための拡張モジュールは、rskyさんが作られているので、有り難く使わせて頂きます。

$ wget http://www.opendogs.org/pub/php_mecab-0.3.0.tgz
$ tar xzvf php_mecab-0.3.0.tgz
$ cd php_mecab-0.3.0
$ /usr/bin/phpize
$ ./configure --with-php-config=/usr/bin/php-config ¥
--with-mecab=/usr/bin/mecab-config
$ make
$ sudo make install


4. 動作確認



サンプルとして次のようなプログラムを書いて実行してみます。

<?php
dl('mecab.so');
$options = array('-d', '/usr/lib/mecab/dic/autolink');

$t = new MeCab_Tagger($options);
$str = '京都についてGoogleとYahooで検索した。';

print $t->parse($str);


実行結果
<a href="http://www.city.kyoto.jp/">京都</a>について
<a href="http://www.google.com/">Google</a>と
<a href="http://www.yahoo.com/">Yahoo</a>で検索した。





以上、高速なキーワード自動リンクを簡単に実装できることが分かっていただけたかと思います。エントリ執筆にあたり、下記のページを参考にさせて頂きました。この場を借りてお礼を申し上げます。




関連リンク: