Edited at

GAE/Goで形態素解析してみた

More than 3 years have passed since last update.


GAE/Goで形態素解析

Goの形態素解析ライブラリで最もメジャーなのはkagomeであるが、辞書ファイルが1ファイルの容量制限(32MB)を超えてしまい、デプロイできない。

そこで、他にもGoで書かれた形態素解析のコードはないものかと探し回ったら、SenKoというのが存在したので、試してみました。


SenKo

MeCab形式の辞書ファイル(csv)を採用。

32MBを超えるcsvファイルは存在しないが、辞書ファイルが多いい。


試してみるコード


辞書の読み込み

var dec *senko.Decoder

func loadDictionary() {
mat := senko.LoadMatrix("data/matrix.def")
dict := senko.NewDictionary()
dict.LoadDictionaries("data")
dec = senko.NewDecoder(dict, mat)
}


APIの作成

リクエスト:形態素解析したい文章

レスポンス:形態素解析結果(単語・品詞)

func registerAnalysis() {

http.HandleFunc("/api/analysis", handleAnalysis)
}

func handleAnalysis(w http.ResponseWriter, r *http.Request) {
c := appengine.NewContext(r)
sentence := r.FormValue("sentence")
log.Infof(c, "形態素解析対象文字列 = %s\n", sentence)
var vocabularies []Vocabulary
for _, s := range dec.Search(sentence) {
str := strings.Split(s.Repr(), ",")
if str[0] == "EOS" {
break
}
vocabulary := Vocabulary{
Word: str[0],
Pos: str[4],
}
vocabularies = append(vocabularies, vocabulary)
log.Infof(c, "単語 = %s, 品詞 = %s", vocabulary.Word, vocabulary.Pos)
}
json, err := json.Marshal(&vocabularies)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
w.Header().Set("Content-Type", "application/json;charset=utf-8")
w.Write(json)
}


デプロイしてみる

動いた。

kagomeに比べ、csvファイルを読み込む処理が入るのでTokenizerの生成に時間はかかるが、一度読み込んでしまえば、形態素解析の処理自体は速いです。

文章の中に未知語が含まれていると、結果を返してくれなかったり、kagomeよりも精度は劣ると感じるものの、自分がやりたいことに対しては十分でした。

辞書ファイルがcsvなので、必要に応じて楽に単語を追加できる点でもありだとは思います。

最後の「もも」がうまくいっていませんね(涙)