RSS2.0

コマンドラインから Sudachi で形態素解析してみる

日本語を品詞に分割する形態素解析器については、以前試してみた Mecab の他に、最近では Sudachi の評判がよいようです。それならばひとまずは触ってみようということで、今日は Sudachi をビルドして日本語の文章を形態素解析してみました。

Sudachi をビルドする

Github にてソースコードが公開されているので、 これを clone してきてビルドしてみます。
$ git clone git@github.com:WorksApplications/Sudachi.git
$ cd Sudachi
リポジトリには辞書をビルドするためのファイルもコミットされているので、サイズはそれなりに大きいです。lex なので字句解析器ですね。辞書自体は UniDic を使っているようで、ビルド時にダウンロードしている様子がビルドログから伺えます。
Sudachi は Maven プロジェクトなので、package ゴールまで実行すればビルドできます。
$ mvn clean package

実際に Sudachi を動かすにはビルドした jar ファイルを叩くのですが、そのままビルドしただけではもろもろの設定が足りていません。必要な設定ファイルのサンプルは src/main/resources/sudachi.jsonsrc/main/resources/sudachi_fulldict.json として置かれているので、これをベースに設定をしていきます。
systemDict 値には Sudachi が利用する辞書のパスを指定します。リポジトリ上では辞書ファイルの名前だけが書かれているので、このパスの辞書にアクセスできるディレクトリで jar ファイルを実行するか、systemDict 値自体を正しく指定し直す必要があります。Sudachi の辞書自体は、ビルドすると target ディレクトリに system_core.dicsystem_full.dic として生成されます。また同時に、圧縮された zip ファイルとしても、sudachi-0.1.1-SNAPSHOT-dictionary-full.zipsudachi-0.1.1-SNAPSHOT-dictionary-core.zip 等としてビルドされていました。

ここでは以下の内容の sudachi_fulldict.json を my_sudachi_config.json という名前でカレントティディレクトリにコピーし、以下の内容に修正しました。
{
    "systemDict" : "target/system_full.dic",
    "inputTextPlugin" : [
        { "class" : "com.worksap.nlp.sudachi.DefaultInputTextPlugin" },
        { "class" : "com.worksap.nlp.sudachi.ProlongedSoundMarkInputTextPlugin",
          "prolongedSoundMarks": ["ー", "-", "⁓", "〜", "〰"],
          "replacementSymbol": "ー"}
    ],
    "oovProviderPlugin" : [
        { "class" : "com.worksap.nlp.sudachi.MeCabOovProviderPlugin" },
        { "class" : "com.worksap.nlp.sudachi.SimpleOovProviderPlugin",
          "oovPOS" : [ "補助記号", "一般", "*", "*", "*", "*" ],
          "leftId" : 5968,
          "rightId" : 5968,
          "cost" : 3857 }
    ],
    "pathRewritePlugin" : [
        { "class" : "com.worksap.nlp.sudachi.JoinNumericPlugin",
          "joinKanjiNumeric" : true },
        { "class" : "com.worksap.nlp.sudachi.JoinKatakanaOovPlugin",
          "oovPOS" : [ "名詞", "普通名詞", "一般", "*", "*", "*" ],
          "minLength" : 3
        }
    ]
}
書き換えたのは systemDict 値のパスを target ディレクトリ下にしただけです。

Sudachi を動かしてみる

設定ファイルまで用意できれば、あとはさらっと実行できました。
実行コマンドは以下の通りです。
$ echo 今夜のご飯は納豆ご飯とお味噌汁の予定です | java -jar target/sudachi-0.1.1-SNAPSHOT.jar -r my_sudachi_config.json
今夜	名詞,普通名詞,副詞可能,*,*,*	今夜
の	助詞,格助詞,*,*,*,*	の
ご飯	名詞,普通名詞,一般,*,*,*	御飯
は	助詞,係助詞,*,*,*,*	は
納豆	名詞,普通名詞,一般,*,*,*	納豆
ご飯	名詞,普通名詞,一般,*,*,*	御飯
と	助詞,格助詞,*,*,*,*	と
お	接頭辞,*,*,*,*,*	御
味噌汁	名詞,普通名詞,一般,*,*,*	味噌汁
の	助詞,格助詞,*,*,*,*	の
予定	名詞,普通名詞,サ変可能,*,*,*	予定
です	助動詞,*,*,*,助動詞-デス,終止形-一般	です
EOS
一般的な品詞しか含まない日本語文章では、この通りしっかり形態素解析できました。

設定ファイルがない場合のエラー

ビルドしたままの jar を実行しようとすると、おそらく辞書が参照できずにエラーになると思います。
$ echo 今夜のご飯は納豆ご飯とお味噌汁の予定です | java -jar target/sudachi-0.1.1-SNAPSHOT.jar 
Exception in thread "main" java.io.FileNotFoundException: system_core.dic (No such file or directory)
	at java.io.FileInputStream.open0(Native Method)
	at java.io.FileInputStream.open(FileInputStream.java:195)
	at java.io.FileInputStream.<init>(FileInputStream.java:138)
	at java.io.FileInputStream.<init>(FileInputStream.java:93)
	at com.worksap.nlp.sudachi.JapaneseDictionary.readSystemDictionary(JapaneseDictionary.java:106)
	at com.worksap.nlp.sudachi.JapaneseDictionary.<init>(JapaneseDictionary.java:71)
	at com.worksap.nlp.sudachi.JapaneseDictionary.<init>(JapaneseDictionary.java:56)
	at com.worksap.nlp.sudachi.DictionaryFactory.create(DictionaryFactory.java:44)
	at com.worksap.nlp.sudachi.SudachiCommandLine.main(SudachiCommandLine.java:135)
README.md をよくよく読むと、-r オプションによる設定ファイルの指定方法までは書いてあるものの、systemDict 値の設定等については記述されていないため、すこしつまづきました。
  Sudachi  コメント (0)  2018/10/04 20:41:21


公開範囲:
プロフィール HN: ももかん
ゲーム作ったり雑談書いたり・・・していた時期が私にもありました。
カレンダー
<<2018, 12>>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345