Kuromojiのneologd辞書を利用して、Pure JVMで最新の形態素解析を行うものである。
非Linux系のOSではそもそもMeCabのインストールが困難などの問題があり、JVMで動作する形態素解析エンジンが求められている。
そのような背景のもと、Kuromojiの形態素解析系をKotlinに移植する。
- Oracle Java Development Kit version8(Open JDK8でも可)
- Kotlin 1.1.1(>)
- Bash
- 十分なJava Heap Memory Size(3GB以上)
Kuromojiの辞書のデータの持ち方は、jarファイルに直接、取り込んでいるスタイルなのでclasspath追加することで、neologdの利用が可能になる。
プログラムのダウンロード
$ git clone https://github.com/GINK03/kotlin-kuromoji-neologd-driver.git
ディレクトリの移動
$ cd kotlin-kuromoji-neologd-driver
Kuromojiのjarファイルのダウンロード
$ sh download_kuromoji_jars.sh
コンパイル
$ sh compile.morpheme.sh
$ echo "今日はどうしました、旗振る子リス" | sh run.morpheme.sh stream
今日 は どう し まし た 、 旗 振る 子 リス
上記の例では、echoでstdinに入力しているが、cat ${ファイル名} | sh run.morpheme.st streamなどでも処理可能。
import java.io.BufferedReader
import java.io.InputStreamReader
import com.atilika.kuromoji.ipadic.neologd.Tokenizer
import com.atilika.kuromoji.ipadic.neologd.Token
import com.atilika.kuromoji.ipadic.Tokenizer.Builder
import java.util.stream.Collectors
fun streaming() {
val tokenizer = Tokenizer()
val sentences = BufferedReader(InputStreamReader(System.`in`)).lines().map { input ->
val ret = tokenizer.tokenize(input).map { x ->
Pair(x.getSurface(), x.getAllFeatures())
}.map { x ->
val (term, feats) = x
term
}.toList<String>()
ret
}.collect(Collectors.toList())
//出力
sentences.map { x ->
x.joinToString(" ")
}.map { line ->
println(line)
}
}
fun sample() {
val tokenizer = Tokenizer()
val input = """これはサンプルです。
適切なモードを選択して使用してください。"""
tokenizer.tokenize(input).map { x ->
val (term, feats) = Pair(x.getSurface(), x.getAllFeatures())
println("${term}, ${feats}")
}
}
fun main(args: Array<String> ) {
val MODE = args.getOrElse(0) { "sample" }
when(MODE) {
"sample" -> { sample()
println("""[stream]: stdinからの入力を分かち書きします """)
}
"stream" -> streaming()
}
}