全文検索エンジンGroongaで中国語のトークナイザーを使う方法

昨年11/29に[全文検索エンジンGroongaを囲む夕べ4](http://atnd.org/events/43461)を開催しました。[発表資料](http://atnd.org/events/43461#document)へのリンクもまとめています。[隔週連載Groonga](http://gihyo.jp/dev/clip/01/groonga)も参考になりますよ。
イベントレポートも昨年末に[「全文検索エンジンGroongaを囲む夕べ 4」レポート](http://gihyo.jp/news/report/2013/12/2701)として公開されましたね。

# はじめに

オープンソースの[カラムストア機能付き全文検索エンジンGroonga](http://groonga.org/ja/)を公開しています。この記事を書いているときの最新のバージョンは2013年12月29日にリリースした[3.1.1](http://groonga.org/ja/docs/news.html#release-3-1-1)です。

今回は、全文検索エンジンGroongaで中国語のトークナイザーを使う方法を紹介します。

# Groongaでの中国語サポート状況

全文検索エンジンであるGroongaでは、エンコーディングとしてはUTF-8をサポートしているので全文検索できなくはないのですが、そこには検索の精度の問題があります。
単純にバイグラムでトークナイズするのであれば漏れはなくなりますが、文脈を考慮していないため意図しないものも検索結果としてヒットしてしまうことがありえます。
そのため、MeCabのように形態素解析結果をもとにトークナイズしないと検索結果にノイズが混じってしまうことがあり嬉しくありません。
とはいえ、これまでGroongaの中国語向けのトークナイザーはありませんでした。Groongaを広く世界中で使ってもらうためには、特定の言語ではあまりうまく検索できないというのは困りものです。

# 中国語サポートを充実させるには

Groongaで中国語サポートを充実させるには2つ方法があります。ひとつはMeCabの辞書を拡張することです。MeCabは言語に依存しない設計となっているので、辞書さえ用意してあげれば適切にトークナイズすることができます。ただし、誰でもすぐに使える辞書というのはまだなさそうです。もうひとつはMeCabのトークナイザー同様にして中国語向けのトークナイザーを用意することです。

# groonga-tokenizer-friso

試しに既存の形態素解析できるものを利用して中国語向けにトークナイザーを用意してみました。それが[groonga-tokenizer-friso](https://github.com/kenhys/groonga-tokenizer-friso)です。
これは、形態素解析のライブラリとしてFrisoを使用しています。

* [Friso](http://code.google.com/p/friso/)

## Frisoのインストール

Frisoは各種ディストリビューション向けにパッケージが提供されているわけではないので、ソースからコンパイルする必要があります。

Frisoのインストールは次のようにして行います。
まずはFrisoのダウンロードページからfriso-1.6.0-src-lib-dict.zipを入手します。これにはライブラリのソースに加えて辞書も同梱されています。

```sh
unzip friso-1.6.0-src-lib-dict.zip
cd friso-1.6.0/src
make
sudo make install
```

これで、/usr以下にFrisoのライブラリやヘッダファイルがインストールできます。
あとは設定ファイルと辞書を任意の場所にコピーしておきます。例えば、設定ファイルを/etc/friso以下に、辞書を/usr/share/friso以下に置くなら次のようにします。

```sh
sudo mkdir /etc/friso
sudo cp friso.ini /etc/friso
sudo mkdir /usr/share/friso
sudo cp -r dict /usr/share/friso
sudo chmod 755 /usr/share/friso
```

その際にはfriso.iniに辞書を配置しているディレクトリへのパスを指定している箇所があるので予め書き換えておきます。

```
friso.lex_dir = /usr/share/friso/dict/UTF-8/
```

ここまでで、frisoというコマンドもインストールされているはずなので対話的に試すこともできます。

```
% friso -init /etc/friso/friso.ini
Initialized in 0.080000sec
+-Version: 1.6.0 (UTF-8)
+-----------------------------------------------------------+
| friso - a chinese word segmentation writen by c.          |
| bug report email - chenxin619315@gmail.com.               |
| or: visit http://code.google.com/p/friso.                 |
|     java edition for http://code.google.com/p/jcseg       |
| type 'quit' to exit the program.                          |
+-----------------------------------------------------------+
friso>> 
```

対話的に使うときには、プロンプトにそのまま文章を入力します。

```sh
friso>> 叔叔亲了我妈妈也亲了我
分词结果:
叔叔 亲了 我 妈妈 也 亲了 我 
Done, cost < 0.000000sec
```

すると、上記のように分割結果が得られます。

## groonga-tokenizer-frisoのインストール

Frisoのインストールができたので、次はgroonga-tokenizer-frisoをインストールします。
予め、Groongaの開発パッケージをインストールしておいてください。Debian系ならlibgroonga-devを、RedHat系ならばgroonga-develをインストールします。

Groongaの開発パッケージをインストールしたら、groonga-tokenizer-frisoをインストールしましょう。
インストールは次のようにして行います。

```sh
git clone https://github.com/kenhys/groonga-tokenizer-friso.git
cd groonga-tokenizer-friso
./autogen.sh
./configure --with-friso=/usr/lib --with-friso-ini=/etc/friso/friso.ini
make
sudo make install
```

Frisoのインストール先を変更した場合は上記のパスは適宜読み替えてください。
最後にトークナイザーを次のようにして登録してください。

```sh
% groonga データベースのパス
> register tokenizers/friso
```

これで、 ``TokenFriso`` という中国語向けのトークナイザーが利用できるようになります。

## TokenFrisoを使ってトークナイズする

では、実際にトークナイズを試してみましょう。

Groongaにはどのようにトークナイズされるかを確認することのできる、 ``tokenize`` コマンドがあります。

```
> tokenize TokenFriso "今天"
[[0,1389847650.12458,0.178282022476196],[{"value":"今天","position":0}]]
```

たとえば、これを中国語向けに辞書を整備していない素のTokenMeCabで試すと、もちろん"今"と"天"はひとつの単語とはみなされません。

```
> tokenize TokenMecab "今天"
[[0,1389847700.86805,0.00130152702331543],[{"value":"今","position":0},{"value":"天","position":1}]]
```

# まとめ

今回は、Groongaの中国語向けのトークナイザーを使う例を紹介しました。

Groongaに興味を持ったなら、まずは[インストール](http://groonga.org/ja/docs/install.html)して試してみてください。

Groongaの基本的な動作を知るための[チュートリアル](http://groonga.org/ja/docs/tutorial.html)もあります。インストールしたら試してみてください。

自分でトークナイザーを新規に追加することに興味があるなら、[groonga-tokenizer-sample](https://github.com/groonga/groonga-tokenizer-sample)があるので参考にしてみてください。