kzkの日記: 黒魔術を習ってみる 2
Hacking Guideを参考にソースを眺めてみた。
とりあえず最近数字がらみの変換が弱いなーと思っていたので手を付け始めた。「~回」ってのが変換できないのでしらべる。depgraphが悪さしてた。
fix.depword
-@か? "かい" "かいな" Se@ Se@間投助詞
-@か? "かい?" "かいな?" Se@ Se@間投助詞
とか。この辺りは微妙な問題だな。。。
「におくろくせんさんびゃくにじゅうに」なんかをcombineして欲しいのでmetaword.cを次のように変えてみた。NUMBERならなんでもかんでもくっつけてみる作戦。
--- anthy-6024/src-splitter/metaword.c 2004-12-20 17:31:56.000000000 +0900
+++ anthy-6024-devel/src-splitter/metaword.c 2005-01-02 07:37:03.000000000 +0900
@@ -365,8 +365,8 @@
}
static void
-try_combine_10_1(struct splitter_context *sc,
- struct meta_word *mw, struct meta_word *mw2)
+try_combine_number(struct splitter_context *sc,
+ struct meta_word *mw, struct meta_word *mw2)
{
int pos1, pos2;
pos1 = anthy_wtype_get_pos(mw->wl->part[PART_CORE].wt);
@@ -377,14 +377,11 @@
if (pos2 != POS_NUMBER) {
return ;
}
- if (anthy_get_seq_ent_wtype_freq(mw->wl->part[PART_CORE].seq,
- anthy_wtype_n10) &&
- anthy_get_seq_ent_wtype_freq(mw2->wl->part[PART_CORE].seq,
- anthy_wtype_n1)) {
- anthy_do_combine_metaword(sc, MW_NUM_XX, mw, mw2);
- }
+
+ anthy_do_combine_metaword(sc, MW_NUM_XX, mw, mw2);
}
+
/* 右隣のmetawordと結合できるかチェック */
static void
try_combine_metaword(struct splitter_context *sc,
@@ -401,7 +398,7 @@
try_combine_v_renyou_a(sc, mw1, mw2);
try_combine_v_renyou_noun(sc, mw1, mw2);
try_combine_noun_noun_postfix(sc, mw1, mw2);
- try_combine_10_1(sc, mw1, mw2);
+ try_combine_number(sc, mw1, mw2);
}
}
結果。失敗。大して変換効率上がらず。むー、難しいなぁ。10_1もやってもやらなくても大して変換効率上がらないっぽ。むしろ辞書をいぢった方がよい。「銭」より「千」の方が頻度低いってどういうことよ?とか。
しかしこのmetawordをくっつける作業、かなり重要である。これによって変換精度がかなり上がっている。もっと多くのパターンが必要なんじゃなかろうかなぁ。
ここで疑問点。mw1とmw2をくっつけた結果はもう一回try_combineすべきじゃないの?と思う。例えば「動詞連用形 + 名詞化接尾語」は「名詞」だ。今は一回combineしたら終わりになっているので再帰的にこれをしたら変換効率が上がるんじゃなかろうか。ちょっと挑戦してみるが、新しくできたmwのmw->wlはどっから構築したら良いのかわからず断念。
結局成果無しかい...初めて本格的にAnthyに突っ込んでみたがそこまで黒魔術とは思わなかったなぁ。なんとなくいぢれそうな予感がしなくも無いか。./src-splitterに関しては。辞書の方はやう゛ぁそうな雰囲気が漂ってます。。。
------
あ、後combineする時は i char_count - 1 までのmw探索で良いと思われます。i == sc->char_count - 1 の状況って後に繋げるmwのlength == 0ですからね...
diff -ur anthy-6024/src-splitter/metaword.c anthy-6024-devel/src-splitter/metaword.c
--- anthy-6024/src-splitter/metaword.c 2004-12-20 17:31:56.000000000 +0900
+++ anthy-6024-devel/src-splitter/metaword.c 2005-01-02 19:19:10.000000000 +0900
@@ -413,13 +413,13 @@
struct word_split_info_cache *info = sc->word_split_info;
/* metawordの左端によるループ */
- for (i = 0; i char_count; i++){
+ for (i = 0; i char_count - 1; i++){
struct meta_word *mw, *mw2;
/* 各metawordのループ */
for (mw = info->cnode[i].mw;
mw; mw = mw->next) {
/* metawordが右端に到達していなければ */
- if (mw->len + i char_count) {
+ if (mw->len + i char_count - 1) {
/* そのmetawordの右metawordのやつひとつと */
for (mw2 = info->cnode[mw->len+i].mw;
mw2; mw2 = mw2->next) {
hackありがとうございます (スコア:1)
Re:hackありがとうございます (スコア:1)
"仮名漢字変換エンジンはその我々の母国語である日本語をコンピュータ上で入力するのにどうしても必要なソフトウェアであり、真っ先に改良が進められるべきソフトウェアであるはずだからです。"って言葉には心が打たれましたよ。