パスワードを忘れた? アカウント作成
587484 journal

kzkの日記: 黒魔術を習ってみる 2

日記 by kzk

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) {

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • まさかここまでして下さるとは思っていなかったので、驚きです。 昔はmwを複数回combineするのは色々と問題があったらしいのですが、今はもう特に制限はないので、そのあたりから改善していこうと思います。 辞書周りは…僕にとってもカオスです^^;
    • hackの実質的な成果はほとんど無いに等しいんですけどね(^_^;

      "仮名漢字変換エンジンはその我々の母国語である日本語をコンピュータ上で入力するのにどうしても必要なソフトウェアであり、真っ先に改良が進められるべきソフトウェアであるはずだからです。"って言葉には心が打たれましたよ。
      親コメント
typodupeerror

UNIXはシンプルである。必要なのはそのシンプルさを理解する素質だけである -- Dennis Ritchie

読み込み中...