はじめに

簡単に形態素解析やりたいなーって探していたら、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: 名詞のときの処理
}

名詞をシャッフルする

ここまで分かったらあとは簡単です。やることは以下です。

  1. テキストを取得
  2. 形態素解析を行なう
  3. 文章中の名詞のみ順番を入れかえる
  4. 文章を出力

実際に作成したものはこれになります。

実行するとこんな巫山戯た感じになります。

textshuffle -t 我輩は猫である。名前はまだない。

終り

しょうもないですね。