はじめに
簡単に形態素解析やりたいなーって探していたら、kagomeというものを見つけたので、それでちょっと遊んだ話です。
形態素解析とは
まずは、形態素解析とは何ぞやという人もいるかと思います。wiki には以下のように記述されています。
形態素解析(けいたいそかいせき、Morphological Analysis)とは、文法的な情報の注記の無い自然言語のテキストデータ(文)から、対象言語の文法や、辞書と呼ばれる単語の品詞等の情報にもとづき、形態素(Morpheme, おおまかにいえば、言語で意味を持つ最小単位)の列に分割し、それぞれの形態素の品詞等を判別する作業である。
簡単に言うと、文章を「単語」や「助詞」などに分割して解析することを形態素解析といいます。
日本語は英語と違い単語や助詞で区切られていないため、日本語に特化した形態素解析の研究が行なわれており、様々なツールが存在します。 代表的なもので mecabというものがあります。 ですが、今回は go 謹製の kagome を使用します。
kagome の使い方
公式ドキュメントにざっくりと書いてあるのは以下のコードです。
package main
import (
"fmt"
"strings"
"github.com/ikawaha/kagome-dict/ipa"
"github.com/ikawaha/kagome/v2/tokenizer"
)
func main() {
t, err := tokenizer.New(ipa.Dict(), tokenizer.OmitBosEos())
if err != nil {
panic(err)
}
// wakati
fmt.Println("---wakati---")
seg := t.Wakati("すもももももももものうち")
fmt.Println(seg)
// tokenize
fmt.Println("---tokenize---")
tokens := t.Tokenize("すもももももももものうち")
for _, token := range tokens {
features := strings.Join(token.Features(), ",")
fmt.Printf("%s\t%v\n", token.Surface, features)
}
}
上記の出力は以下です。
---wakati---
[すもも も もも も もも の うち]
---tokenize---
すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも 名詞,一般,*,*,*,*,もも,モモ,モモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも 名詞,一般,*,*,*,*,もも,モモ,モモ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
うち 名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
t.Tokenize
をすることで、Features()
から品詞の組み合わせを取ってこれそうなことが分かります。
どうやって取ってくるのかなーって見ていたら、どうもFeatureAt(0)
みたいな形でとってくるようです。
そのため、名詞かどうかの判定を行うとしたら、以下のように書くようです。
feat, _ := t.FeatureAt(0)
if feat == "名詞" {
// TODO: 名詞のときの処理
}
名詞をシャッフルする
ここまで分かったらあとは簡単です。やることは以下です。
- テキストを取得
- 形態素解析を行なう
- 文章中の名詞のみ順番を入れかえる
- 文章を出力
実際に作成したものはこれになります。
実行するとこんな巫山戯た感じになります。
textshuffle -t 我輩は猫である。名前はまだない。
終り
しょうもないですね。