cabocha-rubyの使い方メモ

# 概要

cabocha-rubyの使い方メモ。

# インストール

```
gem install cabocha
```

# 使い方

```
require "cabocha"
include CaboCha
parser = Parser.new
tree = parser.parse("吾輩は猫である。")
```

解析済みのcabochaファイルを読み込みたい場合は、たぶん次の方法でできるはず。一文ずつ解析するので、最初の`EOS`までしか読み込まない。

```
> source = File.read("neko.cabocha")
> parser = Parse.new("-I4")
> tree = parser.parse(source)
```


# メソッド
## CaboCha::Parser

結果を文字列で取得する場合。

```
> text = "吾輩は猫である。"
> output = parser.parseToString(text)
> puts output
    吾輩は-D
  猫である。
EOS
```

文字列は`ASCII-8BIT`で返される。エンコーディングを変更するには`String#force_encoding`を使う。

```
> output.encoding
#=> #<Encoding:ASCII-8BIT>
> output.force_encoding "UTF-8"
```

結果を`CaboCha::Tree`オブジェクトで取得する場合。

```
> tree = parser.parse(text)
```

## CaboCha::Tree

センテンス関係

```
> tree.sentence.force_encoding("UTF-8")
=> "吾輩は猫である。"
> tree.sentence_size
=> 24
```

チャンク関係

```
> chunk = tree.chunk(0)
=> #<CaboCha::Chunk:0x007f96b408ee48 @__swigtype__="_p_cabocha_chunk_t">
> tree.chunk_size
#=> 2
```

トークン関係

```
> token = tree.token(0)
=> #<CaboCha::Token:0x007f96b407c068 @__swigtype__="_p_cabocha_token_t">
> tree.token_size
#=> 6
> tree.size
#=> 6
```

解析結果を文字列で取得。定数は次のいずれか。

* 0: `CaboCha::FORMAT_TREE`
* 1: `CaboCha::FORMAT_LATTICE`
* 2: `CaboCha::FORMAT_TREE_LATTICE`
* 3: `CaboCha::FORMAT_XML`
* 4: `CaboCha::FORMAT_NONE`

```
> puts tree.toString(FORMAT_TREE)
    吾輩は-D
  猫である。
EOS
```

出力レイヤーの確認と変更

* 0: `CaboCha::OUTPUT_RAW_SENTENCE`
* 1: `CaboCha::OUTPUT_POS`
* 2: `CaboCha::OUTPUT_CHUNK`
* 3: `CaboCha::OUTPUT_SELECTION`
* 4: `CaboCha::OUTPUT_DEP`

```
> tree.output_layer
#=> 4
> tree.set_output_layer(OUTPUT_RAW_SENTENCE)
> puts tree.toString(FORMAT_LATTICE)
吾輩は猫である。
```

文字コードと品詞セット

|値|文字コード|品詞セット|
|-----:|:-----|:-----|
|0|`CaboCha::EUC_JP`|`CaboCha::IPA`|
|1|`CaboCha::CP932`|`CaboCha::JUMAN`|
|2|`CaboCha::UTF8`|`CaboCha::UNIDIC`|
|3|`CaboCha::ASCII`||

```
> tree.charset
#=> 2
> tree.posset
#=> 2
```

削除関係。`#clear_chunk`はチャンクだけ削除する。`#clear`は全て削除する。

```
> tree.clear_chunk
> tree.chunk_size  #=> 0
> tree.token_size  #=> 6
> tree.empty  #=> false

> tree.clear
> tree.chunk_size  #=> 0
> tree.token_size  #=> 
> tree.empty  #=> true
```

値の設定。設定してもただちに解析結果が変わるわけではないので、何に使うかは不明。

```
> tree.set_sentence "名前はまだ無い。"
> tree.set_charset EUC_JP
> tree.set_posset IPA
```

使い方がよく分からないメソッド。

```
> tree.read
> tree.what
```

## CaboCha::Chunk

チャンク番号、トークン番号はいずれも文頭からの通し番号

* `#link` 係り先チャンク番号
* `#head_pos` 意味的主辞トークン番号
* `#func_pos` 統語的主辞トークン番号
* `#token_pos` チャンク先頭トークン番号

```
> chunk.link #=> 1
> chunk.head_pos #=> 0
> chunk.func_pos #=> 1
> chunk.token_size #=> 2
> chunk.token_pos #=> 0
> chunk.score #=> 0.0
> chunk.additional_info #=> nil
> chunk.feature_list_size #=> 18
> chunk.feature_list(0).force_encoding("UTF-8") #=> "FCASE:は"
```

## CaboCha::Token

出現形

```
> token.surface.force_encoding("UTF-8") #=> "吾輩"
> token.normalized_surface.force_encoding("UTF-8") #=> "吾輩"
```

素性

```
> token.feature.force_encoding("UTF-8")
=> "代名詞,*,*,*,*,*,ワガハイ,我が輩,吾輩,ワガハイ,吾輩,ワガハイ,混,*,*,*,*,ワガハイ,ワガハイ,ワガハイ,ワガハイ,*,*,0,*,*"
> token.feature_list_size #=> 26
> token.feature_list(0).force_encoding("UTF-8") #=> "代名詞"
```

その他。

```
> token.ne #=> nil
> token.additional_info #=> nil
> token.chunk
=> #<CaboCha::Chunk:0x007f96b41036f8 @__swigtype__="_p_cabocha_chunk_t">
```

`#ne`は固有表現 (named entity) のタグがついてる場合に使う。

```
> parser = Parser.new("-n1")
> tree = parser.parse("日本")
> token = tree.token(0)
> token.ne
=> "B-LOCATION"
```