Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

初めに

これまで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つあり、BinaryDictionaryJapaneseDictionaryにキャストされた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はある程度存在していますが、まだ公式ではないので、任意のタイミングで変更されることがあります。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Qiita Advent Calendar is held!

Qiita Advent Calendar is an article posting event where you post articles by filling a calendar 🎅

Some calendars come with gifts and some gifts are drawn from all calendars 👀

Please tie the article to your calendar and let's enjoy Christmas together!

3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?