GolangでNEologdでMeCab

created at 2017/12/25 16:42:00

Goで形態素解析APIを作りたくて、GoでMeCabをNEologdで使う方法を調べました。

ライブラリ

いくつかあります。

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を使う場合と使わない場合です。

main.go
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使えてますね :wink: