オープンソースの検索エンジン Apache Lucene のテキスト解析部に、 Java で書かれた日本語形態素解析エンジン Kuromoji が採用されています。
ここでは、Apache Lucene のテキスト解析用クラスを介して、 Kuromoji により形態素解析をする方法を紹介します。
Kuromoji の jar ファイルには形態素解析用辞書が組み込まれています。 ここでは、IPAdic-NEologd という辞書が組み込まれている jar ファイルを利用します。
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 要素を XPath で抜き出して形態素解析します。
DescriptionAnalyzerLuceneKuromoji.java
Yahoo! ニュースの注目記事のフィード(RSS)を取得し、記事タイトルを形態素解析します。title 要素を正規表現で抜き出しています。
TitleAnalyzerLuceneKuromoji.java
この例は DOM を使っていないのでシンプルですが、 別の要素も取りたくなるとかえって面倒になるので、 はじめから DOM を使うことをおすすめします。