初めに
これまでSudachi辞書のビルドはCLIのみサポートしていたのですが、Sudachi Javaの0.6.0以降はAPIが存在しています。アプリケーションでユーザー辞書を使うときなどに、動的に辞書をコンパイルすることができるようになりました。
紹介するAPIはExperimentalです。1.0リリースまで変更する可能性があります。紹介するコードは変更なしで動くでしょうが、それ以外のメソッドは変更される可能性が高いです。
システム辞書をビルドしましょう
まずは辞書ソースのCSVをダウンロードしてください。small, core, fullで複数のファイルを使う場合は同じバージョンのCSVファイルを使ってください。
システム辞書
このAPIはcom.worksap.nlp.sudachi.dictionary.build.DicBuilder
によって実装されています。ビルダーAPIはFluent APIの思想で作られています。最終的にbuild()
の関数を呼ぶとバイナリーの辞書が提供されたSeekableByteChannel
に出力されます。
Sudachiのcore辞書相当をビルドするには、以下のコードのようにします。
DicBuilder.System bldr = DicBuilder.system()
.matrix(Path.of("/path/to/matrix.def")) // ここは matrix.def のパスを指定
.lexicon(Path.of("/path/to/small.lex.csv")) // 辞書データをCSV形式で渡す
.lexicon(Path.of("/path/to/core.lex.csv")); // 複数を渡すのも可能
// バイナリー辞書をコンパイルする
try (SeekableByteChannel result = Files.newByteChannel(Path.of("sudachi_core.dic"),
StandardOpenOption.WRITE, StandardOpenOption.CREATE)) {
bldr.build(result);
}
ユーザー辞書
ユーザー辞書のビルドはDicBuilder.user
の関数でビルダーを作ります。
DicBuilder.User builder = DicBuilder.user(dic)
.lexicon(Path.of("/path/to/user.lex.csv"));
コンパイルの仕方はシステム辞書と一緒です。
ユーザー辞書のビルダーを作るには、システム辞書を提供する必要があります。現在渡せるものは2つあり、BinaryDictionary
とJapaneseDictionary
にキャストされたDictionaryFactoryからの返り値です。
ファイルシステムを経由しない辞書コンパイル
Sudachiの新しいConfig
と辞書ビルドを組み合わせることで、CSV辞書をファイルシステムを経由せずに使えます。そのためには、書き込まれた内容をByteBuffer
として返すSeekableByteChannel
を実装する必要があります。例えば、この実装です。
仮に実装したクラスの名前をInMemoryChannel
とします。
// CSV辞書を読み込んで
DicBuilder.User builder = DicBuilder.user(dic)
.lexicon(Path.of("/path/to/user.lex.csv"));
InMemoryChannel channel = new InMemoryChannel();
builder.build(channel); // コンパイルして
BinaryDictionary user = BinaryDictionary.loadUser(channel.buffer());
// バイナリー辞書を含むDictionaryを作る
config.addUserDictionary(user);
Dictionary dic = DictionaryFactory().create(config);
終わりに
バイナリー辞書のコンパイルは通常の使い方より多くのメモリーなどを使います。将来的に、この機能をElasticsearch-sudachiにも取り入れる予定ですが、メモリー使用やJVMの設定を考慮する必要があります。
ではよい Sudachi life を。
SudachiPyにも似たようなAPIはある程度存在していますが、まだ公式ではないので、任意のタイミングで変更されることがあります。