Chapter 03

形態素解析の基本

ikawaha
ikawaha
2020.12.14に更新

形態素解析をおこなう

形態素解析の簡単なサンプルを下記に示して、このプログラムに沿って形態素解析の方法を説明します。

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---
すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ

形態素解析器を生成する

形態素解析器を生成します。形態素解析器はスレッドセーフではないので、スレッド毎に生成してください。スレッド毎に生成しても辞書のインスタンスは sigleton になっているのでメモリを無駄に消費することはありません。

	t, err := tokenizer.New(ipa.Dict(), tokenizer.OmitBosEos())
	if err != nil {
		panic(err)
	}

辞書は、辞書パッケージに Dict() というメソッドがあるので、それで指定します。IPADic と UniDIC をサポートしています。必要な辞書パッケージを import してください(必要なら両方を指定ください)。

辞書 ソース package
MeCab IPADIC mecab-ipadic-2.7.0-20070801 github.com/ikawaha/kagome-dict/ipa
UniDIC unidic-mecab-2.1.2_src github.com/ikawaha/kagome-dict/uni

形態素解析器のオプション

形態素解析器を生成する際にオプションを(複数)指定できます。

  • tokenizer.OmitBosEos() : BOS/EOS を解析結果に含めないようにします。
  • tokenizer.UserDict():ユーザー辞書を指定します。
  • tokenizer.Nop():何の影響力もない(No Operation)オプションです。

例:ユーザー辞書が指定されていれば設定する

	udict := tokenizer.Nop()
	if userDict != "" {
		d, err := dict.NewUserDict(userDict)
		if err != nil {
			return err
		}
		udict = tokenizer.UserDict(d)
	}
	t, err := tokenizer.New(ipa.Dict(), udict)
	if err != nil {
		return err
	}

出力

単に分かち書きをしたいのか、形態素の情報を参照して文を分析するための情報を得たいのか、形態素解析をおこなう目的によって結果として得たい出力の粒度は異なってくるでしょう。タスクに応じたメソッドを利用してください。

分かち書き

すもももももももものうちすもも/も/もも/も/もも/の/うち と分割したい場合、分かち書きのメソッドを使うのが便利です。

	seg := t.Wakati("すもももももももものうち")

形態素単位に分割した文字列が配列で返されます。

形態素に分割する

もっとも標準的な形態素解析のメソッドは Tokenize() です。

	tokens := t.Tokenize("すもももももももものうち")

これは下記と同等です。

	tokens := t.Analyze("すもももももももものうち", tokenizer.Normal)

Search モードや、Extended モードで解析する場合は Analyze() メソッドでオプションを指定します。

形態素から情報を得る

形態素解析の結果得られる形態素に付与されている情報を素性と呼びます。形態素に付随するすべての素性は Token#Features() メソッドで取得できるようになっていますが、kagome では、以下の素性についてはそれぞれメソッドを用意して便利に取得できるようにしています。ただし、取得できる情報の意味合いは辞書によって異なることに注意してください。

形態素の素性から用意されたメソッドで取得できる情報を下記に示します。

情報 メソッド 説明
品詞 Token#POS() 4つ組で表される品詞情報を返します eg. ["名詞", "一般", "*", "*"]
原形 Token#BaseForm() 辞書の見出し語形式。eg. 行っ -> 行く
活用型 Token#InflectionalType eg.e.g. 五段・カ行促音便
活用形 Token#InflectionalForm eg. 連用タ接続
読み Token#Reading() ヨミ。eg. 公園 -> コウエン
発音 Token#Pronunciation() eg. 公園 -> コーエン

特別な形態素として BOSEOS があります。これはそれぞれ 文頭(Beginning of Sentence)、文末(End of Sentence)を表しています。kagome では、文頭、文末に必ずこの形態素が付与され、解析した文の目印になります。しかし、たいていの場合この形態素は邪魔なので、不要であれば形態素解析器の生成オプションで OmitBosEos を指定して出力を抑制することが出来ます。