Goで形態素解析APIを作りたくて、GoでMeCabをNEologdで使う方法を調べました。
ライブラリ
いくつかあります。
- github.com/yukihir0/mecab-go
- bitbucket.org/rerofumi/mecab
- github.com/bluele/mecab-golang
- github.com/shogo82148/go-mecab
MeCabではないけどPure Goな形態素解析器もありました。
今回は、使いやすそうでメモリ管理がしっかりしていると書かれている1github.com/shogo82148/go-mecabを選びました。
インストール
MeCab、mecab-config、NEologdのインストールは省略します。
export CGO_LDFLAGS="`mecab-config --libs`"
export CGO_CFLAGS="-I`mecab-config --inc-dir`"
go get github.com/shogo82148/go-mecab
使い方
NEologdを使う場合と使わない場合です。
package main
import (
"fmt"
mecab "github.com/shogo82148/go-mecab"
)
const (
ipadic = "/usr/local/lib/mecab/dic/mecab-ipadic-neologd"
text = "10日放送の「中居正広のミになる図書館」(テレビ朝日系)で、SMAPの中居正広が、篠原信一の過去の勘違いを明かす一幕があった。"
)
func parse(args map[string]string) {
mecab, err := mecab.New(args)
if err != nil {
panic(err)
}
defer mecab.Destroy()
node, err := mecab.ParseToNode(text)
for ; !node.IsZero(); node = node.Next() {
fmt.Printf("%s\t%s\n", node.Surface(), node.Feature())
}
}
func main() {
fmt.Println("# ipadic")
parse(map[string]string{})
fmt.Println("\n# NEologd")
parse(map[string]string{"dicdir": ipadic})
}
mecab.New
の引数としてMeCabのオプションを渡せばいいみたいです。
$ mecab --help
MeCab: Yet Another Part-of-Speech and Morphological Analyzer
Copyright(C) 2001-2012 Taku Kudo
Copyright(C) 2004-2008 Nippon Telegraph and Telephone Corporation
Usage: mecab [options] files
-r, --rcfile=FILE use FILE as resource file
-d, --dicdir=DIR set DIR as a system dicdir
-u, --userdic=FILE use FILE as a user dictionary
-l, --lattice-level=INT lattice information level (DEPRECATED)
-D, --dictionary-info show dictionary information and exit
-O, --output-format-type=TYPE set output format type (wakati,none,...)
-a, --all-morphs output all morphs(default false)
-N, --nbest=INT output N best results (default 1)
-p, --partial partial parsing mode (default false)
-m, --marginal output marginal probability (default false)
-M, --max-grouping-size=INT maximum grouping size for unknown words (default 24)
-F, --node-format=STR use STR as the user-defined node format
-U, --unk-format=STR use STR as the user-defined unknown node format
-B, --bos-format=STR use STR as the user-defined beginning-of-sentence format
-E, --eos-format=STR use STR as the user-defined end-of-sentence format
-S, --eon-format=STR use STR as the user-defined end-of-NBest format
-x, --unk-feature=STR use STR as the feature for unknown word
-b, --input-buffer-size=INT set input buffer size (default 8192)
-P, --dump-config dump MeCab parameters
-C, --allocate-sentence allocate new memory for input sentence
-t, --theta=FLOAT set temparature parameter theta (default 0.75)
-c, --cost-factor=INT set cost factor (default 700)
-o, --output=FILE set the output file name
-v, --version show the version and exit.
-h, --help show this help and exit.
結果はこんな感じです。
$ go run main.go
# ipadic
BOS/EOS,*,*,*,*,*,*,*,*
10 名詞,数,*,*,*,*,*
日 名詞,接尾,助数詞,*,*,*,日,ニチ,ニチ
放送 名詞,サ変接続,*,*,*,*,放送,ホウソウ,ホーソー
の 助詞,連体化,*,*,*,*,の,ノ,ノ
「 記号,括弧開,*,*,*,*,「,「,「
中居 名詞,固有名詞,人名,姓,*,*,中居,ナカイ,ナカイ
正広 名詞,固有名詞,人名,名,*,*,正広,マサヒロ,マサヒロ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
ミ 名詞,一般,*,*,*,*,ミ,ミ,ミ
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
なる 動詞,自立,*,*,五段・ラ行,基本形,なる,ナル,ナル
図書館 名詞,一般,*,*,*,*,図書館,トショカン,トショカン
」 記号,括弧閉,*,*,*,*,」,」,」
( 記号,括弧開,*,*,*,*,(,(,(
テレビ朝日 名詞,固有名詞,組織,*,*,*,テレビ朝日,テレビアサヒ,テレビアサヒ
系 名詞,接尾,一般,*,*,*,系,ケイ,ケイ
) 記号,括弧閉,*,*,*,*,),),)
で 助詞,格助詞,一般,*,*,*,で,デ,デ
、 記号,読点,*,*,*,*,、,、,、
SMAP 名詞,固有名詞,組織,*,*,*,*
の 助詞,連体化,*,*,*,*,の,ノ,ノ
中居 名詞,固有名詞,人名,姓,*,*,中居,ナカイ,ナカイ
正広 名詞,固有名詞,人名,名,*,*,正広,マサヒロ,マサヒロ
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
、 記号,読点,*,*,*,*,、,、,、
篠原 名詞,固有名詞,人名,姓,*,*,篠原,シノハラ,シノハラ
信一 名詞,固有名詞,人名,名,*,*,信一,シンイチ,シンイチ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
過去 名詞,副詞可能,*,*,*,*,過去,カコ,カコ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
勘違い 名詞,サ変接続,*,*,*,*,勘違い,カンチガイ,カンチガイ
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
明かす 動詞,自立,*,*,五段・サ行,基本形,明かす,アカス,アカス
一幕 名詞,一般,*,*,*,*,一幕,ヒトマク,ヒトマク
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
あっ 動詞,自立,*,*,五段・ラ行,連用タ接続,ある,アッ,アッ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。 記号,句点,*,*,*,*,。,。,。
BOS/EOS,*,*,*,*,*,*,*,*
# NEologd
BOS/EOS,*,*,*,*,*,*,*,*
10日 名詞,固有名詞,一般,*,*,*,10日,トオカ,トオカ
放送 名詞,サ変接続,*,*,*,*,放送,ホウソウ,ホーソー
の 助詞,連体化,*,*,*,*,の,ノ,ノ
「 記号,括弧開,*,*,*,*,「,「,「
中居正広のミになる図書館 名詞,固有名詞,一般,*,*,*,中居正広のミになる図書館,ナカイマサヒロノミニナルトショカン,ナカイマサヒロノミニナルトショカン
」 記号,括弧閉,*,*,*,*,」,」,」
( 記号,括弧開,*,*,*,*,(,(,(
テレビ朝日 名詞,固有名詞,組織,*,*,*,テレビ朝日,テレビアサヒ,テレビアサヒ
系 名詞,接尾,一般,*,*,*,系,ケイ,ケイ
) 記号,括弧閉,*,*,*,*,),),)
で 助詞,格助詞,一般,*,*,*,で,デ,デ
、 記号,読点,*,*,*,*,、,、,、
SMAP 名詞,固有名詞,人名,一般,*,*,SMAP,スマップ,スマップ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
中居正広 名詞,固有名詞,人名,一般,*,*,中居正広,ナカイマサヒロ,ナカイマサヒロ
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
、 記号,読点,*,*,*,*,、,、,、
篠原信一 名詞,固有名詞,人名,一般,*,*,篠原信一,シノハラシンイチ,シノハラシンイチ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
過去 名詞,副詞可能,*,*,*,*,過去,カコ,カコ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
勘違い 名詞,サ変接続,*,*,*,*,勘違い,カンチガイ,カンチガイ
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
明かす 動詞,自立,*,*,五段・サ行,基本形,明かす,アカス,アカス
一幕 名詞,一般,*,*,*,*,一幕,ヒトマク,ヒトマク
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
あっ 動詞,自立,*,*,五段・ラ行,連用タ接続,ある,アッ,アッ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。 記号,句点,*,*,*,*,。,。,。
BOS/EOS,*,*,*,*,*,*,*,*
ちゃんとNEologd使えてますね 😉