Pure Go で辞書同梱な形態素解析器 kagome を公開してみました

# 概要
Kagome(籠目)は Pure Go な日本語形態素解析器のプロトタイプです．辞書をソースにエンコードして同梱しているので，バイナリだけで動作します．辞書データとして，MeCab-IPADICを利用しています．

関連:

* [Pure Go な形態素解析器で実行バイナリに辞書埋め込んだヤツを作ってみた (1)](http://qiita.com/ikawaha/items/235371a7b1066ba5ea6c) 
* [Pure Go な形態素解析器で実行バイナリに辞書埋め込んだヤツを作ってみた (2) 未知語処理編](http://qiita.com/ikawaha/items/8a94b728105e03a76468)
* [Pure Go な形態素解析器で実行バイナリに辞書埋め込んだヤツを作ってみた(3) 完結編](http://qiita.com/ikawaha/items/5d21f16218bb13eeb286)

# ソース

https://github.com/ikawaha/kagome

# インストール

```bash:インストール
% go get github.com/ikawaha/kagome/...
```

~~★辞書がソースに埋め込まれている関係でビルドに時間がかかります．~~
[go-bindata で辞書を埋め込む方式に変更して改善されました](http://qiita.com/ikawaha/items/8c2b3bd56ff427e9d2d0)

# 利用方法

## コマンドとして利用する

### cmd

```bash:usage
% kagome -h
usage: kagome [-f input_file] [-u userdic_file]
  -f="": input file
  -u="": input file
```

### ユーザー辞書の設定

ユーザ辞書の形式は kuromoji 形式です．_sampleにサンプルがあります．

```go:ユーザー辞書を指定した実行例
% kagome -u _sample/userdic.txt
第68代横綱朝青龍
第 接頭詞,数接続,*,*,*,*,第,ダイ,ダイ
68  名詞,数,*,*,*,*,*,*,*
代 名詞,接尾,助数詞,*,*,*,代,ダイ,ダイ
横綱  名詞,一般,*,*,*,*,横綱,ヨコヅナ,ヨコズナ
朝青龍   カスタム人名,*,*,*,*,*,*,アサショウリュウ,*
EOS
```

```text:ユーザー辞書サンプル
##
## This file should use UTF-8 encoding
##
## User dictionary format:
## <text>,<token1> <token2> ... <tokenn>,<reading1> <reading2> ... <readingn>,<part-of-speech>
##

# Custom segmentation for long entries
日本経済新聞,日本 経済 新聞,ニホン ケイザイ シンブン,カスタム名詞
関西国際空港,関西 国際 空港,カンサイ コクサイ クウコウ,テスト名詞

# Custom reading for former sumo wrestler Asashoryu
朝青龍,朝青龍,アサショウリュウ,カスタム人名
```

# ライブラリとして利用

## 解析
tokenizer を new して解析したい文字列を入力すると，形態素列が帰ってきます．
形態素は，表記と開始位置，終了位置の情報を持ちます．それ以外の，形態素の詳細(品詞等)が必要な場合は，形態素IDでコンテンツを引いてください．

```go:単純なサンプル
package main

import (
        "fmt"

        "github.com/ikawaha/kagome/tokenizer"
)

func main() {
        t := tokenizer.NewTokenizer()
        morphs, _ := t.Tokenize("すもももももももものうち")
        for i, m := range morphs {
                if m.Id == tokenizer.BOSEOS {
                fmt.Printf("%3d, %v(%v, %v)\n", i, m.Surface, m.Start, m.End)
                        continue
                }
                content, _ := m.Content()
                fmt.Printf("%3d, %v(%v, %v)\t%v\n", i, m.Surface, m.Start, m.End, content)
        }
}
}
```

```text:実行結果
% ./tokenize_sample
  0, すもも(0, 3)       名詞, 一般, , , , , すもも, スモモ, スモモ
  1, も(3, 4)   助詞, 係助詞, , , , , も, モ, モ
  2, もも(4, 6) 名詞, 一般, , , , , もも, モモ, モモ
  3, も(6, 7)   助詞, 係助詞, , , , , も, モ, モ
  4, もも(7, 9) 名詞, 一般, , , , , もも, モモ, モモ
  5, の(9, 10)  助詞, 連体化, , , , , の, ノ, ノ
  6, うち(10, 12)       名詞, 非自立, 副詞可能, , , , うち, ウチ, ウチ
  7, EOS(12, 12)
```

## 各種情報

### Content 構造体

形態素の詳細情報は次のような構造体で出来ています．

* 品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音

を表しています．内容は mecab の辞書に準じます．

```
type Content struct {
        Pos, Pos1, Pos2, Pos3,
        Katuyougata, Katuyoukei, Kihonkei,
        Yomi, Pronunciation string
}
```

# マルチスレッドで動作させる場合の注意
tokenizer は内部にバッファを確保しているので，複数の goroutine で共有して動作させることが出来ません．1-goroutine, 1-tokenizerを確保してください．

# License

Kagome is licensed under the Apache License v2.0 and uses the MeCab-IPADIC dictionary/statistical model. See NOTICE.txt for license details. 

# TODO

* ~~kuromoji の search モード相当機能の追加~~
* mecab辞書→go code 変換のコード公開
* ~~テストの追加~~