Previous Post | Top | Next Post |
TOC
Debian Busterの(0.3系)のAnthyは問題がある。
一方、mozcの最新コードや辞書を見たら、昔よりかなり整理され 変なデーターで無理やり特定コーパスのみの最適化というか過学習 の結果のような辞書データーもない。使ってみると正直悪くない。
いまさらanthyを触るのもという感もあるが、せめて以前程度に 動くようにはしたい。特にDebianのパッケージは完全メンテナー モードで、salsaでバグ修正優先での対応を考えます。 (githubは、いろいろ遊ぶかもしれません)
すぐ気づいた明らかなバグ2つは解決法が見えた。
- Use UTF-8 for zipcode bug fix. Closes: #927074
- Convert depgraph/master.depword to UTF-8. Closes: #923948
後者は文法係り受け定義関連を再構築必要がある。簡単にするには
debian/rules
を以下としてDebianのビルドシステムでdebuild
と
してビルドする必要がある。
override_dh_auto_configure:
dh_auto_configure -- --sysconfdir=/etc/anthy --enable-maintainer-mode
だが、上手くいかない。ソース壊れている?
UTF-8 での処理のデフォルト化
まず、テスト環境で変な文字が出るので気になっていた、UTF-8廻りを 確認した。
anthy/anthy.h
に以下と定義されているので、encoding
関係が
初期値の0だと、どうも出力がEUCJPになってしまうようだ。
#define ANTHY_UTF8_ENCODING 2
これは、0にしておかないとdefault_encodingやencodingやprint_encoding などがUTF-8にならない懸念がある。2としている意味を感じなかったので これを変えた。特に以下への影響が気になる。
anthy_putxchar()
anthy_putxstr()
anthy_putxstrln()
これらは、以下で使われている。
mkworddic/mkdic.c
src-main/context.c
src-splitter/metaword.c
src-splitter/wordlist.c
src-worddic/record.c
src-util/convdb.c
test/check.c
まあ、道理でparsed_data0
がUTF-8環境で読めない。どうもEUCJPで文字列
をはき出しているわけです。これじゃ、まともに動かないのも納得です。
きっと連接の統計がまともにできていないので、連文節変換をすると変な
結果が出るようになったのだろう。とりあえず、修正。
さらによく見ると、calctrans/proccorpus.c
が以下になっている。
anthy_conf_override("CONFFILE", "../anthy-conf");
これは、ビルド中のソース内のファイルを見てほしいので以下にする。
anthy_conf_override("CONFFILE", "../anthy-test-conf");
無限ループ
上記を対策しても上手くビルドしない。
proccorpus
は、たしかに読めるparsed_data0
を生成するが処理が止まってしまう。
何か無限ループに落ち込んでいる感じ。
こうなったら素人デバグの常套手段の「printf(stderr,…)」の嵐だ! すると見えてきた。
...
step=8783
proc_sentence=(あっぷでーとだよ〜ん)
res_str=(|あっぷでーと|だよ〜ん|)
** next ** nth=0 cur=(あっぷでーと|だよ〜ん|)
** done ** nth=0 cur=(|だよ〜ん|)
trim segment 24 18 0 (あっぷでーとだよ)
trim segment 21 18 0 (あっぷでーとだ)
trim segment 18 18 0 (あっぷでーと)
-- prev -- nth=0 cur_seg=(あっぷでーと)
** next ** nth=1 cur=(だよ〜ん|)
** done ** nth=1 cur=(|)
trim segment 3 12 1 (だ)
trim segment 6 12 1 (だよ)
trim segment 7 12 1 (だよ~)
trim segment 10 12 1 (だよ~ん)
trim segment 10 12 1 (だよ~ん)
trim segment 10 12 1 (だよ~ん)
...
もとのコーパスのかな文字は全角の〜
だが、以下
が返す文字列は半角の~
になっている。
calctrans/proccorpus.c:trim_segment()
の中の以下が半角文字化して
返すようだ。
anthy_get_segment(ac, nth, NTH_UNCONVERTED_CANDIDATE, seg_buf, 1024);
anthyは入力文字をいろいろ正規化してからかな漢字変換をするので、 テストコーパスの右は正規化された表現じゃないといけないね。 もしかしたら逆変換問題?正確な問題の原因はもう少し調べる 必要があるけれど、抜け出せなくなったのは納得。
この変もう少しロバストにしないと、少し問題があるコーパスを使った 際に今回のように壷にはまる。
応急措置(失敗例)
さて、とりあえず回避のためにデーターの問題部分を触ってみる。
-|あっぷでーと|だよ〜ん| |アップデート|だよ〜ん|
+|あっぷでーと|だよ~ん| |アップデート|だよ~ん|
おー、変換入力文字から半角~
が落ちている、、、ので以下がfprint()
とされた。
proc_sentence=(あっぷでーとだよん)
res_str=(|あっぷでーと|だよ~ん|)
応急措置(成功例)
とりあえず回避のためにデーターの問題部分を以下にした。
-|あっぷでーと|だよ〜ん| |アップデート|だよ〜ん|
+|あっぷでーと|だよ~ん| |アップデート|だよ~ん|
すると、
step=8783
proc_sentence=(あっぷでーとだよ~ん)
res_str=(|あっぷでーと|だよ~ん|)
** next ** nth=0 cur=(あっぷでーと|だよ~ん|)
** done ** nth=0 cur=(|だよ~ん|)
trim segment 27 18 0 (あっぷでーとだよ~)
trim segment 24 18 0 (あっぷでーとだよ)
trim segment 21 18 0 (あっぷでーとだ)
trim segment 18 18 0 (あっぷでーと)
-- prev -- nth=0 cur_seg=(あっぷでーと)
** next ** nth=1 cur=(だよ~ん|)
** done ** nth=1 cur=(|)
trim segment 3 12 1 (だ)
trim segment 6 12 1 (だよ)
trim segment 9 12 1 (だよ~)
trim segment 12 12 1 (だよ~ん)
-- prev -- nth=1 cur_seg=(だよ~ん)
** next ** nth=2 cur=()
** while ** nth=2 cur=((null))
for_each_segment -- trim_segment
anthy_get_stat -- sanity checkacs.nr_segment=2
i=0
i=1
cand_check -- loop end
res_str=(|アップデート|だよ~ん|)
** next ** nth=0 cur=(アップデート|だよ~ん|)
** done ** nth=0 cur=(|だよ~ん|)
find_candidate 0 (だよ~ん)
-- prev -- nth=0 cur_seg=(アップデート)
** next ** nth=1 cur=(だよ~ん|)
** done ** nth=1 cur=(|)
find_candidate 0 (アップデート)
find_candidate 1 (だよ~ん)
-- prev -- nth=1 cur_seg=(だよ~ん)
** next ** nth=2 cur=()
** while ** nth=2 cur=((null))
for_each_segment -- if true
before output
...
これで、文法係り受け定義関連を再構築は何とか動いているようだ。
とりあえず、今日はここ迄。
インストールしたら、ちょっとは変な動きがなくなるかな?
PS: 「なくなるかな」や「なるかなど」といれると、 「なくなるか名」や「なるな度」となるのが 1:0.3-8.1までの 問題でした。特に語尾が変になります。
2019-05-13追記: Debianのexperimentalに anthy 1:0.3-9 としてアップロード。(Busterはフリーズされたのでリリースの邪魔をしない苦肉の策) 0.3-9に変更後は「無くなるかな」とまともですが、一方「奈留など。」と変な候補も 示されます。まだ、他にもおかしいところがあるかもしれませんね。
Previous Post | Top | Next Post |