Sudachi

Sudachi は Java で書かれたオープンソースの日本語形態素解析器です。 ワークス徳島人工知能NLP研究所により提供されているソフトウェアの1つです。 なお、Python版の SudachiPy もあります。

Sudachi の導入

Maven の利用

プロジェクト管理ツールである Maven が利用可能な状態であれば、 設定ファイルである pom.xml の dependencies 要素内に以下を追記し、上書き保存します。 これにより、依存関係のある全てのライブラリがプロジェクトに登録されます。

<dependency>
    <groupId>com.worksap.nlp</groupId>
    <artifactId>sudachi</artifactId>
    <version>0.5.3</version>
</dependency>

次に辞書をダウンロードし、プロジェクトのフォルダの直下 (pom.xml と同じ位置) に置きます。 Sudachi には3種類の辞書があります。

用途に応じて Core か Full を選び、以下からダウンロードします。

デフォルトの Core をダウンロードして展開すると system_core.dic が現れます。これを配置します。

なお、Full を選んだ場合には展開すると system_full.dic が現れます。 この場合にはデフォルトと辞書のファイル名が異なるため、 辞書のファイル名を記述した json 形式の設定ファイルを用意してプロジェクトのフォルダの直下に置く必要があります。 (試すだけなら、system_full.dic を system_core.dic にリネームして配置すれば動きます)

Windows で編集する場合、TeraPad では文字化けするのでメモ帳で編集しましょう。

Sudachi の利用

Sudachi は Java のクラスライブラリですので、クラス・インタフェースなどの仕様は javadoc で確認しましょう。

Sudachi で主に使うインタフェースは、辞書を表す Dictionary、形態素解析を担当する Tokenizer、形態素を表す Morpheme です。

Dictionary

辞書を表す Dictionary のインスタンスは、DictionaryFactory.create メソッドにより生成します。 system_core.dic 以外の辞書を使う場合には、このメソッドの引数に設定ファイルを与えます。

Dictionary dictionary = null;
try {
	// 設定ファイル sudachi.json を用意されている場合にはそれを読み込む
	Path settings = Paths.get("sudachi.json");
	if(Files.exists(settings)) {
		System.out.println("設定ファイルに従って辞書を読み込みます...");
		dictionary = new DictionaryFactory().create(Files.readString(settings));
	}
	else {
		dictionary = new DictionaryFactory().create();
	}
}
catch(Exception e) {
	System.err.println("辞書が読み込めません: " + e);
	System.exit(-1);
}

Tokenizer

形態素解析を担当する Tokenizer のインスタンスは、Dictionary インタフェースの create メソッドにより生成します。

Tokenizer tokenizer = dictionary.create();

Tokenizer は文字列を形態素のリストに分割します。 Sudachi には 3つの分割モードがあり、複合名詞(単名詞・接頭語・接尾語の連続)の分割方法が異なります。

A 情報/検索
B 情報/検索
C 情報検索

A 東京/電機/大学
B 東京/電機/大学
C 東京電機大学

A 未来/科学/部      ※「部」の品詞は「名詞-普通名詞-助数詞可能」  1部,2部、という使い方もできる
B 未来/科学部       
C 未来科学部

分割モードは、分割モード A,B,C を表す定数 Tokenizer.SplitMode.A, Tokenizer.SplitMode.B, Tokenizer.SplitMode.C を用いて指定します。

形態素解析器を表す Tokenizer インタフェース の主なメソッド
List<Morpheme> tokenize(String text) 1文である text を分割モード C (Tokenizer.SplitMode.C) で形態素解析し、形態素リストを返す
List<Morpheme> tokenize(Tokenizer.SplitMode mode, String text) 1文である text を分割モード mode で形態素解析し、形態素リストを返す
Iterable<List<Morpheme>> tokenizeSentences(String text) 複数文からなる text を分割モード C (Tokenizer.SplitMode.C) で形態素解析し、文ごとの形態素リストを返す
Iterable<List<Morpheme>> tokenizeSentences(Tokenizer.SplitMode mode, String text) 複数文からなる text を分割モード mode で形態素解析し、文ごとの形態素リストを返す

String ではなく Reader を引数に取るメソッドもあります。

Iterable<T> インタフェースは、数え上げることができるものを表します。拡張for文で順に取り出すことができます。 この場合、複数文の各文がそれぞれ形態素リストになっているので、その文ごとのリストを順に取り出すことができます。

for(List<Morpheme> list: tokenizer.tokenizeSentences(Tokenizer.SplitMode.C, text)) {
	for(Morpheme morpheme: list) {
		System.out.println(
			  morpheme.surface() + "\t"        // 表層形
			+ morpheme.partOfSpeech().get(0)   // 品詞1
		);
	}
}

Morpheme

Tokenizer により文字列を分割して得られた個々の形態素から、品詞などの情報を得ることができます。

形態素を表す Morpheme インタフェース の主なメソッド
String surface() 表層形 (元の文字列表現)
String dictionaryForm() 終止形 (原形, 基本形, 見出し語)
List<String> partOfSpeech() 品詞1・品詞2・品詞3・品詞4・活用型・活用形のリスト (先頭から順に分類が細かくなっていく)
String readingForm() フリガナ (読みのカタカナ表記)
String normalizedForm() 正規化表記 (表記揺れを正規化したもの)
List<Morpheme> split(Tokenizer.SplitMode mode) 別の分割モード mode による形態素リストに分割

品詞のリストは ArrayList と同じ List インタフェースを実装していますので、get, size などのメソッドや拡張for文が使えます。

サンプルプログラム

フィードの description 要素のテキストを形態素解析します。

DescriptionAnalyzerSudachi.java