KuromojiのCLIコマンドとpicocliとGraalVM

Posted by johtani on Friday, February 28, 2020

目次

Kuromoji-CLI

Rust初心者がRust製の日本語形態素解析器の開発を引き継いでみたという記事にありますが、LinderaというRust製の日本語形態素解析が出てきました。KuromojiのRustクローンみたいなものです。 で、作者の人とのチャットの中で、「MeCabみたいなKuromojiのCLIないですかね?誰か知りませんか?」という話になりました。

自分は普段はKuromojiの確認をするのは、Elasticsearch関連もしくは、Azure Searchなどだったりするので、 当たり前のようにKibanaを立ち上げたり、REST APIを叩いてましたが、たしかにコマンドラインインタフェースあると便利かも? と思い、作ってみるかということに。

picocli

で、いつものツイートです。で、picocliという返信がありました。 JavaでCLIのプログラムを書くのが簡単になりそうだと。 ドキュメントもしっかりしてます。サンプルも載ってるし。

Annotationで、コマンドの説明などパラメータ、オプションなどが記述でき、必須チェックなども可能です

また、オプションの説明文に関しては、テンプレートを用いることで、取りうる値をEnumの値で出力してくれたりといった便利機能まで備わっていました。

GraalVM

また、GRAALVMとPICOCLIでJAVAのネイティブコマンドラインアプリを作ろうというスライドも教えてもらい、ネイティブコマンドまで作れるらしいと。 なんて便利なんでしょう!ってことで、こちらもチャレンジしてみました。 GraalVMがどんなものかはなんとなくは知ってたのですが、何者だろう?とツイートしたところ、これまた返信が。

本当に、Twitter便利ですね。

GraalVMがどんなものかもいただいた資料でサクッと理解できました。 ただ、picocliが実はものすごく良くできており、自分でインストールする必要も実はありませんでした。

gradle-graalというGradleのプラグインと、 Picocli Code Generationを利用することで、 以下のコマンドを実行することで、ネイティブコマンドアプリが作成できました。

gradle nativeImage

build.gradleファイルに記述したのは、以下のような項目です。

辞書が読み込めなかった

で、native imageを作って実行しましたが、Kuromojiが内包している辞書ファイルが読み込めませんでした。 どうやら、picocli-codegenの自動生成では対応できない、リソース関連設定が必要らしいと。

picocli-godegenの設定を見ていて見つけたのが、other.resource.patternsというオプションでした。

kuromoji-cliのbuild.gradleに、その設定を加えたら辞書が読み込めるようになりました。

この設定をどうやって書くのか?というのを探すのにちょっと時間がかかりました。Picocli作者のRemko Popmaさんのサンプルリポジトリに設定を利用したbuild.gradleがありました。サンプル本当にありがたいですね。

完成

出来上がったのは、kuromoji-cliというリポジトリになります。 内部で利用しているのはAtilikaのKuromojiです。LuceneのKuromojiではないのでご注意を(LuceneのKuromojiで最初やってみたのですが、リフレクションなどが多用されてて、Single Imageにするのが手間がかかりそうだった)。 コマンドのポータビリティはそれほど無いと理解してる(あってる?)ので、利用してみたい方は、リポジトリをクローンしてからビルドしてみてください。

参考資料

まだ途中?

ほかにもあると便利かも?という機能があればIssueやPRを上げてください。 とりあえず、頭にあるのは以下のとおりです。

  • JSONの出力はまだ未対応
  • いろんな辞書をAtilikaのKuromojiはサポートしてるのでそのへんも対応してみる?

comments powered by Disqus