目次
以前から春山さんのブログ(リンク)や勉強会で耳にはしていたのですがソースは読んでいませんでした。 先日、Luceneにcontributeされた(リンク)ので軽くソースを読んでみました。
まずはMeCabのページにある比較表(リンク)を基準に特徴を調べてみました。せっかくなので、lucene-gosenも隣に。
Kuromoji | lucene-gosen | |
---|---|---|
解析モデル | なし(学習機能なし) | なし(学習機能なし) |
コスト推定 | なし(学習機能なし) | なし(学習機能なし) |
学習モデル | なし(学習機能なし) | なし(学習機能なし) |
辞書引きアルゴリズム | Double Array Trie | Double Array Trie |
解探索アルゴリズム | Viterbi | Viterbi |
連接表の実装 | 2次元 Table | 3次元 Table |
品詞の階層 | 無制限多階層品詞?ipadic、unidic形式に対応 | 無制限多階層品詞 |
未知語処理 | 字種 (動作定義を変更可能)(おそらく。) | 字種(変更不可能) |
制約つき解析 | たぶん、不可? | たぶん、不可? |
N-best解 | 不可能 | 不可能 |
こうやって比較してみるとlucene-gosen(Sen)とあまりかわりはありませんが、lucene-gosenが少し古いのがわかりますね。。。
Kuromojiで利用出来る辞書は現時点ではMeCab IPADIC、UNIDICの2種類のようです。
ソースを読んでの感想ですが、やはりMeCabが偉大だということがよくわかりました。 Senよりも新しいMeCabの処理に似ている点が多いです。解探索アルゴリズムや連接コスト表が特に。 MeCab向けの辞書を利用しているためというのもあるかと思います。
Kuromojiが特徴的なのは「searchモード」と呼ばれるモードが用意されていることです。 公式サイトにある例ですと、「関西国際空港」が「関西」「国際」「空港」というTokenで出力されます。 ソースを見たところViterbiアルゴリズムで辞書を探索しているときに特定の条件でコストをカサ増しすることで、結果を変えるという処理を行っているようです。
- 全て漢字の単語:3文字以上の場合に「(単語の長さ-3)*10000」をコストに加算
- その他の単語:7文字以上の場合に「(単語の長さ-7)*10000」をコストに加算
このようにコストを変化させることで「空港」でも「関西国際空港」という文字を含む文章が検索できる仕組みになっています。 また、「拡張searchモード」と呼ばれるモードも存在し、こちらは、未知語をuni-gramで区切って出力を行うようです。
ソース上で確認しただけで、未確認ですが、GraphvizFormatterというクラスがあるので、Graphvizで読み込める形式で形態素解析の結果が出力されるかもしれません。(すみません、確認してなくて。)
未知語の処理やsearchモードなど面白い機能があるので、試してみるのもいいかもしれません。lucene-gosenを考えていく上でも参考になりそうです。
最後に余談ですが、FAQのページ(リンク)が面白いです。。。
comments powered by Disqus