Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
nekomimimaiden257 opened this issue Dec 29, 2020 · 6 comments
Open

Comments

@nekomimimaiden257
Copy link

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
Copy link
Owner

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

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

@mocobeta
Copy link
Owner

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

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

@nekomimimaiden257
Copy link
Author

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

調べてみました。

  • 32bit Python2.7の場合

    • 9045行まで登録できる
    • 9046行から登録できない
    • 9046行目にすでに登録できることが分かっていて、辞書にない単語を書いても登録できなず、compileFST assert next_addr is not None エラーが表示される。
    • 9046行目以降だけのIPA辞書形式のCSVファイルを作成すると問題なく辞書登録される
  • 64bit Python2.7の場合

    • 4350行あたりから辞書登録に失敗し始める(compileFST assert next_addr is not None エラーが表示される)
    • 4600行まで、5回中3回ぐらい辞書登録に失敗する(compileFST assert next_addr is not None エラーが表示される)
    • 8000行あたりから、だいたい辞書登録に失敗する(compileFST assert next_addr is not None エラーが表示される)
    • 32bit と同じく後ろ半分だけを辞書登録すると成功する

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
Copy link
Author

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

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

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

@mocobeta
Copy link
Owner

mocobeta commented Jan 6, 2021

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

@nekomimimaiden257
Copy link
Author

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

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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants