文字列から名詞を抽出して出現数のランキングを取得したくて(しかも急ぎで)
サクっとできる方法がないかと思い調べてみたら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分は若干脚色している気もしますが、本当に素早くやりたいことが出来ました。
日本語の解析処理は楽しいので、今度は別の辞書も試したい。