はじめに
こんにちはRIN1208です。この記事はITRCアドベントカレンダーの19日目の記事になります。
経緯
まず初めにこの記事を書いた経緯の説明をしたいと思います。
この記事で作った物こちらの記事、オレ プログラム ウゴカス オマエ ゲンシジン ナルを読み自分でも作ってみたくなったので作成した物です。
内容は似ていますが作成した言語やパッケージは異なります。
こちらの記事は個人的にとても好きなので是非見てみて下さい。
開発環境
- Mac
- goの実行環境
- MeCabの環境
MeCabのインストール(Mac)
$ brew install mecab
$ brew install mecab-ipadic
$ brew install git curl xz
$ git clone --depth 1 git@github.com:neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
$ ./bin/install-mecab-ipadic-neologd -n
上記のコマンドで一通りインストールできます。
また今回neologd辞書もインストールしています。詳しくはこちらを参照して下さい。
GoでMeCabを扱う
今回使用したGoのMeCabのラッパーはmecab-golangです。
先ほどMeCabをインストールしたのでこちらのコマンドを実行すれば準備完了です。
$ export CGO_LDFLAGS="`mecab-config --libs`"
$ export CGO_CFLAGS="-I`mecab-config --inc-dir`"
$ go get github.com/bluele/mecab-golang
これで準備完了です。
main.goと言うファイルを作成して下さい。
原始人になれるコードはこちら
package main
import (
"fmt"
"strings"
"github.com/bluele/mecab-golang"
)
func parseToNode(m *mecab.MeCab, word string) {
var key string
tg, err := m.NewTagger()
if err != nil {
panic(err)
}
defer tg.Destroy()
lt, err := m.NewLattice(word)
if err != nil {
panic(err)
}
defer lt.Destroy()
node := tg.ParseToNode(lt)
for {
features := strings.Split(node.Feature(), ",")
if features[0] != "助詞" && features[0] != "助動詞" {
key = key + " " + features[7]
}
if node.Next() != nil {
break
}
}
fmt.Println(key)
}
func main() {
var word string
m, err := mecab.New("-Owakati")
if err != nil {
panic(err)
}
defer m.Destroy()
fmt.Print("input keyword :")
fmt.Scan(&word)
parseToNode(m, word)
}
正直サンプルコードを少しいじっただけです。
それでは実行結果をみてみましょう。
$ go build main.go
$ go run main.go
input keyword :これでみんな原始人になれる
* コレ ミンナ ゲンシ ジン ナレル *
このような感じです。
ですがこちらのコードではカタカナで入力された言葉があるとエラーが出てしまいます。(改善予定)
他には限界ヲタクするとき等にも使用可能です。
$ go run main.go
input keyword :水着まこと可愛すぎてやばい
* ミズギ マコト カワイ スギ ヤバイ *
$ go run main.go
input keyword :この子かわいすぎないか。ほんと好みすぎてやばい
* コノ コ カワイ スギ 。 ホント コノミ スギ ヤバイ *
こんな感じで限界ヲタクするとき等にも使えます。
おわりに
自分は初めcotoha apiを使用してやってみたかったのですがいろいろと面倒だったのでMeCabを使ったらかなり簡単にできました。形態素解析自体このコードを書くまでが初めてですが面白いですね(コード書いたの半年以上前)。またここまで読んでくれた方ありがとうございました!