コマンドラインから 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.json、src/main/resources/sudachi_fulldict.json として置かれているので、これをベースに設定をしていきます。systemDict
値には Sudachi
が利用する辞書のパスを指定します。リポジトリ上では辞書ファイルの名前だけが書かれているので、このパスの辞書にアクセスできるディレクトリで jar
ファイルを実行するか、systemDict
値自体を正しく指定し直す必要があります。Sudachi
の辞書自体は、ビルドすると target
ディレクトリに system_core.dic
、system_full.dic
として生成されます。また同時に、圧縮された zip
ファイルとしても、sudachi-0.1.1-SNAPSHOT-dictionary-full.zip
、sudachi-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