emahiro/b.log

日々の勉強の記録とか育児の記録とか。

goでmecabを動かす

簡単な分かち書きCLIツール作ってみようと思ったのでmecabをgoで動かして見ました。

やったこと

  • goでmecabを動かすこと

mecab-golangのinstall

以下のmecabのクライアントを使いました。

github.com

最初に

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`"

depgolang-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 !!!⏎

ちゃんと動いている!

今回書いたコードは以下

github.com