PythonでIgoを使う

形態素解析器IgoをPythonで利用する方法をまとめます。Mecabとかもありますが、クロスプラットフォームとかで環境準備しようとすると、面倒な部分もあるので…。
今回は、Ubuntu 14.04にインストールします。pipコマンドでインストールしようと思いますが、インストールしていなければ、インストールしておきます。

$ sudo apt-get install python-pip

そして、IgoをPythonで利用するためにigo-pythonをインストールします。

$ sudo pip install igo-python

インストールしたら、辞書を準備します。MecabのIPA辞書を以下のコマンドでIgo用の辞書に変換します。

$ wget -O igo-0.4.5.jar "http://sourceforge.jp/frs/redir.php?m=iij&f=%2Figo%2F55029%2Figo-0.4.5.jar"
$ wget -O mecab-ipadic-2.7.0-20070801.tar.gz "http://sourceforge.jp/frs/g_redir.php?m=jaist&f=%2Fmecab%2Fmecab-ipadic%2F2.7.0-20070801%2Fmecab-ipadic-2.7.0-20070801.tar.gz"
$ tar zxvf mecab-ipadic-2.7.0-20070801.tar.gz
$ java -cp igo-0.4.5.jar net.reduls.igo.bin.BuildDic ipadic mecab-ipadic-2.7.0-20070801 EUC_JP

igoのjarファイルとIPA辞書を取得して、igoのjarファイルを用いて、IPA辞書をipadicディレクトリに出力しています。
ここまでできたら、あとは動作確認します。たとえば、以下のようなtest.pyを作成して実行します。

# -*- coding: utf-8 -*-
from igo.tagger import Tagger
if __name__ == '__main__':
    tagger = Tagger('ipadic')
    words = tagger.parse(u'明日東京へ行く。')
    for word in words:
        print word.surface, word.feature, word.start

実行結果は以下のようになります。

明日 名詞,副詞可能,*,*,*,*,明日,アシタ,アシタ 0
東京 名詞,固有名詞,地域,一般,*,*,東京,トウキョウ,トーキョー 2
へ 助詞,格助詞,一般,*,*,*,へ,ヘ,エ 4
行く 動詞,自立,*,*,五段・カ行促音便,基本形,行く,イク,イク 5
。 記号,句点,*,*,*,*,。,。,。 7

以上のような感じで、Pythonで手軽に形態素解析を利用することができます。

Synonymプラグイン

Elasticsearch Analysis SynonymLUCENE-5252で上がっているNGramSynonymTokenizerをElasticsearchで利用できるようにしたプラグインです。詳しいことは、LUCENE-5252をググって確認してもらうのが良いですが、無邪気にSynonymTokenFilterを使っていると予期しない問題に遭遇することもあるかと思いますが(特に日本語とかで)、その辺の対応ができるかと思います。このプラグインとしては、NGramSynonymTokenizerをngram_synonymとして登録してあるので、インデックスの設定でanalyzerとして利用設定すれば使うことができます。というわけで、日本語検索では利用してみるとよいと思います。

Reindexingプラグイン

ReindexingプラグインはElasticsearchでドキュメントを追加したときにJSONデータを保存しているsourceフィールドを利用して、スクロールスキャンで既存のデータをマルっと別のインデックスへ再登録することができるプラグインです。
これにより、インデックスをコピーすることができます。たとえば、

$ curl -XPOST localhost:9200/sample/_reindex/newsample/

とすることで、sampleインデックスをnewsampleインデックスへコピーが簡単にできます。
さらに、urlパラメータを利用することで、別のElasticsearchクラスタへもデータを送ることができます。

$ curl -XPOST localhost:9200/sample/_reindex/newsample/?url=http%3A%2F%2Flocalhost%3A9200%2F

という感じで、登録先を指定することもできます。
あとは、コピー先のインデックスを用意しておかなければ、作成時にインデックスが作られることになりますが、既存と異なるインデックスセッティングやマッピングでインデックスを作成しておいてから再インデキシングを実行すると、既存と異なる設定のインデックスに置き換えることもできます。これをすることで、Analayzerの比較検証とかもやりやすくなるかと思います。