目次
Kuromoji-CLI
Rust初心者がRust製の日本語形態素解析器の開発を引き継いでみたという記事にありますが、LinderaというRust製の日本語形態素解析が出てきました。KuromojiのRustクローンみたいなものです。 で、作者の人とのチャットの中で、「MeCabみたいなKuromojiのCLIないですかね?誰か知りませんか?」という話になりました。
自分は普段はKuromojiの確認をするのは、Elasticsearch関連もしくは、Azure Searchなどだったりするので、 当たり前のようにKibanaを立ち上げたり、REST APIを叩いてましたが、たしかにコマンドラインインタフェースあると便利かも? と思い、作ってみるかということに。
picocli
いま、JavaでかんたんなCLI作るとなったら何がおすすめ?
— Jun Ohtani (@johtani) February 26, 2020
で、いつものツイートです。で、picocliという返信がありました。 JavaでCLIのプログラムを書くのが簡単になりそうだと。 ドキュメントもしっかりしてます。サンプルも載ってるし。
Annotationで、コマンドの説明などパラメータ、オプションなどが記述でき、必須チェックなども可能です。
また、オプションの説明文に関しては、テンプレートを用いることで、取りうる値をEnumの値で出力してくれたりといった便利機能まで備わっていました。
GraalVM
また、GRAALVMとPICOCLIでJAVAのネイティブコマンドラインアプリを作ろうというスライドも教えてもらい、ネイティブコマンドまで作れるらしいと。 なんて便利なんでしょう!ってことで、こちらもチャレンジしてみました。 GraalVMがどんなものかはなんとなくは知ってたのですが、何者だろう?とツイートしたところ、これまた返信が。
っ 資料はかなり古いので現行版と乖離はあるけど概念は変わってないので..https://t.co/KRQjhNdD9f
— たむたむ🏫 (@tamtam180) February 26, 2020
本当に、Twitter便利ですね。
GraalVMがどんなものかもいただいた資料でサクッと理解できました。 ただ、picocliが実はものすごく良くできており、自分でインストールする必要も実はありませんでした。
gradle-graalというGradleのプラグインと、 Picocli Code Generationを利用することで、 以下のコマンドを実行することで、ネイティブコマンドアプリが作成できました。
gradle nativeImage
build.gradle
ファイルに記述したのは、以下のような項目です。
- pluginの利用
- picocli-codegenをannotationProcessorとして呼び出し
- jarに関する記述(メインクラスと依存するJarを含める設定)
- ネイティブコマンドの名前とか(gradle-graalの設定)
辞書が読み込めなかった
で、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にするのが手間がかかりそうだった)。 コマンドのポータビリティはそれほど無いと理解してる(あってる?)ので、利用してみたい方は、リポジトリをクローンしてからビルドしてみてください。
参考資料
- kuromoji
- Picocliドキュメント
- Getting Started GraalVM / GraalVM超入門
- 一体何モノなの? GraalVM入門編 / GraalVM for beginners
まだ途中?
ほかにもあると便利かも?という機能があればIssueやPRを上げてください。 とりあえず、頭にあるのは以下のとおりです。
- JSONの出力はまだ未対応
- いろんな辞書をAtilikaのKuromojiはサポートしてるのでそのへんも対応してみる?
comments powered by Disqus
See Also by Hugo
- KuromojiのCLIコマンドにJSON出力とラティス出力を追加
- Corne Chocolateを組み立てた #DIYキーボード
- Morphlines入門?
- Slackボットで音楽検索&再生
- GoでSlackのボットを作った話