Skip to content
Go porting of Sudachi
Branch: master
Clone or download
Latest commit 9b9f877 Mar 12, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
dartsclone
data
dicbuilder
dicconv
dictionary Fix the bug causing an invalid word length of a very long word Mar 11, 2019
gosudachicli initial commit Mar 11, 2019
internal
printdic initial commit Mar 11, 2019
printdicheader initial commit Mar 11, 2019
scripts
userdicbuilder initial commit Mar 11, 2019
LICENSE-2.0.txt
README.md
README.org Update README Mar 11, 2019
definputtextplugin.go initial commit Mar 11, 2019
dictionary.go
go.mod initial commit Mar 11, 2019
go.sum initial commit Mar 11, 2019
inhibitconnectioncostplugin.go
inputtext.go
joinkatakanaoovplugin.go initial commit Mar 11, 2019
joinnumericplugin.go
lattice.go
mecaboovproviderplugin.go initial commit Mar 11, 2019
morpheme.go initial commit Mar 11, 2019
numericparser.go
plugin.go
prolongedsoundmarkinputtextplugin.go initial commit Mar 11, 2019
settingsjson.go
settingsjson_test.go initial commit Mar 11, 2019
simpleoovproviderplugin.go
tokenizer.go

README.md

gosudachi

gosudachiは日本語形態素解析器であるSudachiのGo移植版です。

以下では、株式会社ワークスアプリケーションズ徳島人工知能NLP研究所が開発公開しているオリジナルのSudachiを「Java版Sudachi」「Java版」、Java版sudachi用の辞書ファイルを「Java版sudachi辞書」と表記します。

特徴

現時点のJava版Sudachiが持つ機能や特徴をすべて移植しました。よって詳しい情報はJava版の文書を参照してください。この文書にはGo版のみに該当する内容が記述されています。

  • Java版と同じコマンドラインオプション
  • Java版と同じく分割モード指定が可能
  • Java版と同じシステム提供プラグイン同梱
  • Java版と同等のプラグインの仕組みを提供
  • Java版と同じ設定ファイルが利用可能
  • ユーザー辞書の作成および利用が可能

Java版とGo版の違い

  • 辞書の文字列エンコード
  • 設定ファイルに指定するプラグイン名
  • 設定ファイルに辞書の文字列エンコードを指定する設定値を新設

辞書の文字列エンコードを変更した理由

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

utf16Stringtrue になっている場合、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
        }
    ]
}

Goへのポーティング指針

以下の指針のもと、移植作業を行っています。

  1. なるべくJavaのコードに似たような構成にする

    • オリジナルに修正が入ったときに追随しやすいように
  2. Java版Sudachiと同じ設定ファイルが利用できるように

  3. Java版Sudachiのコマンドラインインターフェースも同じにする

  4. Java版Sudachi用に作成された辞書ファイルをGo版でも使えるように

  5. Java版Sudachi用の辞書が作れるように

ビルド

プログラムと辞書を作成する方法です。

プログラムのビルド

このリポジトリをcloneします。 cloneしたディレクトリに移動し、ビルドスクリプトを実行します。

$ git clone https://github.com/msnoigrs/gosudachi
$ ch gosudachi
$ bash scripts/build.sh

distディレクトリにバイナリが作成されます。作成されるバイナリは以下の通りです。

  • gosudachicli: Sudachiコマンドライン
  • dicbuilder: システム辞書作成ツール
  • userdicbuilder: ユーザー辞書作成ツール
  • printdic: 辞書ファイルに登録されている単語リスト表示プログラム
  • printdicheader: 辞書ファイルヘッダ情報表示プログラム
  • dicconv: 辞書の文字列エンコードをUTF-16とUTF-8間で相互に変換するプログラム

辞書の作成

辞書のソースもJava版Sudachiのものを利用します。 Java版Sudachiをgithubからcloneした後、git lfs pullで取得します。 辞書のソースファイルは、 core_lex.csvnotcore_lex.csv の2つです。

distディレクトリに辞書のソースファイルをコピーした後、辞書を作成します。

$ cp core_lex.csv notcore_lex.csv dist
$ cd dist
$ bash ../scripts/mksystemdic.sh

distディレクトリに system_core.dic および system_full.dic ファイルが作成されます。

コマンド

Go版で提供するコマンドの説明です。

gosudachicli

Sudachiコマンドラインです。オプションを指定せずに実行する場合、 system_core.dic ファイルが実行時のディレクトリに存在する必要があります。辞書ファイルの場所は設定ファイルに指定可能です。

$ gosudachicli [-r conf] [-m mode] [-a] [-d] [-o output] [-j] [file...]

オプション

  • -r conf設定ファイルを指定
  • -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

dicbuilder

辞書ソースファイルからシステム辞書を作成します。デフォルトでは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

userdicbuilder

ユーザー辞書ソースファイルからユーザー辞書を作成します。デフォルトでは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

辞書ファイルに登録されている単語リストを表示します。

$ printdic [-s systemdic] [-j] inputdic

オプション

  • -s システム辞書ファイル(ユーザー辞書の情報を出力する場合に必要)

  • -j UTF-16エンコードの辞書を読み込み

  • Java版: com.worksap.nlp.sudachi.dictionary.PrintDictionary

printdicheader

辞書ファイルのヘッダ情報を表示します。

$ printdicheader inputdic
  • java版: com.worksap.nlp.sudachi.dictionary.PrintDictionaryHeader

dicconv

辞書ファイルに記録されている文字列のエンコードを変換します。オプションを指定しない場合、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研究所およびその開発者の方々に感謝いたします。

You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.