Lucene Kuromoji+mecab-ipadic-NEologdのエントリを見かけるようになりましたが、個人的にちょっと気になるところがありまして。
Maven依存関係にこれを足せば使えるよ、というエントリを見かけますが
<dependency> <groupId>org.codelibs</groupId> <artifactId>elasticsearch-analysis-kuromoji-neologd</artifactId> <version>2.1.1</version> </dependency>
いや、それElasticsearchまで入ってるじゃないですか。
Lucene Kuromoji素に近い部分で、使いじゃないですか。
と思ったわけですよ(自分だけ?)。
というわけで、単体で使うことを考えまして。elasticsearch-analysis-kuromoji-neologdのpom.xmlに書かれている依存関係を見ると、Lucene Kuromoji+mecab-ipadic-NEologdの部分は以下が該当します。
<dependency> <groupId>org.codelibs</groupId> <artifactId>lucene-analyzers-kuromoji-ipadic-neologd</artifactId> <version>${kuromoji-ipadic-neologd.version}</version> </dependency>
個人的に、気になるライブラリでもあったので試してみることにしました。
準備
ここからはScalaで書き出しますが、気にせぬよう。
build.sbtは、以下のように定義。
resolvers += "CodeLibs Repository" at "http://maven.codelibs.org/" libraryDependencies ++= Seq( "org.codelibs" % "lucene-analyzers-kuromoji-ipadic-neologd" % "5.3.1-20151231", "org.scalatest" %% "scalatest" % "2.2.6" % "test" )
リポジトリとして、「http://maven.codelibs.org/」を追加します。
ここですね。
http://maven.codelibs.org/org/codelibs/lucene-analyzers-kuromoji-ipadic-neologd/
また、バージョンの「5.3.1-20151231」のうち、「5.3.1」はLuceneのバージョン、「20151231」はNEologdの辞書の日付を表す、と。
これを見て、Elasticsearchの使うApache Luceneのバージョンは、5.3.1なんだなぁと…。
ScalaTestは、テストコード用です。
使ってみる
それでは、CodeLibsのLucene Kuromoji+mecab-ipadic-NEologdを使ったコードを書いてみます。
src/test/scala/org/littlewings/lucene/KuromojiCodelibsNeologdSpec.scala
package org.littlewings.lucene import org.apache.lucene.analysis.tokenattributes.CharTermAttribute import org.codelibs.neologd.ipadic.lucene.analysis.ja.JapaneseAnalyzer import org.scalatest.{FunSpec, Matchers} class KuromojiCodelibsNeologdSpec extends FunSpec with Matchers { describe("Kuromoji Codelibs Neologd Spec") { it("simple usage.") { val targetWord = "ゲスの極み乙女。もモーニング娘。も問題なく分割できます。" val analyzer = new JapaneseAnalyzer val tokenStream = analyzer.tokenStream("", targetWord) val charTermAttr = tokenStream.addAttribute(classOf[CharTermAttribute]) tokenStream.reset() val tokens = Iterator .continually(tokenStream.incrementToken()) .takeWhile(identity) .map(_ => charTermAttr.toString) .toVector tokenStream.end() tokenStream.close() tokens should contain inOrderOnly("ゲスの極み乙女。", "モーニング娘。", "問題", "分割") } } }
JapaneseAnalyzerのクラス名が「org.codelibs.neologd.ipadic.lucene.analysis.ja.JapaneseAnalyzer」となっていますが、使い方はLucene Kuromojiと変わりませんね。