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