読者です 読者をやめる 読者になる 読者になる

cabocha4j - Java ライブラリ for CaboCha (日本語係り受け解析プログラム)

日本語係り受け解析プログラム CaboCha のJava 用のライブラリが公式に用意されていなかったので稚拙ながら作らせていただきました。といっても、実装は内部で exec 叩いて cabocha.exe を実行した結果をパーズしているだけです。

とりあえず最低限の機能を付けただけなので、今後自分で利用していく中で欲しいと思った機能をどんどん追加していきます。まだまだ未熟者で経験も浅いため、技術的な指摘をしていただけると大変ありがたいです。

CaboCha 公式

CaboCha/南瓜: Yet Another Japanese Dependency Structure Analyzer
http://chasen.org/~taku/software/cabocha/
cabocha4j の利用には CaboCha のインストールが必要です。上記URL のリンク先からダウンロードしてインストールして下さい。

cabocha4j

ソースコード、jarファイル は github にて公開しています。
http://github.com/noire722/cabocha4j


最新版2011-02-06 cabocha4j_0.06.jar[16.7KB]
https://github.com/noire722/cabocha4j/raw/master/bin/cabocha4j_0.06.jar
※開発環境の WindowsXP でしか現在動作を確認していません。

サンプルコード

Sample 0 Sentenceオブジェクトの取得
Cabocha cabocha = new Cabocha(/* cabocha.exe のフルパス */"C:\\Program Files\\CaboCha\\bin\\cabocha.exe");
Sentence sentence = cabocha.execute("自然言語処理はマンマシンインタフェースの手法として魅力的である。");

実行結果

<sentence>
 <chunk id="0" link="3" rel="D" score="4.06977" head="2" func="3">
  <tok id="0" read="シゼン" base="自然" pos="名詞-形容動詞語幹" ctype="" cform="" ne="O">自然</tok>
  <tok id="1" read="ゲンゴ" base="言語" pos="名詞-一般" ctype="" cform="" ne="O">言語</tok>
  <tok id="2" read="ショリ" base="処理" pos="名詞-サ変接続" ctype="" cform="" ne="O">処理</tok>
  <tok id="3" read="ハ" base="は" pos="助詞-係助詞" ctype="" cform="" ne="O"></tok>
 </chunk>
 <chunk id="1" link="2" rel="D" score="1.51375" head="6" func="7">
  <tok id="4" read="マン" base="マン" pos="名詞-一般" ctype="" cform="" ne="O">マン</tok>
  <tok id="5" read="マシン" base="マシン" pos="名詞-一般" ctype="" cform="" ne="O">マシン</tok>
  <tok id="6" read="インタフェース" base="インタフェース" pos="名詞-一般" ctype="" cform="" ne="O">インタフェース</tok>
  <tok id="7" read="ノ" base="の" pos="助詞-連体化" ctype="" cform="" ne="O"></tok>
 </chunk>
 <chunk id="2" link="3" rel="D" score="0" head="8" func="9">
  <tok id="8" read="シュホウ" base="手法" pos="名詞-一般" ctype="" cform="" ne="O">手法</tok>
  <tok id="9" read="トシテ" base="として" pos="助詞-格助詞-連語" ctype="" cform="" ne="O">として</tok>
 </chunk>
 <chunk id="3" link="-1" rel="O" score="0" head="11" func="13">
  <tok id="10" read="ミリョク" base="魅力" pos="名詞-一般" ctype="" cform="" ne="O">魅力</tok>
  <tok id="11" read="テキ" base="的" pos="名詞-接尾-形容動詞語幹" ctype="" cform="" ne="O"></tok>
  <tok id="12" read="デ" base="だ" pos="助動詞" ctype="特殊・ダ" cform="連用形" ne="O"></tok>
  <tok id="13" read="アル" base="ある" pos="助動詞" ctype="五段・ラ行アル" cform="基本形" ne="O">ある</tok>
  <tok id="14" read="。" base="。" pos="記号-句点" ctype="" cform="" ne="O"></tok>
 </chunk>
</sentence>
Sample 1 品詞の取得と表示
List<Chunk> chunkList = sentence.getChunks();
// Sample 1
for (Chunk chunk : chunkList) {
	List<Token> tokens = chunk.getTokens();
	for (Token token : tokens) {
		System.out.println(token.getBase() + ": " + token.getPos());
	}
}

実行結果

自然: 名詞-形容動詞語幹
言語: 名詞-一般
処理: 名詞-サ変接続
は: 助詞-係助詞
マン: 名詞-一般
マシン: 名詞-一般
インタフェース: 名詞-一般
の: 助詞-連体化
手法: 名詞-一般
として: 助詞-格助詞-連語
魅力: 名詞-一般
的: 名詞-接尾-形容動詞語幹
で: 助動詞
ある: 助動詞
。: 記号-句点
Sample 2 連続する品詞を連結させる。
// Sample 2
chunkList = Utils.chainPos(chunkList, PosDiv.NOUN);
for (Chunk chunk : chunkList) {
	List<Token> tokens = chunk.getTokens();
	for (Token token : tokens) {
		System.out.println(token.getBase() + ": " + token.getPos());
	}
}

実行結果

自然言語処理: 名詞-形容動詞語幹
は: 助詞-係助詞
マンマシンインタフェース: 名詞-一般
の: 助詞-連体化
手法: 名詞-一般
として: 助詞-格助詞-連語
魅力的: 名詞-一般
で: 助動詞
ある: 助動詞
。: 記号-句点
Sample 3 ある文節に係っている文節をすべて取得して表示する
// Sample 3
for (Chunk chunk : chunkList) {
	if(chunk.getBase().contains("魅力的である")) {
		List<Chunk> referencedBy = chunk.getReferencedBy(chunkList);
		for(Chunk refs : referencedBy) {
			System.out.println(refs.getBase());
		}
	}
}

実行結果

自然言語処理は
手法として

ノードの親子関係

Sentence┳Chunk
    ┣Chunk
    ┗Chunk ┳Token
        ┣Token
        ┣Token
        ┗Token

cabocha.exe に -f3 オプションを付けて実行し、得られた結果の情報を各オブジェクトに格納して取得します。
ノードのフィールド名などにはタグのシグニチャをそのまま使っているので
詳しい意味等は CaboCha 公式のマニュアルか、または検索エンジンで"京大コーパス"、"京都大学テキストコーパス"等のキーワードで検索して調べると答えが見つかるかもしれません。
後日、javadoc とマニュアルを作成する予定です。