かわみのメモ帳

趣味に関するメモを書いていきます。

形態素解析器「Sudachi」をJavaで使ってみた

おはようございます。かわみです。
いやー、今年もこの時期になると非常に体が冷えます。

まもなく冬至ですが、ゆず湯なんて良いですよね。
柚といえば、アイド柑橘類。柑橘類には他にみかんなどがありますが、その中でもすだちとかぼすを混同してしまうのが私です。

ということで、本日はすだちのほうを紹介します。
といっても、果物ではなく形態素解析器なので、果物のすだちを知りたい方はWikipediaへどうぞ。

「Sudachi」とは

形態素解析器「Sudachi」はワークスアプリケーションズ徳島人工知能NLP研究所の開発する形態素解析器です。

github.com

個人的に気になった特徴は、分割単位を3種類から選択できる点と、「シュミレーション」を「シミュレーション」に直してくれるなどの正規化辺りですかね。 詳しい説明は上記に書いてあるので、それを参照していただくとして。
このSudachiですが、Java実装なので、そのままJava内で使えるわけです。
したがって、それを試みます。

Sudachiを導入してみた

(2018/01/30追記)楽したい人向け

Releases · WorksApplications/Sudachi · GitHub

辞書もコードもここから簡単に落とせます。楽したい人はこの先の説明を読み飛ばしましょう。

楽したくない人向け

qiita.com このあたりの先人の知恵を借りながら進めていたわけなんですが、最新版だからかエラーが。

GitHubから(12/17現在の)最新版をクローンしたわけですが、pom.xmlの記述が変わっているからか、mvn packageで躓きました。
Eclipseで赤線の引かれている箇所をいろいろと直したり、DictionaryBuilder実行時のargumentの数を減らしたりしたら上手くいきました。
ただ実質前のバージョンに記述を戻した形となるため、前のバージョンだとそんなことしなくても良い気がする。試してみてダメだったらバージョンを落として取得してみたらいいのかも。

そんなこんなでsystem_core.dicが作成され、使うプロジェクトの直下に置きました。

Javaで使う

SudachiCommandLineクラスのメインメソッドを参考にしました。

String settings = readAll("sudachi.json");  // readAllはテキストファイルの中身を読み込むメソッド
try (Dictionary dict = new DictionaryFactory().create(settings)) {
    Tokenizer tokenizer = dict.create();
    String line = "コミニュケーションをシュミレーションしろ。";
    List<Morpheme> tokens = tokenizer.tokenize(Tokenizer.SplitMode.C, line);
    for (Morpheme morpheme : tokens) {
        System.out.println(morpheme.surface() + "\t" + morpheme.normalizedForm() + "\t" + morpheme.partOfSpeech());
    } 
} catch (IOException e) {
    e.printStackTrace();
}

上記は分割モードCです。これで動きました。
出力結果はこんな感じです。

f:id:kawamix:20171217183810p:plain

現段階でどれくらいの語彙に対応しているのか気になるところですが、正規化すごいですね。
そして辞書はUniDicとNEologdの一部が使われているということで、おなじみ「なのは」チャレンジも試してみました。

f:id:kawamix:20171217183701p:plain

f:id:kawamix:20171217183923p:plain

人名として登録されているので、人名らしくない使い方がされている文では変な感じになります。
ただしユーザ辞書の追加も出来るので、その辺りはユーザ側で調整できるでしょう。DictionaryBuilderクラスのJavadocに詳細が書かれています。(2018/01/21追記)UserDictionaryBuilderクラスでした。そのうち記事にするかも。

おわりに

分割単位の切り替えや正規化に関して、ここまで(Javaで)使いやすい形態素解析器があっただろうか(反語)。
まだお遊び程度にしか触っていませんが、今後真面目な場面で機会があれば使ってみたいと思う次第でございます。
以上、Sudachiを紹介してきましたが、すだちとかぼすの違いはお分かりいただけましたか。私はやっぱりよく分かりません。

余談

またsystem_full.dicなるものも生成されていたので、それに切り替えて試してもみました。

f:id:kawamix:20171217184730p:plain

NEologdの香りを感じる。