日本語で全文検索をするために MySQL に Senna を組み込むメモ。少し前は個人ニュースサイトめぐり→日記書きに数時間を要していた私が次に目をつけたのがRSSめぐり→はてブ登録なのだがそれでも依然として数時間かかる。そんなあなた (私) に朗報です。私の代わりにブックマークしてくれるエージェントを作ればいいのです。そしてそのエージェントが今日よく使われていた単語やタグとか出してくれて、1次ソースAについてBさんとCさんとDさんがそれぞれの立場でこんなことを書いているとかいうのが俯瞰できて、さらにあとから検索とかができればいいのです。いまホッテントリを見なくてもいいのです。あとで検索できればいいのです。Googleが拾ってくる量は莫大過ぎるし個人で把握できる範囲にも限度がある。ユーザの皆さんが勝手に重み付けしてくれるならそれを使ったらいい。先週の週刊東洋経済を読んで悟った。いやなんか変だ。むにむに
まずは MeCab のインストール。配布元に詳しいドキュメントあり。Senna のインストール方法には、mecab を configure するときに --prefix=/usr をつけていないぽかったのでつけずにやったら起動できなかった。悔い改めてやり直した。
$ cd mecab-0.93
$ ./configure --enable-utf8-only --enable-mutex --prefix=/usr
$ make
$ make check
$ sudo make install
続けて辞書をインストールして実行してみる。
$ cd mecab-ipadic-2.7.0-20060707
$ ./configure --with-charset=utf8 --prefix=/usr
$ make
$ sudo make install
$ mecab
テストしてみましょう。
諏訪を新宿並みに有名にしたかった
諏訪 名詞,固有名詞,人名,姓,*,*,諏訪,スワ,スワ
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
新宿 名詞,固有名詞,地域,一般,*,*,新宿,シンジュク,シンジュク
並み 名詞,接尾,一般,*,*,*,並み,ナミ,ナミ
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
有名 名詞,形容動詞語幹,*,*,*,*,有名,ユウメイ,ユーメイ
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
たかっ 助動詞,*,*,*,特殊・タイ,連用タ接続,たい,タカッ,タカッ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
EOS
成功。続けて Senna を入れる。参考書は前出のSenna のインストール方法。
$ cd senna
$ ./configure --prefix=/usr
$ make
$ sudo make install
$ sudo mkdir /var/senna
$ sudo emacs /var/senna/senna.conf
で、senna.conf に、
DEFAULT_ENCODING utf8
続けて MySQL 。MySQLのconfigureオプションや、Sennaのインストールなどを参考にした。
$ cd mysql-5,0,24
$ patch -p1 < ../senna/bindings/mysql/mysql-5.0.24.senna.diff
$ patch -p1 < ../senna/bindings/mysql/mysql-5.0.24.senna.2ind.diff
$ libtoolize -c -f
$ aclocal-1.9
$ autoheader
$ automake-1.9 -c -a -i
$ autoconf
$ touch sql/sql_yacc.yy
$ CFLAGS="-O3 -mtune=pentium4" \
> CXX=gcc \
> CXXFLAGS="-O3 -mtune=pentium4 -felide-constructors -fno-exceptions -fno-rtti" \
> ./configure --prefix=/usr \
> --with-charset=utf8 \
> --with-extra-charsets=complex \
> --with-senna \
> --with-big-tables \
> --with-readline \
> --enable-thread-safe-client \
> --enable-local-infile \
> --enable-assembler \
> --with-client-idflags=-all-static \
> --with-mysql-idflags=-all-static \
> --with-mysql-user=mysql \
> --localstatedir=/var/lib/mysql \
> --with-unix-socket-path=/var/lib/mysql/mysql.sock
$ make
$ sudo make install
$ sudo ./scripts/mysql_install_db
エラーが出たので
$ su -
# ./scripts/mysql_install_db
# chown -R mysql.mysql /var/lib/mysql
# chmod 755 /var/lib/mysql
# cp support-files/my-medium.cnf /etc/my.cnf
# cp /usr/local/src/mysql-5.0.24/support-files/mysql.server /etc/rc.d/init.d/mysqld
# chmod 755 /etc/rc.d/init.d/mysqld
# chkconfig --add mysqld
# chkconfig --level 345 mysqld on
# service mysqld start
そして
$ mysqladmin -u root password oniichandoite,soitsukorosenai
$ mysql -uroot -p
mysql> create database sennatest;
mysql> grant all on sennatest.* to gonbei@localhost identified by '[tamurayukari]ttedarenanoyo,sakurananoyo,a.ta.shi!';
$ quit;
$ mysql -ugonbei -p
mysql> use sennatest;
mysql> create table articles(
-> id int unsigned not null auto_increment primary key,
-> body text,
-> fulltext(body)
-> );
Query OK, 0 rows affected (0.06 sec)
mysql> insert into articles values
-> (null,"郵貯民営化は重要な問題だと思う "),
-> (null,"スローライフを志向するiPodの強み - CNET Japan"),
-> (null,"HTML, CSS, Photoshopを同時に学べるサンプル付きデザイン記事:Goodpic"),
-> (null,"jazzanovaの日記 - 現在顧問弁護士に相談中であり、対応についても検討中"),
-> (null,"mixi非公式ニュースサイト - mixiの問題人物Kusakabe氏、強制退会に?"),
-> (null,"むだづかいにっき♂:ネット上で議論を仕掛ける事について"),
-> (null,"はてな perl ハッカーの方々にお聞きします。近頃ますます良い感じなperlですが、どのような開発環境で開発していますでしょうか。"),
-> (null,"シナトラ千代子 - 投げ銭が飛び交うなかでダイアリーに立てこもる、という意味。"),
-> (null,"Going My Way: Skypeの会話をPodcast用に録音する場合の設定方法"),
-> (null,"Kusakabeさんがmixiの一部?を賑わしている。彼にmixi強制退会が言い渡されたのだ。"),
-> (null,"Ringo's Weblog: googleと競合しない方法2 "),
-> (null,"Moleskin Diary - 投げ銭よりたれ銭"),
-> (null,"第38回 海外メディアが伝えた小泉・郵政解散劇の評判 - nikkeibp.jp - 立花隆の「メディア ソシオ-ポリティクス」"),
-> (null,"ほその日記 - フォームが変更された事を知る"),
-> (null,"総選挙はてなと公職選挙法:北海道に住む国家公務員日記 "),
-> (null,"はてな、政党を株式に見立てて総選挙結果を予測 - CNET Japan");
Query OK, 16 rows affected (1.48 sec)
Records: 16 Duplicates: 0 Warnings: 0
mysql> select * from articles where match (body) against ('はてな');
+----+----------------------------------------------------------------------------------------------------------------------------+
| id | body |
+----+----------------------------------------------------------------------------------------------------------------------------+
| 7 | はてな perl ハッカーの方々にお聞きします。近頃ますます良い感じなperlですが、どのような開発環境で開発していますでしょうか。 |
| 15 | 総選挙はてなと公職選挙法:北海道に住む国家公務員日記 |
| 16 | はてな、政党を株式に見立てて総選挙結果を予測 - CNET Japan |
+----+----------------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)
すばらしい。じゃあ次は PHP からアクセスしてみよう。PHP は apt-getで入れた。
Warning: mysql_connect(): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13) in /var/www/html/test.php on line 4
うまくいかない。ちゃんと/var/lib/mysql には mysql.sock があるんだけどなー。
mysql_connect("localhost",$user,$pass); を mysql_connect("localhost.localdomain",$user,$pass); に変えたらうまくいった。しかし where match() against() を含んでいる SQL 文を投げると mysql_fetch_object()が false を返す。普通に select * from articles; とすると日本語の部分が全部 "?" になる。MySQL も Apache も UTF-8 を使う設定になっているはずなのになぜだー。
ぐぐったらはてなQに似たような悩みの人がいた。これを参考に、my.cnf の client セクションに default-character-set=utf8 を、 mysqld セクションに init-connect=SET NAMES utf8 を追加。mysqld を restart。直った。素敵。今回は以上。
この記事のメモはTritonnが始まる前に書かれた古いものです。Tritonnを使った場合のインストール方法についてはSennaとかのアレの続き Tritonn編をどうぞ。