はじめに
Sudachi の辞書ソースにはつかわれていない、あるいは何につかわれているかがあまり説明されていないカラムがいくつかあります。何回かにわけてそういったカラムについて説明していきます。
4カラム目の話
今回は4カラム目 (0はじまりで) のお話です。このカラムはユーザー辞書のドキュメント には「見出し (解析結果表示用)」と書かれています。0カラム目も見出しですがこちらには TRIE 用と注釈があります。さて、これらはどうちがうのでしょうか。
Sudachi が入力を受け付けるとまず文字正規化がおこなわれます。デフォルトでは半角カナを全角に、アルファベットを小文字に変換したり、rewrite.def
の内容にしたがって文字列を書き換えたり、「ー」「〜」「〰」の連続を「ー」に正規化したりします。辞書引きはこの正規化後の文字列に対しておこなわれるので、たとえば0カラム目に大文字アルファベットがふくまれるエントリがあると絶対にマッチせず無視されます (ユーザー辞書でどうコスト調整しても出てこないのはだいたいこのパターンです)。
そのためシステム辞書ソースの0カラムはあらかじめ文字正規化がおこなわれたものが入っています。そうすると元の見出しが失われてしまうので正規化前の見出しが4カラム目も入っているわけです。(正規化を辞書ビルド時に実行して、0カラム目と4カラム目を統合して正規化前見出しを入れておくということもかんがえられますが、正規化が内部でおこなわれていると衝突などがおきたときに把握しづらいという理由でこのような状態になっています。)
「解析表示用」はうそ?
では4カラム目の情報はどこでつかわれるのでしょうか。じつは解析結果の表示にはつかわれていません。結果表示には入力文字列を切り出して出力しています。Morpheme.getSurface()
で得られる文字列がそれにあたります。4カラム目の文字列は WordInfo
という内部で形態素の情報を保持する構造に読み込まれてはいるのですが、それを出力するAPIは用意されていません。
ではなくてもいいかというとそうでもなくて、辞書形を得るときに Morpheme.getDictionaryForm()
で利用しています (内部では辞書形の wordId
しか保持していないので)。
文字正規化で同一になる語が複数ある場合
アルファベットの大文字、小文字ちがいのように文字正規化後おなじ文字列になる語が複数ある場合 (ABC, AbC, abc など)、どれが出るかは連接と単語コストによりますが、とくに連接IDがおなじ (≒同一品詞) ときは単語コストが最小のエントリが常に出ます。同コストであれば並び順が最初の語が出ます。ラティスが無駄に複雑になって計算量がふえるだけなので、ほかのエントリは削除した方がいいでしょう。分割情報で構成素として参照する場合は連接IDに-1を指定して辞書引きにつかわれないようにできます。
まとめ
ユーザー辞書をつくるときなどに、0カラム目と4カラム目におなじような項目があってモヤモヤしてた方もおおいとおもいますが、0カラム目には文字正規化後、4カラム目には正規化前の見出し語を入れてください。ただし、正規化後の文字列がおなじで同一品詞の語が複数ある場合はそのうち1つしか出力されないので残りのエントリは削除するのがおすすめです。
ではよい Sudachi life を。