Go で Mecab を使ってみた
$GOROOT/misc/cgo/ にサンプルがあったので、試してみた。
Makefile は $GOROOT/misc/cgo/stdio/Makefile を流用して、
バインド部分を書いて、make するだけ。
実際に動かしてみたい場合は、検証用のソースコードを用意して、
ファイル名が main.go なら make main のように実行すると、実行ファイルができあがる。
作ってみて気づいた点は、
- 作成したライブラリは ${GOROOT}/pkg/${GOOS}_${GOARCH} に置かれる。
- cgo で生成された .cgo3.c と .cgo4.c の関数名の頭に 0xC2 が挿入される。
- パッケージ名称に、Makefile の TARG や元ファイルの file.go が影響する。
かな。
カテゴリは Go と golang のどっちにしようかな。
Mecab バインド用ソースコード
package mecab /* #include <mecab.h> struct mecab_t {}; */ import "C" func New2(s string) *C.mecab_t { p := C.CString(s); m := C.mecab_new2(p); return m; } func SparseToStr(m *C.mecab_t, s string) string { p := C.CString(s); r := C.mecab_sparse_tostr(m, p); ret_val := C.GoString(r); return ret_val; }
Makefile
include $(GOROOT)/src/Make.$(GOARCH) TARG = mecab CGOFILES = file.go #CGO_CFLAGS = -I #CGO_LDFLAGS = CGO_LDFLAGS = -lmecab include $(GOROOT)/src/Make.pkg %: install %.go $(GC) $*.go $(LD) -o $@ $*.$O example: @export LD_LIBRARY_PATH=/usr/local/lib; \ ./main
動作検証用ソースコード
package main import "fmt" import "mecab" func main() { fmt.Printf("hello, world\n"); s := "太郎は次郎が持っている本を花子に渡した。"; m := mecab.New2(""); r := mecab.SparseToStr(m, s); fmt.Printf("result: \n%s\n", r); }
実行結果
$ make example result: 太郎 名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー は 助詞,係助詞,*,*,*,*,は,ハ,ワ 次郎 名詞,固有名詞,人名,名,*,*,次郎,ジロウ,ジロー が 助詞,格助詞,一般,*,*,*,が,ガ,ガ 持っ 動詞,自立,*,*,五段・タ行,連用タ接続,持つ,モッ,モッ て 助詞,接続助詞,*,*,*,*,て,テ,テ いる 動詞,非自立,*,*,一段,基本形,いる,イル,イル 本 名詞,一般,*,*,*,*,本,ホン,ホン を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 花 名詞,一般,*,*,*,*,花,ハナ,ハナ 子 名詞,接尾,一般,*,*,*,子,コ,コ に 助詞,格助詞,一般,*,*,*,に,ニ,ニ 渡し 動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ 。 記号,句点,*,*,*,*,。,。,。 EOS