こんにちは。 機械学習系はPythonにライブラリが偏っていることもあり圧倒的にPython一択ではあるのですが処理が遅いのが問題です。 Cythonって手もありますがビジネスで使うってなるとRubyとかGoで使えた方がいいよなーと思ってます。 そこでGoの勉強も兼ねて自然言語処理の基本MeCabで分かち書きをしてみました。 結構苦労したので書いておきます。
使ったラッパー
Goで使えるMeCabのラッパーはいくつかあるのですが一番簡単に動かせたのが下記のレポジトリのラッパーです。 github.com
インストール
使い方はGitHubのREADMEに書いてあるとおりなのですが、事前にMeCabが入っていれば下記で終わりです。
$ export CGO_LDFLAGS="`mecab-config --libs`" $ export CGO_CFLAGS="-I`mecab-config --inc-dir`" $ go get github.com/bluele/mecab-golang
使い方
READMEそのままだと面白くないのでちょいと関数を小分けにしました。 あとNEologdをインストールしてあるので、それも使ってみました。
package main
import (
"C"
"strings"
"github.com/bluele/mecab-golang"
"fmt"
)
func main(){
text := "NEologdが入っているのでDMM.comがディーエムエムドットコムって読めます"
m := generateMeCab()
defer m.Destroy()
node := parseToNode(text, m)
extractSurface(node)
}
func generateMeCab() *mecab.MeCab {
m, err := mecab.New("-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd")
if err != nil {
panic(err)
}
return m
}
func parseToNode(text string, m *mecab.MeCab) *mecab.Node {
tg, err := m.NewTagger()
if err != nil {
panic(err)
}
lt, err := m.NewLattice(text)
if err != nil {
panic(err)
}
node := tg.ParseToNode(lt)
return node
}
func extractSurface(node *mecab.Node){
for {
features := strings.Split(node.Feature(), ",")
if features[0] == "名詞" {
fmt.Println(fmt.Sprintf("%s %s", node.Surface(), node.Feature()))
}
if node.Next() != nil {
break
}
}
}
結果は↓
NEologd 名詞,固有名詞,一般,*,*,*,NEologd,ネオログディー,ネオログディー DMM.com 名詞,固有名詞,一般,*,*,*,DMM.com,ディーエムエムドットコム,ディーエムエムドットコム ディーエムエムドットコム 名詞,固有名詞,一般,*,*,*,DMM.com,ディーエムエムドットコム,ディーエムエムドットコム
感想
始めてGo書いたんですが中々仕様に慣れなくて苦労しました。特に型はPythonだと意識しないので大変でしたね。でも型があるとエラーがスグ分かって良いです。
Pythonのゆるさもいいですが、ちゃんと開発するならGoのシッカリした感じはとても良さそうです。
サーバーサイドなんかはGoの方が楽だと思うのでGoでも機械学習できるパッケージ出てほしい。