CLOVER🍀

That was when it all began.

CodeLibs Lucene Kuromoji+mecab-ipadic-NEologdを使う

Lucene Kuromoji+mecab-ipadic-NEologdのエントリを見かけるようになりましたが、個人的にちょっと気になるところがありまして。

Maven依存関係にこれを足せば使えるよ、というエントリを見かけますが

<dependency>
    <groupId>org.codelibs</groupId>
    <artifactId>elasticsearch-analysis-kuromoji-neologd</artifactId>
    <version>2.1.1</version>
</dependency>

GitHub - codelibs/elasticsearch-analysis-kuromoji-neologd: Elasticsearch's Analyzer for Kuromoji with Neologd

いや、それ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と変わりませんね。

まとめ

Mavenリポジトリは追加する必要がありますが、Lucene Kuromoji+mecab-ipadic-NEologdをMavenで依存関係を解決する方法で利用することができました。

自分でやる時は、Lucene Kuromoji+mecab-ipadic-NEologdを自分でビルドしちゃうのですが、この形態も用意が楽ですねー。覚えておきましょう。

今回作成したコードは、こちらに置いています。
https://github.com/kazuhira-r/lucene-examples/tree/master/lucene-kuromoji-codelibs-neologd