Scala
kuromoji

kuromojiとicuを使って漢字、ひらがな、ローマ字変換する

elasticsearchとかsolrでお世話になるkuromojiですがこんな使い方もできました。

import com.atilika.kuromoji.ipadic.Token
import com.atilika.kuromoji.ipadic.Tokenizer
import scala.collection.JavaConversions._

val tokenizer: Tokenizer = new Tokenizer()
tokenizer.tokenize("今日の晩ご飯はお豆腐").map(_.getReading()).mkString

実行結果

res: String = キョウノバンゴハンハオトウフ

ただ変な(?)日本語入れるとToken#getReading()が*を返します。

tokenizer.tokenize("イエに帰る").map(_.getReading()).mkString

実行結果

res: String = *ニカエル

なので*の場合はToken#getSurface使うようにしてみました。

tokenizer.tokenize("イエに帰る").map { token => if (token.getReading == "*")  token.getSurface else token.getReading }.mkString

せっかくカタカナにできたのでひらがなに変換してみます。
icu使うと簡単です。

import com.ibm.icu.text._

val kataToHira = Transliterator.getInstance("Katakana-Hiragana")
kataToHira.transliterate("キョウノバンゴハンハオトウフ")

実行結果

res: String = きょうのばんごはんはおとうふ

ですが長音ある場合はちょっと困った動作になります。。。
scala
kataToHira.transliterate("スーパーマーケット")

実行結果
res: String = すうぱあまあけっと

これが望む答えの場合もあるんでしょうが、、個人的に長音はそのままそっとしておいてほしいのでこんなことをしました。

"スーパーマーケット".split("ー").map { kataToHira.transliterate }.mkString("ー")

実行結果

res: String = すーぱーまーけっと

最後にひらがなをローマ字にしてみます。

val hiraToLatin = Transliterator.getInstance("Hiragana-Latin")
hiraToLatin.transliterate("きょうのごはんはおとうふ")

実行結果

res: String = kyounogohanhaotoufu

まとめたものはこちら