Kuromojiと辞書ファイルを利用して形態素解析を行う

SOLDOUT2市場情報を開発しているのですが、ある日作業名から商品名を探したくなる事がありました。

商品名→作業名を探し出すのは簡単なのですが、

作業名→商品名を探し出すのは難しいです。

例えば『革の盾』から『革の盾を作成する』を探すのならcontainsを使えば済みますが、

『革の盾を作成する』から『革の盾』を見つける事は出来ません。

そこで形態素解析を利用して『革の盾を作成する』から『革の盾』という単語を抽出してきます。

利用環境

Spring boot 2.0.0

Kuromoji 0.9.0

事前準備(Gradle)

// https://mvnrepository.com/artifact/com.atilika.kuromoji/kuromoji-ipadic
compile group: 'com.atilika.kuromoji', name: 'kuromoji-ipadic', version: '0.9.0'

利用方法

とりあえずサンプル通りに動かしてみます。

Tokenizer.Builder builder = new Tokenizer.Builder();
builder.mode(TokenizerBase.Mode.SEARCH);
Tokenizer tokenizer = builder.build();
for (Token token : tokenizer.tokenize("革の盾を作成する")) {
    System.out.println(token.getSurface() + "\t" + token.getAllFeatures());
}

と、まぁ、『革の盾』まで綺麗に分割されてしまいます。

これでは使うことが出来ませんので、辞書を使って解決したいと思います。

辞書ファイルの作成

CSVファイルで対応します。

単語,解析後の単語,フリガナ,品詞

なので、

革の盾,革の盾,カワノタテ,商品名

と保存して、プログラムから読み込ませます。

今回は『item_dic.csv』として保存しました。

辞書ファイルをKuromojiに読ませる

辞書ファイルは事前にプロジェクト直下にでも置いてあげて下さい。

以下で読み込ませる事が出来ます。

builder.userDictionary(ClassLoader.getSystemResourceAsStream("item_dic.csv"));

builderで辞書を噛ませた後、先程と同じ様に結果を出力させます。

これで『革の盾を作成する』から『革の盾』を抽出することが出来ました。

ちなみにSpringFrameworkで辞書ファイルを読み込む場合、

上記方法では読み込むことが出来ませんのでこちらを参照して下さい。