Closed po3rin closed 3 years ago
(私は今はSudachiの中の人ではないのですが、参考までです)
「見出しとしての 1
」が「行番号1」に誤認されている、ということなのかと思います。
公式ドキュメント: Sudachi/user_dict.md at develop · WorksApplications/Sudachi
15 A単位分割情報 ... 構成語のIDまたは構成語情報を "/" (半角スラッシュ) で区切って記述します。 構成語のIDはその語が記述されている行番号 (0始まり) か、その先頭に "U" を加えた文字列です。ユーザー辞書内の語を参照するときに "U" をつけます。 構成語情報は語の見出し (解析結果表示用)、品詞1-4、品詞 (活用型)、品詞 (活用形)、読みを "," (カンマ) で区切った文字列です。
def __is_id(text):
return re.match(r'U?\d+', text)
@kazuma-t @t-yamamura 間違っていたらご指摘ください。
見出しの 1
を、「構成語情報」として記述するのではなく、「構成語のID」として記述(システム辞書の行番号を特定するか、 別途ユーザー辞書に掲載)すると、コード変更なしに動かせるのかなと思います。
$ echo "グレード1" | sudachipy -a -m C
グレード 名詞,普通名詞,一般,*,*,* グレード グレード グレード 0 [241]
1 名詞,数詞,*,*,*,* 1 1 イチ 0 [17619]
EOS
$ echo "グレード1" | sudachipy -a -m A
グレード 名詞,普通名詞,一般,*,*,* グレード グレード グレード 0 [241]
1 名詞,数詞,*,*,*,* 1 1 イチ 0 [17619]
EOS
行番号の特定
$ cd SudachiDict/src/main/text
$ grep -n "^グレード," small_lex.csv
198573:グレード,5144,5144,2399,グレード,名詞,普通名詞,一般,*,*,*,グレード,グレード,*,A,*,*,*,000241
$ grep -n "^1," small_lex.csv
17:1,4796,4796,2478,1,名詞,数詞,*,*,*,*,イチ,1,*,A,*,*,*,017619
18:1,5073,5073,3081,1,名詞,数詞,*,*,*,*,イチ,1,*,A,*,*,*,017619
19:1,4796,4796,4120,1,名詞,数詞,*,*,*,*,イッ,1,*,A,*,*,*,017619
20:1,5073,5073,4723,1,名詞,数詞,*,*,*,*,イッ,1,*,A,*,*,*,017619
21:1,5072,5072,6464,1,名詞,数詞,*,*,*,*,ヒト,1,*,A,*,*,*,017619
22:1,5072,5072,9720,1,名詞,数詞,*,*,*,*,ビト,1,*,A,*,*,*,017619
23:1,-1,-1,0,1,名詞,普通名詞,一般,*,*,*,ワン,ワン,*,A,*,*,*,017619
6227:1,-1,-1,0,¹,補助記号,一般,*,*,*,*,キゴウ,¹,*,A,*,*,*,*
6506:1,-1,-1,0,①,名詞,数詞,*,*,*,*,イチ,1,*,A,*,*,*,017619
6507:1,-1,-1,0,①,名詞,数詞,*,*,*,*,イッ,1,*,A,*,*,*,017619
6508:1,-1,-1,0,①,補助記号,一般,*,*,*,*,キゴウ,①,*,A,*,*,*,*
1,4796,4796,2478,1,名詞,数詞,*,*,*,*,イチ,1,*,A,*,*,*,017619
グレード
: ゼロ始まりで行番号1985721
: ゼロ始まりで行番号16ユーザー辞書ファイル
$ cat test_dict.txt
グレード1,5146,5146,5000,グレード1,名詞,普通名詞,一般,*,*,*,,グレード1,*,C,"グレード,名詞,普通名詞,一般,*,*,*,グレード/16","グレード,名詞,普通名詞,一般,*,*,*,グレード/16",*
# もしくは
$ cat test_dict.txt
グレード1,5146,5146,5000,グレード1,名詞,普通名詞,一般,*,*,*,,グレード1,*,C,198572/16,198572/16,*
$ sudachipy ubuild test_dict.txt
reading the source file...1 words
writing the POS table...2 bytes
writing the connection matrix...4 bytes
building the trie...done
writing the trie...1028 bytes
writing the word-ID table...9 bytes
writing the word parameters...10 bytes
writing the word_infos...40 bytes
writing word_info offsets...4 bytes
解析結果
$ echo "グレード1" | sudachipy -a -m C -r sudachi.json
グレード1 名詞,普通名詞,一般,*,*,* グレード1 グレード1 グレード1 1 []
EOS
$ echo "グレード1" | sudachipy -a -m A -r sudachi.json
グレード 名詞,普通名詞,一般,*,*,* グレード グレード グレード 0 [241]
1 名詞,数詞,*,*,*,* 1 1 イチ 0 [17619]
EOS
ユーザー辞書ファイル
$ cat test_dict.txt
グレード1,5146,5146,5000,グレード1,名詞,普通名詞,一般,*,*,*,,グレード1,*,C,U1/U2,U1/U2,*
グレード,5146,5146,5000,グレード,名詞,普通名詞,一般,*,*,*,,グレード,*,A,*,*,*
1,5146,5146,5000,1,名詞,数詞,*,*,*,*,,イチ,*,A,*,*,*
$ sudachipy ubuild test_dict.txt
reading the source file...3 words
writing the POS table...2 bytes
writing the connection matrix...4 bytes
building the trie...done
writing the trie...1028 bytes
writing the word-ID table...19 bytes
writing the word parameters...22 bytes
writing the word_infos...82 bytes
writing word_info offsets...12 bytes
解析結果
$ echo "グレード1" | sudachipy -a -m C -r sudachi.json
グレード1 名詞,普通名詞,一般,*,*,* グレード1 グレード1 グレード1 1 []
EOS
$ echo "グレード1" | sudachipy -a -m A -r sudachi.json
グレード 名詞,普通名詞,一般,*,*,* グレード グレード グレード 1 []
1 名詞,数詞,*,*,*,* イチ 1 1 1 []
EOS
@kazuma-t @t-yamamura こうすると、ちゃんとIDかを判定して適切にビルドできるんじゃないかと思います → #156
(当Issueの例で動作することは確認しましたが、他部分への影響等がよくわかっていません)
「見出しとしての 1 」が「行番号1」に誤認されている、ということなのかと思います。
ありがとうございます。原因が理解できました。
ちなみに、数値始まり見出し以外にも U2,名詞,固有名詞,人名,一般,*,*,ユーツー
とかでも落ちるなーと思いました。
(システム辞書には U2 は入ってなかったですけど)
ご指摘ありがとうございます。Java 版の方からきた不具合ですね。さきに Java 版の方をなおしてからこちらにも反映します。
よくよく見たら Java 版の方は対応済みでした。
sudachiのユーザー辞書に分割情報を入れようとしているのですが、数詞を含む分割情報をもつ単語でエラーが出ます。理由や対処法がわかれば教えていただきたいです。
詳細
例えば下記のようなユーザー辞書を作成したい場合
下記のようなエラーが出ます。(エラーがわかりづらかったので最近出したPR( https://github.com/WorksApplications/SudachiPy/pull/154 )が入ったもので出力しています。)
ここでエラーになる際には今までシステム辞書に含まれない単語だった場合に発生していたのですが、今回「1」はシステム辞書にはあるのでビルドに失敗している理由がわかりません。
この問題の対処法を教えていただけますと幸いです。よろしくお願いします。