mocobeta / janome

Japanese morphological analysis engine written in pure Python
https://mocobeta.github.io/janome/en/
Apache License 2.0
848 stars 51 forks source link

How to fix "compileFST assert next_addr is not None" Error #94

Open nekomimimaiden257 opened 3 years ago

nekomimimaiden257 commented 3 years ago

en: When I try to create a user dictionary using Janome's API, UserDicitionary (), I encountered /lib/site-packages/janome/fst.py compileFST assert next_addr is not None error message with The stack trace is output. Then the user dictionary cannot be created. How can I generate a dictionary?

The original data to be used as a user dictionary is in IPA dictionary format. I wrote data check function in same python code. check function says all the lines has 12 commna . so I think The CSV file in IPA dictionary format is ready.

The CSV file is as follows. <About 20 characters mixed with numbers, symbols and alphabets>快特,-1,-1,1000,名詞,固有名詞,一般,,,,快特,, <About 20 characters mixed with numbers, symbols and alphabets>特快,-1,-1,1000,名詞,固有名詞,一般,,,,特快,, About 20,000 words below.

I can register up to about 9,000 words without any problems. If the problem can be solved, the dictionary will have more than tens of millions of lines.

ja( 日本語 ):

Janome の API 、UserDicitionary() を使用してユーザー辞書を作成しようとすると、 <pythonインストール先>/lib/site-packages/janome/fst.py compileFST assert next_addr is not None と言うスタックトレースが出力されて、ユーザー辞書の作成ができません。 どうすれば、辞書が生成できるでしょうか。

ユーザー辞書にする元データは、IPA辞書形式です。 APIを記載したpythonソースコード内で入力ファイルの,(カンマ)の数を数えると全ての行が12個なので、IPA辞書形式のCSVファイルは出来ているかと思います。

CSVファイルは、以下の要領です。 <数字・記号・アルファベット混じりの20文字ぐらい>快特,-1,-1,1000,名詞,固有名詞,一般,,,,快特,, <数字・記号・アルファベット混じりの20文字ぐらい>特快,-1,-1,1000,名詞,固有名詞,一般,,,,特快,, 以下2万語程度

9千語ぐらいまでは、問題なく登録できます。 問題が解決できれば、辞書は数千万行以上にする予定です。

Environment: Janome 3.10 python 2.7.18 32bit Windows 8.1 64bit

mocobeta commented 3 years ago

辞書エントリまたはサイズの問題か,環境の問題かを切り分ける必要がありそうです。

mocobeta commented 3 years ago

問題が解決できれば、辞書は数千万行以上にする予定です。

理論上はユーザー辞書の行数に上限はありませんが,現実的に数千万件を扱うのは,ビルド時間,実行時の解析時間の両面において厳しいかもしれません。実績があるのは数百万件程度です(そのくらいでも解析時間は遅くなります)。

nekomimimaiden257 commented 3 years ago
  • 失敗するユーザー辞書の行は特定できるでしょうか?その行だけをユーザー辞書に与えても失敗しますか?
  • 64bit版 Python で実行するとどうでしょうか?

調べてみました。

Janomeのfst.pyにprint文を入れた最後10行分の結果を記します。

num: 33440 i: 0
<janome.fst.State object at 0x05593760>
num: 33441 i: 0 r
<janome.fst.State object at 0x055937D8>
num: 33442 i: 0 a
<janome.fst.State object at 0x05593850>
num: 33443 i: 0 l
<janome.fst.State object at 0x055938C8>
num: 33444 i: 0 u
<janome.fst.State object at 0x05593940>
num: 33445 i: 0 c
<janome.fst.State object at 0x055939B8>
num: 33446 i: 0 i
<janome.fst.State object at 0x05593A30>
num: 33447 i: 0 m
<janome.fst.State object at 0x05593AA8>
num: 33448 i: 0 a
<janome.fst.State object at 0x05593B20>
num: 33449 i: 0 r
<janome.fst.State object at 0x05593B98>
num: 33450 i: 0 「
<janome.fst.State object at 0x062BDD78>
Traceback (most recent call last):
  File "janome_make_usrdic_v1.py", line 168, in <module>
    user_dict = UserDictionary( in_filename, char_code , dic_form , sysdic.conne
ctions)
  File "C:\Python27\lib\site-packages\janome\dic.py", line 393, in __init__
    compiledFST, entries = build_method(user_dict, enc)
  File "C:\Python27\lib\site-packages\janome\dic.py", line 413, in buildipadic
    compiledFST = compileFST(fst)
  File "C:\Python27\lib\site-packages\janome\fst.py", line 323, in compileFST
    assert next_addr is not None
AssertionError

IPA辞書形式のCSVファイルを分割して1つの辞書フォルダーへ保存すると言った回避は可能ですか?

nekomimimaiden257 commented 3 years ago

問題が解決できれば、辞書は数千万行以上にする予定です。

理論上はユーザー辞書の行数に上限はありませんが,現実的に数千万件を扱うのは,ビルド時間,実行時の解析時間の両面において厳しいかもしれません。実績があるのは数百万件程度です(そのくらいでも解析時間は遅くなります)。

解析にかかる時間が2週間程度であれば、コンピュータ動かしっぱなしにすればよいので、問題ありません。

mocobeta commented 3 years ago

遅くなってすみません。10000件程度なら登録できるはずなので,データに依存する不具合かもしれないですね。 公開可能なものであれば手元で再現させてみます。公開不可能なデータであれば対応は難しそうです。

nekomimimaiden257 commented 3 years ago

遅くなってすみません。10000件程度なら登録できるはずなので,データに依存する不具合かもしれないですね。 公開可能なものであれば手元で再現させてみます。公開不可能なデータであれば対応は難しそうです。

関係者に確認を取って、載せても構わないとのことでしたので添付いたします。

あまり広めないでほしいとの要望がありましたので、取り扱いにご注意をお願いいたします。(取得後はオーナー権限で添付を削除しても構いません。) 文字コードはCP932形式で、拡張子はGithubがCSV形式をアップロードできないそうなので、txtにしています。csvに直してから使ってください。

一応、mecab-dict-index でユーザー辞書の生成ができることを確認しています。