Lucene Kuromoji

オープンソースの検索エンジン Apache Lucene のテキスト解析部に、 Java で書かれた日本語形態素解析エンジン Kuromoji が採用されています。

ここでは、Apache Lucene のテキスト解析用クラスを介して、 Kuromoji により形態素解析をする方法を紹介します。

ソフトウェアの構成

Kuromoji の jar ファイルには形態素解析用辞書が組み込まれています。 ここでは、IPAdic-NEologd という辞書が組み込まれている jar ファイルを利用します。

インストール

  1. 辞書 NEologd が組み込まれた Kuromoji の jar ファイルの最新版を適当な場所にダウンロードする。 ダウンロードした版の version 部分を確認する。8.2.0-20200120 なら 8.2.0。
  2. Apache Lucene の 1. に対応した version をダウンロードし、適当な場所に展開する。
  3. 1,2 でダウンロードした以下の jar ファイルを eclipse のプロジェクトのフォルダ内のどこかにコピーして配置 プロジェクト名を右クリック → インポート → ファイルシステム → jar のあるフォルダを指定 → ファイルにチェック
  4. プロジェクト内に配置した 3つの jar ファイルをそれぞれクラスパスに追加
    「プロジェクト」メニュー → プロパティ → Java のビルド・パス → 「ライブラリー」タブ → 「クラスパス」をクリックして選択 → 「JARの追加」ボタン → プロジェクト内に配置された jar ファイル 1つを選択
    (ファイルが存在するのに現れないときは「ファイル」メニュー → リフレッシュ)

主なクラスとその使い方

Apache Lucene のテキスト解析部には、形態素解析を担当する Tokenizer と、その結果にフィルタを掛けたりする Analyzer の 2つのクラスがあります。 日本語に対応したものは、それぞれ、JapaneseTokenizer, JapaneseAnalyzer です。 ここではシンプルに JapaneseTokenizer のみを使うことにします。

Tokenizer は入力文字列をトークンの列に分解します。 個々のトークンから、あらかじめ指定したトークン属性を取り出すことができます。

汎用的なトークン属性: org.apache.lucene.analysis.tokenattributes
CharTermAttribute 表層形 (元の文字列表現; term text)
OffsetAttribute 入力文字列中のトークンの位置
日本語向けのトークン属性 (Kuromoji固有): org.apache.lucene.analysis.ja.tokenattributes
PartOfSpeechAttribute 品詞・品詞細分類
InflectionAttribute 活用型・活用形
BaseFormAttribute 原形 (基本形, 見出し語)
ReadingAttribute 読み・発音

関連するクラスを import する際に、 汎用的なトークン属性については Lucene のものを import しますが、 日本語向けのトークン属性や Tokenizer 等については、 Lucene 同梱のものではなく、IPAdic-NEologd のパッケージのものを import します。

import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
import org.codelibs.neologd.ipadic.lucene.analysis.ja.JapaneseTokenizer;
import org.codelibs.neologd.ipadic.lucene.analysis.ja.tokenattributes.BaseFormAttribute;
import org.codelibs.neologd.ipadic.lucene.analysis.ja.tokenattributes.InflectionAttribute;
import org.codelibs.neologd.ipadic.lucene.analysis.ja.tokenattributes.PartOfSpeechAttribute;
import org.codelibs.neologd.ipadic.lucene.analysis.ja.tokenattributes.ReadingAttribute;

形態素解析するには、まず JapaneseTokenizer のインスタンスを生成します。

// 形態素解析器の用意
JapaneseTokenizer tokenizer = new JapaneseTokenizer(null, false, JapaneseTokenizer.Mode.NORMAL);

次に、解析の際に取得したい属性情報を JapaneseTokenizer に教えます。 以下の例では、表層形(単語そのもの)と品詞の情報を指定しています。

CharTermAttribute term = tokenizer.addAttribute(CharTermAttribute.class);
PartOfSpeechAttribute partOfSpeech = tokenizer.addAttribute(PartOfSpeechAttribute.class);

JapaneseTokenizer は Reader を使って入力テキストを得ます。 入力が文字列の場合 StringReader を利用することができます。 形態素解析前に、JapaneseTokenizer を一度 reset() します。

String text = "解析対象の文字列";
tokenizer.setReader(new StringReader(text));
tokenizer.reset();

入力文字列が形態素解析されるとトークン列になりますが、 そのトークンを先頭から順に見ていきます。 incrementToken() を呼び出すたびに、先頭から順に注目トークンが移動していきます。 属性の各オブジェクトからは、そのとき注目しているトークンの属性が得られます。

while (tokenizer.incrementToken()) {
	System.out.println(term + "\t" +  partOfSpeech.getPartOfSpeech());
}
tokenizer.close();

上記のコードでは term.toString() が自動的に呼ばれていることに注意しましょう。 最後に tokenizer を close() します。

サンプルプログラム

フィードの description 要素を形態素解析

フィードの description 要素に入っているテキストを形態素解析します。 多くのサイトでは、description 要素に記事本文の先頭部分が入っています。 description 要素を XPath で抜き出して形態素解析します。

DescriptionAnalyzerLuceneKuromoji.java

Yahoo! ニュースの記事タイトルを形態素解析

Yahoo! ニュースの注目記事のフィード(RSS)を取得し、記事タイトルを形態素解析します。title 要素を正規表現で抜き出しています。

TitleAnalyzerLuceneKuromoji.java

この例は DOM を使っていないのでシンプルですが、 別の要素も取りたくなるとかえって面倒になるので、 はじめから DOM を使うことをおすすめします。