gosudachiは日本語形態素解析器であるSudachiのGo移植版です。
以下では、株式会社ワークスアプリケーションズ徳島人工知能NLP研究所が開発公開しているオリジナルのSudachiを「Java版Sudachi」「Java版」、Java版sudachi用の辞書ファイルを「Java版sudachi辞書」と表記します。
gosudachiは、Java版sudachiのバージョン0.3.0相当です。
現時点のJava版Sudachiが持つ機能や特徴をすべて移植しました。よって詳しい情報はJava版の文書を参照してください。この文書にはGo版のみに該当する内容が記述されています。
- Java版と同じコマンドラインオプション
- Java版と同じく分割モード指定が可能
- Java版と同じシステム提供プラグイン同梱
- Java版と同等のプラグインの仕組みを提供
- Java版と同じ設定ファイルが利用可能
- ユーザー辞書の作成および利用が可能
- 辞書の文字列エンコード
- 設定ファイルに指定するプラグイン名
- 設定ファイルに辞書の文字列エンコードを指定する設定値を新設
Java版Sudachiは、辞書の作成時に文字列をUTF-16エンコードのバイト列として記録します。辞書を利用するときは、辞書ファイルをメモリにマップし、バイト列をそのまま(文字コード変換をせずに)文字列として扱います。
Goの文字列はUTF-8エンコードのバイト列であることが一般的です。GoでJavaと同様に辞書中のバイト列をそのまま文字列として扱うには、UTF-8エンコードで記録された辞書を準備する必要があります。
Go版ではシステム辞書作成ツールとして dicbuilder
、ユーザー辞書作成ツールとして userdicbuilder
を準備しており、どちらもUTF-8エンコードの辞書を作成します。(UTF-16エンコードの辞書を作成することもできます。 dicconv
を使って相互に変換することも可能です。)
ただし、UTF-8エンコードの辞書はUTF-16エンコードの辞書よりもサイズが大きくなります。以下の2点がその理由です。
- 日本語に使用される文字の多くが、1文字あたりUTF-16では2byte長であり、UTF-8では3byte長
- 文字列のバイト長を記録するための領域に2byteを使用する頻度が高い
UTF-8エンコードでのバイト長が127を超える文字列の場合、2byteを使用してバイト長を記録します。なお、UTF-16エンコードの辞書ではバイト長ではなくUTF-16表現でのint16配列の長さを記録しており、記録可能な文字列の長さはUTF-8の方が短くなります。
ちなみに辞書中に記録される文字列とは、品詞情報リストおよび単語情報です。
Go版においても、UTF-16エンコードの辞書を利用することが可能です。この場合、辞書から文字列を読み出す処理においてUTF-16からUTF-8への文字コード変換が行われます。利用する辞書のエンコードを設定ファイルに設定できます。
Go版でのみ利用できる設定値に関する記述です。
utf16String
が true
になっている場合、UTF-16エンコードの辞書であると判断します。デフォルトはfalseです。
{ "systemDict" : "system_core_utf16.dic", "utf16String" : true, ... }
Go版ではJava版の設定ファイルをそのまま利用することが可能ですが、プラグイン名に省略形を用いることもできます。
Java版と同様にデフォルトで利用できるプラグインは以下の7つがあります。省略形とはJavaのクラス階層を省いたプラグイン名です。また、設定先は class
ではなく name
にすることも可能です。
処理部分 | プラグイン | プラグイン名 | 省略形 |
---|---|---|---|
入力テキスト修正 | 文字列正規化 | com.worksap.nlp.sudachi.DefaultInputTextPlugin | DefaultInputTextPlugin |
長音正規化 | com.worksap.nlp.sudachi.ProlongedSoundMarkInputTextPlugin | ProlongedSoundMarkInputTextPlugin | |
未知語処理 | 1文字未知語 | com.worksap.nlp.sudachi.SimpleOovProviderPlugin | SimpleOovProviderPlugin |
MeCab互換 | com.worksap.nlp.sudachi.MeCabOovProviderPlugin | MeCabOovProviderPlugin | |
単語接続処理 | 品詞接続禁制 | com.worksap.nlp.sudachi.InhibitConnectionPlugin | InhibitConnectionPlugin |
出力解修正 | カタカナ未知語まとめ上げ | com.worksap.nlp.sudachi.JoinKatakanaOovPlugin | JoinKatakanaOovPlugin |
数詞まとめ上げ | com.worksap.nlp.sudachi.JoinNumericPlugin | JoinNumericPlugin |
{ "systemDict" : "system_core.dic", "inputTextPlugin" : [ { "name" : "DefaultInputTextPlugin" }, { "name" : "ProlongedSoundMarkInputTextPlugin", "prolongedSoundMarks": ["ー", "-", "⁓", "〜", "〰"], "replacementSymbol": "ー"} ], "oovProviderPlugin" : [ { "name" : "MeCabOovProviderPlugin" }, { "name" : "SimpleOovProviderPlugin", "oovPOS" : [ "補助記号", "一般", "*", "*", "*", "*" ], "leftId" : 5968, "rightId" : 5968, "cost" : 3857 } ], "pathRewritePlugin" : [ { "name" : "JoinNumericPlugin", "joinKanjiNumeric" : true }, { "name" : "JoinKatakanaOovPlugin", "oovPOS" : [ "名詞", "普通名詞", "一般", "*", "*", "*" ], "minLength" : 3 } ] }
以下の指針のもと、移植作業を行っています。
- なるべくJavaのコードに似たような構成にする
- オリジナルに修正が入ったときに追随しやすいように
- Java版Sudachiと同じ設定ファイルが利用できるように
- Java版Sudachiのコマンドラインインターフェースも同じにする
- Java版Sudachi用に作成された辞書ファイルをGo版でも使えるように
- Java版Sudachi用の辞書が作れるように
プログラムと辞書を作成する方法です。
このリポジトリをcloneします。 cloneしたディレクトリに移動し、ビルドスクリプトを実行します。
$ git clone https://github.com/msnoigrs/gosudachi $ cd gosudachi $ bash scripts/build.sh
distディレクトリにバイナリが作成されます。作成されるバイナリは以下の通りです。
- gosudachicli
- Sudachiコマンドライン
- dicbuilder
- システム辞書作成ツール
- userdicbuilder
- ユーザー辞書作成ツール
- printdic
- 辞書ファイルに登録されている単語リスト表示プログラム
- printdicheader
- 辞書ファイルヘッダ情報表示プログラム
- dicconv
- 辞書の文字列エンコードをUTF-16とUTF-8間で相互に変換するプログラム
ビルドスクリプトを使わない場合は、コマンドプロンプト上で以下を実行してください。Windowsでも作成可能です。
$ git clone https://github.com/msnoigrs/gosudachi $ cd gosudachi/data $ go generate $ cd .. $ cd gosudachicli $ go build $ cd .. $ cd dicbuilder $ go build $ cd .. $ cd userdicbuilder $ go build $ cd .. $ cd printdic $ go build $ cd .. $ go printdicheader $ go build $ cd .. $ cd dicconv $ go build
辞書のソースもJava版Sudachiのものを利用します。
SudachiDictをgithubからcloneした後、git lfs pullで取得します。
辞書のソースファイルは、 small_lex.csv
と core_lex.csv
と notcore_lex.csv
の3つです。
辞書を作成するスクリプトを利用する場合、以下を実行してください。
$ git clone https://github.com/WorksApplications/SudachiDict.git $ cd SudachiDict $ git lfs pull $ cd ../dist $ bash ../scripts/mksystemdic.sh ../SudachiDict
distディレクトリに system_small.dic
、 system_core.dic
および system_full.dic
ファイルが作成されます。
辞書作成スクリプトを使わない場合は、コマンドプロンプト上で以下を実行してください。
$ dicbuilder -o system_small.dic -m matrix.def small_lex.csv $ dicbuilder -o system_core.dic -m matrix.def small_lex.csv core_lex.csv $ dicbuilder -o system_full.dic -m matrix.def small_lex.csv core_lex.csv notcore_lex.csv
Go版で提供するコマンドの説明です。
Sudachiコマンドラインです。オプションを指定せずに実行する場合、 system_core.dic
ファイルが実行時のディレクトリに存在する必要があります。辞書ファイルの場所は設定ファイルに指定可能です。
$ gosudachicli [-r conf] [-m mode] [-a] [-d] [-o output] [-j] [file...]
- -r conf設定ファイルを指定
- -s デフォルト設定を上書きする設定(json文字列)
- -p リソースディレクトリ(設定ファイル内の各種リソースのベースディレクトリ、デフォルトは実行時ディレクトリ)
- -m {A|B|C}分割モード
- -a 読み、辞書形も出力
- -d デバッグ情報の出力
- -o 出力ファイル(指定がない場合は標準出力)
- -f エラーを無視して処理を続行する
- -j UTF-16エンコードの辞書ファイルを利用する
$ echo 東京都へ行く | gosudachicli 東京都 名詞,固有名詞,地名,一般,*,* 東京都 へ 助詞,格助詞,*,*,*,* へ 行く 動詞,非自立可能,*,*,五段-カ行,終止形-一般 行く EOS $ echo 東京都へ行く | gosudachicli -a 東京都 名詞,固有名詞,地名,一般,*,* 東京都 東京都 トウキョウト へ 助詞,格助詞,*,*,*,* へ へ エ 行く 動詞,非自立可能,*,*,五段-カ行,終止形-一般 行く 行く イク EOS $ echo 東京都へ行く | gosudachicli -m A 東京 名詞,固有名詞,地名,一般,*,* 東京 都 名詞,普通名詞,一般,*,*,* 都 へ 助詞,格助詞,*,*,*,* へ 行く 動詞,非自立可能,*,*,五段-カ行,終止形-一般 行く EOS
- Java版
- com.worksap.nlp.sudachi.SudachiCommandLine
辞書ソースファイルからシステム辞書を作成します。デフォルトではUTF-8エンコードの辞書が作成されます。
$ dicbuilder -o outputdic -m matrix.def [-d description] [-j] filecsv1 [filecsv2...]
- -o 出力ファイル(必須)
- -m matrix.defファイル(必須)
- -d 辞書ヘッダ情報に埋め込む文字
- -j UTF-16エンコードの辞書ファイルを生成する
- Java版
- com.worksap.nlp.sudachi.dictionary.DictionaryBuilder
ユーザー辞書ソースファイルからユーザー辞書を作成します。デフォルトではUTF-8エンコードの辞書が作成されます。
$ userdicbuilder -o outputdic -s systemdic [-d description] [-j] filecsv1 [filecsv2...]
- -o 出力ファイル(必須)
- -s システム辞書ファイル(必須)
- -d 辞書ヘッダ情報に埋め込む文字
- -j UTF-16エンコードの辞書ファイルを生成する
- Java版
- com.worksap.nlp.sudachi.dictionary.UserDictionaryBuilder
辞書ファイルに登録されている単語リストを表示します。
$ printdic [-s systemdic] [-j] inputdic
- -s システム辞書ファイル(ユーザー辞書の情報を出力する場合に必要)
- -j UTF-16エンコードの辞書を読み込み
- Java版
- com.worksap.nlp.sudachi.dictionary.DictionaryPrinter
辞書ファイルのヘッダ情報を表示します。
$ printdicheader inputdic
- java版
- com.worksap.nlp.sudachi.dictionary.DictionaryHeaderPrinter
辞書ファイルに記録されている文字列のエンコードを変換します。オプションを指定しない場合、UTF-16エンコード(Java版)からUTF-8エンコード(Go版)に変換します。
$ dicconv [-o outputdic] [-j] inputdic
- -o 出力ファイル、省略すると
out_utf16.dic
もしくはout_utf8.dic
に出力 - -j UTF-8エンコードからUTF-16エンコードに変換する
Java版Sudachiと同じApache License, Version2.0
Sudachiにおいてプログラムや辞書をOSSとして公開されている、株式会社ワークスアプリケーションズ徳島人工知能NLP研究所およびその開発者の方々に感謝いたします。