簡単な分かち書きのCLIツール作ってみようと思ったのでmecabをgoで動かして見ました。
やったこと
- goでmecabを動かすこと
mecab-golangのinstall
以下のmecabのクライアントを使いました。
最初に
mecab
をinstallし、mecab-config
が入っているかを確認します。
$ brew search mecab ==> Searching local taps... mecab mecab-ipadic # 以下色々 $ brew insatll mecab mecab-ipadic $ which mecab-config /usr/local/bin/mecab-config # 入っている!
golang-mecabを動かします。
GOPATHをリポジトリに合わせたかったので、direnvを使いました。
※ 通常はGOPATH配下にアプリケーションリポジトリを作るかもですが。
READMEに記載してあったmecabを使うためのライブラリのpathを .envrc
に追記します。
export GOPATH=$(pwd) export CGO_LDFLAGS="`mecab-config --libs`" export CGO_CFLAGS="-I`mecab-config --inc-dir`"
depで golang-mecab
を入れます。
$ dep init $ dep ensure $ dep ensure -add github.com/bluele/mecab-golang
これで mecab-golang
が動くようになります。
実際に書いたコード
package main import ( "fmt" "os" "strings" "github.com/bluele/mecab-golang" ) func parseToNode(m *mecab.MeCab, input string) { tg, err := m.NewTagger() if err != nil { fmt.Printf("NewTagger error. err: %v", err) os.Exit(-1) } defer tg.Destroy() lt, err := m.NewLattice(input) if err != nil { fmt.Printf("NewLattice error. err: %v", err) os.Exit(-1) } defer lt.Destroy() node := tg.ParseToNode(lt) for { features := strings.Split(node.Feature(), ",") fmt.Printf("features: %v\n", features) if node.Next() != nil { break } } } func main() { var input string fmt.Println("---- Input your text below ----") fmt.Scan(&input) m, err := mecab.New("-Owakati") if err != nil { fmt.Printf("Mecab instance error. err: %v", err) } defer m.Destroy() // parse to node parseToNode(m, input) fmt.Printf("%v", "Complete !!!") }
動かしてみる。
$ go run main.go ---- Input your text below ---- こんにちは佐藤さん features: [BOS/EOS * * * * * * * *] features: [感動詞 * * * * * こんにちは コンニチハ コンニチワ] features: [名詞 固有名詞 人名 姓 * * 佐藤 サトウ サトー] features: [名詞 接尾 人名 * * * さん サン サン] features: [BOS/EOS * * * * * * * *] Complete !!!⏎
ちゃんと動いている!
今回書いたコードは以下