AnthyのBuildトライ(1)

Date: 2019/05/12 (initial publish), 2021/07/13 (last update)

Source: jp/note-00010.md

Previous Post Top Next Post

TOC

Debian Busterの(0.3系)のAnthyは問題がある。

一方、mozcの最新コードや辞書を見たら、昔よりかなり整理され 変なデーターで無理やり特定コーパスのみの最適化というか過学習 の結果のような辞書データーもない。使ってみると正直悪くない。

いまさらanthyを触るのもという感もあるが、せめて以前程度に 動くようにはしたい。特にDebianのパッケージは完全メンテナー モードで、salsaでバグ修正優先での対応を考えます。 (githubは、いろいろ遊ぶかもしれません)

すぐ気づいた明らかなバグ2つは解決法が見えた。

後者は文法係り受け定義関連を再構築必要がある。簡単にするには 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としている意味を感じなかったので これを変えた。特に以下への影響が気になる。

これらは、以下で使われている。

まあ、道理で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に変更後は「無くなるかな」とまともですが、一方「奈留など。」と変な候補も 示されます。まだ、他にもおかしいところがあるかもしれませんね。

2019-06-01: 追加関連記事

Previous Post Top Next Post