文字列から名詞を抽出して出現数のランキングを取得したくて(しかも急ぎで)
サクっとできる方法がないかと思い調べてみたらKuromojiを使ったところすごい簡単く出来ました。

Kuromoji

https://www.atilika.com/ja/kuromoji/
https://github.com/atilika/kuromoji

License: Apache License, Version 2.0

私は知りませんでしたが、GitHubのリリース履歴を見る限り、ファーストリリースは2011年なようで歴史あるプロダクトなようです。
Apache Lucene、Apache Solr、Elasticsearhにも使われているようなので信頼性は問題なさそう。

使い方

辞書を内蔵しているのでMavenリポジトリから取得するだけで使えます。 内蔵する辞書によってartifactIdが分かれているのですが、一番オーソドックスなipadicというのを使ってみます。

リポジトリから取得

build.gradleに下記1行追加すると、kuromoji-coreとkuromoji-ipadicというのが落ちてきます。

compile 'com.atilika.kuromoji:kuromoji-ipadic:0.9.0'

サンプルコード

とりあえずシンプルな使い方。Tokenizeクラスをnewしてtokenizeすると形態素に分解されしたリストが取得できます。

public static void main(String[] args) {
    Tokenizer tokenizer = new Tokenizer() ;
    List<Token> tokens = tokenizer.tokenize("すもももももももものうち");
    for (Token token : tokens) {
        System.out.println(token.getSurface() + " - " + token.getAllFeatures());
    }
}

実行結果

意地悪な文章を与えてみましたが、正しくわかち書き出来ました。

すもも - 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も - 助詞,係助詞,*,*,*,*,も,モ,モ
もも - 名詞,一般,*,*,*,*,もも,モモ,モモ
も - 助詞,係助詞,*,*,*,*,も,モ,モ
もも - 名詞,一般,*,*,*,*,もも,モモ,モモ
の - 助詞,連体化,*,*,*,*,の,ノ,ノ
うち - 名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ

別の辞書を使ってみる

Mavenから取得するライブラリと使用するTokenizerクラスを切り替えると別の辞書も簡単に試せます。 本当は新しい言葉に追随しているというkuromoji-ipadic-neologdを使ってみたかったのですが、 Mavenリポジトリに公開されてなかったので、今回は諦めました。

kuromoji-jumandicを試してみましたが、音読み/訓読み、食べ物、料理なども抽出できて使い方によっては面白いことできそうです。

すもも - 名詞,普通名詞,*,*,すもも,すもも,自動獲得:テキスト
も - 助詞,副助詞,*,*,も,も,*
もも - 名詞,普通名詞,*,*,もも,もも,代表表記:桃/もも 漢字読み:訓 カテゴリ:植物;人工物-食べ物 ドメイン:料理・食事
も - 助詞,副助詞,*,*,も,も,*
もも - 名詞,普通名詞,*,*,もも,もも,代表表記:桃/もも 漢字読み:訓 カテゴリ:植物;人工物-食べ物 ドメイン:料理・食事
の - 助詞,接続助詞,*,*,の,の,*
うち - 名詞,副詞的名詞,*,*,うち,うち,代表表記:うち/うち

おわりに

5分は若干脚色している気もしますが、本当に素早くやりたいことが出来ました。
日本語の解析処理は楽しいので、今度は別の辞書も試したい。