CLOVER🍀

That was when it all began.

Atilika Kuromojiに対して、mecab-ipadic-NEologdの辞書を適用してビルドするbashスクリプトを書きました

先日、Atilika Kuromojiの0.9.0がリリースされたようです。

kuromoji - japanese morphological analyzer

オフィシャルサイトの記述は、0.7.7のままですが…

Maven Centralからダウンロードできます。

http://search.maven.org/#search|ga|1|g%3A%22com.atilika.kuromoji%22

はてなで、うまくリンクにならん…。

で、このKuromojiですが、0.7.7の頃はダメだったものの、0.9.0からはmecab-ipadic-NEologdの辞書が適用できるようになったので、mecab-ipadic-NEologdをKuromojiに組み込んでビルドするbashスクリプトを書きました。

以前に作ったLucene Kuromojiにmecab-ipadic-NEologdを組み込んでビルドするスクリプトの、Atilika Kuromoji版です。

Lucene Kuromojiに対して、mecab-ipadic-neologdの辞書を適用してビルドするbashスクリプトを書きました - CLOVER

必要なソフトウェアは、mecab-ipadic-NEologdが要求する以下のもの…

  • C++ Compiler
  • iconv (libiconv)
  • xz

あと、このスクリプトでKuromojiをビルドするのに、以下が必要です。

MeCabとオリジナルのIPA辞書は、なければ勝手にダウンロードしてきてローカルビルドします。インストール済みであれば、そのままそれを使います。

スクリプトは、GitHubに置いています。
https://github.com/kazuhira-r/kuromoji-with-mecab-neologd-buildscript/blob/master/build-atilika-kuromoji-with-mecab-ipadic-neologd.sh

このスクリプトを、ダウンロードしてきて実行権限を付与します。

$ wget https://raw.githubusercontent.com/kazuhira-r/kuromoji-with-mecab-neologd-buildscript/master/build-atilika-kuromoji-with-mecab-ipadic-neologd.sh
$ chmod a+x build-atilika-kuromoji-with-mecab-ipadic-neologd.sh

で、実行します。

$ ./build-atilika-kuromoji-with-mecab-ipadic-neologd.sh

実行時には、こんな感じでビルド時の情報が表示されます。

####################################################################
applied build options.

[MeCab Version]                 ... mecab-0.996
[MeCab IPA Dictionary Version]  ... mecab-ipadic-2.7.0-20070801
[Dictionary CharacterSet]       ... utf-8
[mecab-ipadic-NEologd Tag (-N)] ... master
[Kuromoji Kuromoji Version Tag (-K)]  .. 0.9.0
[Kuromoji Package Name (-p)]    ... com.atilika.kuromoji.ipadic

####################################################################

最終的には、このような結果が表示されます。

[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ kuromoji-ipadic ---
[INFO] Building jar: /xxxxx/kuromoji/kuromoji-ipadic/target/kuromoji-ipadic-0.9.0.jar
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Kuromoji ........................................... SUCCESS [  0.003 s]
[INFO] Kuromoji Core ...................................... SUCCESS [  2.555 s]
[INFO] Kuromoji IPADIC .................................... SUCCESS [06:39 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 06:42 min
[INFO] Finished at: 2015-09-19T11:51:19+09:00
[INFO] Final Memory: 29M/3514M
[INFO] ------------------------------------------------------------------------
-rw-rw-r-- 1 xxxxx xxxxx 86983210  919 11:51 kuromoji-ipadic-neologd-0.9.0-20150918.jar
### [2015-09-19 11:51:20] [main] [INFO] END.

できあがったJARファイルは、こちらです。

-rw-rw-r-- 1 xxxxx xxxxx 86983210  919 11:51 kuromoji-ipadic-neologd-0.9.0-20150918.jar

JARファイル名に入っている日付は、mecab-ipadic-NEologdの辞書の日付です。


試してみます。
sample_ipadic_neologd.groovy

import com.atilika.kuromoji.ipadic.Tokenizer

def texts = ['すもももももももものうち',
             'きゃりーぱみゅぱみゅは、2012年に「つけまつける」でデビュー!',
             '日本経済新聞でモバゲーの記事を読んだ',
             'くりぃむしちゅーは、上田晋也と有田哲平の2人からなる日本のお笑いコンビ',
             '艦隊これくしょんは、角川ゲームスが開発し、DMM.comが配信しているブラウザゲーム']

def tokenizer = new Tokenizer()

texts.each { text ->
  println("$text")
  println('   [' + tokenizer.tokenize(text).collect { it.surface }.join(', ') + ']')
}

実行。

$ groovy -cp kuromoji-core-0.9.0.jar:kuromoji-ipadic-neologd-0.9.0-20150918.jar sample_ipadic_neologd.groovy

結果。

すもももももももものうち
   [すもももももももものうち]
きゃりーぱみゅぱみゅは、2012年に「つけまつける」でデビュー!
   [きゃりーぱみゅぱみゅ, は, 、, 2012年, に, 「, つけまつける, 」, で, デビュー, !]
日本経済新聞でモバゲーの記事を読んだ
   [日本経済新聞, で, モバゲー, の, 記事, を, 読ん, だ]
くりぃむしちゅーは、上田晋也と有田哲平の2人からなる日本のお笑いコンビ
   [くりぃむしちゅー, は, 、, 上田晋也, と, 有田哲平, の, 2, 人, から, なる, 日本, の, お笑いコンビ]
艦隊これくしょんは、角川ゲームスが開発し、DMM.comが配信しているブラウザゲーム
   [艦隊これくしょん, は, 、, 角川ゲームス, が, 開発, し, 、, DMM.com, が, 配信, し, て, いる, ブラウザゲーム]

OKそうですね。

できること

このスクリプトでは、オプションで以下のことが可能です。

  • mecab-ipadic-NEologdのcheckout指定(デフォルトmaster、-Nで変更可)
  • KuromojiのバージョンTag指定(デフォルト0.9.0、-Kで変更可)
  • kuromoji-ipadicのパッケージ名変更(デフォルトcom.atilika.kuromoji.ipadic、-pで変更可)

例えば、パッケージ名を変えるとすると、以下のような指定になります。

$ ./build-atilika-kuromoji-with-mecab-ipadic-neologd.sh -p mykuromoji.ipadic

ビルド時の情報は、このようになります。

####################################################################
applied build options.

[MeCab Version]                 ... mecab-0.996
[MeCab IPA Dictionary Version]  ... mecab-ipadic-2.7.0-20070801
[Dictionary CharacterSet]       ... utf-8
[mecab-ipadic-NEologd Tag (-N)] ... master
[Kuromoji Kuromoji Version Tag (-K)]  .. 0.9.0
[Kuromoji Package Name (-p)]    ... mykuromoji.ipadic

####################################################################

この場合、パッケージ名は「mykuromoji.ipadic」となるので、JARファイルの中身はこのように。

$ jar -tvf kuromoji-ipadic-neologd-0.9.0-20150918.jar 
     0 Sat Sep 19 12:32:22 JST 2015 META-INF/
   133 Sat Sep 19 12:32:20 JST 2015 META-INF/MANIFEST.MF
     0 Sat Sep 19 12:25:06 JST 2015 mykuromoji/
     0 Sat Sep 19 12:32:16 JST 2015 mykuromoji/ipadic/
     0 Sat Sep 19 12:25:06 JST 2015 mykuromoji/ipadic/compile/
 12171 Sat Sep 19 12:25:04 JST 2015 META-INF/LICENSE.md
  4182 Sat Sep 19 12:25:04 JST 2015 META-INF/NOTICE.md
   159 Sat Sep 19 12:25:04 JST 2015 META-INF/CONTRIBUTORS.md
3463720 Sat Sep 19 12:32:10 JST 2015 mykuromoji/ipadic/connectionCosts.bin
111403532 Sat Sep 19 12:32:10 JST 2015 mykuromoji/ipadic/tokenInfoFeaturesMap.bin
  2734 Sat Sep 19 12:32:10 JST 2015 mykuromoji/ipadic/tokenInfoPartOfSpeechMap.bin
  1623 Sat Sep 19 12:32:18 JST 2015 mykuromoji/ipadic/Token.class
  2580 Sat Sep 19 12:32:10 JST 2015 mykuromoji/ipadic/unknownDictionary.bin
  3498 Sat Sep 19 12:32:18 JST 2015 mykuromoji/ipadic/compile/TokenInfoDictionaryCompiler.class
   924 Sat Sep 19 12:32:18 JST 2015 mykuromoji/ipadic/compile/DictionaryCompiler.class
  2256 Sat Sep 19 12:32:18 JST 2015 mykuromoji/ipadic/compile/DictionaryEntry.class
  1226 Sat Sep 19 12:32:18 JST 2015 mykuromoji/ipadic/Tokenizer.class
125928179 Sat Sep 19 12:32:12 JST 2015 mykuromoji/ipadic/doubleArrayTrie.bin
398718 Sat Sep 19 12:32:12 JST 2015 mykuromoji/ipadic/characterDefinitions.bin
  1662 Sat Sep 19 12:32:18 JST 2015 mykuromoji/ipadic/Tokenizer$Builder$1.class
57239640 Sat Sep 19 12:32:16 JST 2015 mykuromoji/ipadic/tokenInfoDictionary.bin
75775412 Sat Sep 19 12:32:18 JST 2015 mykuromoji/ipadic/tokenInfoTargetMap.bin
  4776 Sat Sep 19 12:32:18 JST 2015 mykuromoji/ipadic/Tokenizer$Builder.class
   211 Sat Sep 19 12:32:18 JST 2015 mykuromoji/ipadic/Tokenizer$1.class
     0 Sat Sep 19 12:32:44 JST 2015 META-INF/maven/
     0 Sat Sep 19 12:32:44 JST 2015 META-INF/maven/com.atilika.kuromoji/
     0 Sat Sep 19 12:32:44 JST 2015 META-INF/maven/com.atilika.kuromoji/kuromoji-ipadic/
  7625 Sat Sep 19 12:24:50 JST 2015 META-INF/maven/com.atilika.kuromoji/kuromoji-ipadic/pom.xml
   120 Sat Sep 19 12:32:20 JST 2015 META-INF/maven/com.atilika.kuromoji/kuromoji-ipadic/pom.properties

出力されるJARファイルの名前は変わりません。

良いこと、悪いこと

Lucene Kuromojiとmecab-ipadic-NEologdの組み合わせに対するPros/Consはこんな感じです。

Pros

  • 原型の15文字制限がない(Lucene Kuromojiは、原型が15文字を越えるとエラー)
  • Luceneに依存していない

Cons

  • ビルドが遅い。Lucene Kuromojiの3倍くらいかかる(手元では、6分…)
  • コンパイルするのに、現時点でヒープが4G必要(辞書のエントリ数の増加に伴い、今後も要求するヒープは増えるでしょう)
  • 0.9.0のKuromojiでしか使えない

Atilika Kuromojiは、0.7系以降に大きくモジュール構成が変わっているので、もしかして追従が難しいのかな…と思わないでもないですが。

Lucene Kuromojiのビルドスクリプトも、Luceneの新バージョンが出る度にちょこちょことメンテナンスしているので、こちらも合わせてやっていこうと思います。