係り受け解析器cabochaのインストール

SVMとかを自前で作ったのかインストールがめちゃくちゃ簡単になったcabochaがあると聞いたので入れてみた。

http://chasen.org/~taku/blog/archives/2008/01/cabocha_060_pre.html

前準備

いれたもの

(リンク先は現状で最新のもの)

wget http://(ry
tar xvzf XXX.tar.gz
cd XXX
./configure
make
sudo make install

ipadicでUTF8使う場合は"./configure --with-charset=utf8"する。

cygwinなどWindows環境に入れる場合は、
Mecabのconfigure時に

./configure LDFLAGS="-liconv" --with-charset=utf8

インストール時にcommon.hで

#if defined(_MSC_VER) || defined(__CYGWIN__)
#define for if (0); else for
/* why windows.h define such a generic macro */
#undef max
#undef min
#define snprintf _snprintf
#endif

の部分をalgorithmなどいろいろインクルードする前に持ってこないと、"expected unqualified-id before ..."とかいう名前がコンフリクトしてるときによく起こるエラーが出るみたい。まじ、windows.hのmin,maxうざい。


さらに、CRF++のMakefileをいじってあげないとCabochaのインストールの際にlibtoolがらみのリンクエラーが発生する。いじり方はCXXLINKの最後あたりに-no-undefinedをいれてあげるだけ。

いよいよかぼちゃ

いれたもの

インストール法はまぁいつもどおり。tar.bz2を解凍する方法に戸惑ったけど、

bzip2 -dc ファイル名 | tar xvf -

でいけた。環境によってはtar命令のオプションだけでできるっぽいんだけど・・・。
こっちもUTF8使う時に"./configure --with-charset=utf8"する。
Macにインストールする時は"LIBS=-liconv ./configure --with-charset=utf8"にしないといけない。

完了

$ cabocha
かぼちゃが簡単に入ってとても幸せ
かぼちゃが---D
      簡単に-D
        入って---D
          とても-D
              幸せ
EOS

Cabocha新インターフェース用のC++サンプルコード

Cabocha 0.6 pre系列はインターフェースが変わったので、取得できるものを全部列挙する感じで組んでみた。

#include <iostream>
#include <string>
#include <cabocha.h>
using namespace std;

//How to compile?
//g++ -O2 `cabocha-config --cflags` cabochasample.cpp -o cabochasample `cabocha-config --libs`

string getBase(const CaboCha::Token* token) {
  if (token->feature_list_size > 6 && token->feature_list[6] != string("*"))
    return token->feature_list[6];
  return token->surface;
}
string getType(const CaboCha::Token* token) {
  return string(token->feature_list[0]) + "-" + token->feature_list[1];
}

int main (int argc, char **argv) {
  try {
    CaboCha::Parser* parser = CaboCha::createParser(argc, argv);
    string sentence;
    while (getline(cin, sentence)) {
      const CaboCha::Tree *tree = parser->parse(sentence.data());
      for (unsigned int i = 0; i < tree->size(); ++i) {
        const CaboCha::Token *token = tree->token (i);

        // is this token begnning of chunk ?
        if (token->chunk) {
          cout << endl;
          cerr << "* " 
               << token->chunk->link << ' '
               << token->chunk->head_pos  << ' '
               << token->chunk->func_pos  << ' '
               << token->chunk->token_size  << ' '
               << token->chunk->token_pos  << ' '
               << token->chunk->score << ' ';
          for (int k = 0; k < token->chunk->feature_list_size; k++)
            cerr << token->chunk->feature_list[k] << ' ';
          cerr << endl;
        }

        cout << '[' << getBase(token) << '/' << getType(token) << "] ";
        cerr << token->surface << '\t'
             << token->normalized_surface << '\t'
             << token->feature << '\t';
        for (int k = 0; k < token->feature_list_size; k++)
          cerr << token->feature_list[k] << '\t';
        cerr << token->ne << endl;
      }
      cout << endl;
    }
  } catch (exception &e) {
    cerr << e.what() << endl;
    return 1;
  }
  return 0;
}

こんな感じでいかがでしょうか?

標準出力の結果

[かぼちゃ/名詞-一般] [が/助詞-格助詞] 
[簡単/名詞-形容動詞語幹] [に/助詞-格助詞] 
[入る/動詞-自立] [て/助詞-接続助詞] 
[とても/副詞-助詞類接続] 
[幸せ/名詞-形容動詞語幹] 

標準出力+標準エラー出力の結果

* 2 0 1 2 0 0.545432 f_H0:かぼちゃ f_H1:名詞 f_H2:一般 f_F0:が f_F1:助詞 f_F2:格助詞 f_F3:一般 a:が B:名詞-一般 G_CASE:が f_BOS:1 
[かぼちゃ/名詞-一般] かぼちゃ	かぼちゃ	名詞,一般,*,*,*,*,かぼちゃ,カボチャ,カボチャ	名詞	一般	*	*	*	*	かぼちゃ	カボチャ	カボチャ	O
[が/助詞-格助詞] が	が	助詞,格助詞,一般,*,*,*,が,ガ,ガ	助詞	格助詞	一般	*	*	*	が	ガ	ガ	O

* 2 0 1 2 2 1.86243 f_H0:簡単 f_H1:名詞 f_H2:形容動詞語幹 f_F0:に f_F1:助詞 f_F2:格助詞 f_F3:一般 a:に B:名詞-形容動詞語幹 G_CASE:に 
[簡単/名詞-形容動詞語幹] 簡単	簡単	名詞,形容動詞語幹,*,*,*,*,簡単,カンタン,カンタン	名詞	形容動詞語幹	*	*	*	*	簡単	カンタン	カンタン	O
[に/助詞-格助詞] に	に	助詞,格助詞,一般,*,*,*,に,ニ,ニ	助詞	格助詞	一般	*	*	*	に	ニ	ニ	O

* 4 0 1 2 4 0 f_H0:入っ f_H1:動詞 f_H2:自立 f_H5:連用タ接続 f_H6:五段・ラ行 f_F0:て f_F1:助詞 f_F2:接続助詞 A:て B:動詞-自立 G_CASE:て 
[入る/動詞-自立] 入っ	入っ	動詞,自立,*,*,五段・ラ行,連用タ接続,入る,ハイッ,ハイッ	動詞	自立	*	*	五段・ラ行	連用タ接続	入る	ハイッ	ハイッ	O
[て/助詞-接続助詞] て	て	助詞,接続助詞,*,*,*,*,て,テ,テ	助詞	接続助詞	*	*	*	*	て	テ	テ	O

* 4 0 0 1 6 0 F_H0:とても F_H1:副詞 F_H2:助詞類接続 F_F0:とても F_F1:副詞 F_F2:助詞類接続 A:とても B:副詞-助詞類接続 
[とても/副詞-助詞類接続] とても	とても	副詞,助詞類接続,*,*,*,*,とても,トテモ,トテモ	副詞	助詞類接続	*	*	*	*	とても	トテモ	トテモ	O

* -1 0 0 1 7 0 F_H0:幸せ F_H1:名詞 F_H2:形容動詞語幹 F_F0:幸せ F_F1:名詞 F_F2:形容動詞語幹 A:名詞-形容動詞語幹 B:名詞-形容動詞語幹 F_EOS:1 
[幸せ/名詞-形容動詞語幹] 幸せ	幸せ	名詞,形容動詞語幹,*,*,*,*,幸せ,シアワセ,シアワセ	名詞	形容動詞語幹	*	*	*	*	幸せ	シアワセ	シアワセ	O