namazu-ml(avocado)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: long katakana word and phrase search problem



Satoru Takabayashi <ccsatoru@xxxxxxxxxxxxxxxxxx> wrote:

>長いカタカナ語をわかち書きしてフレイズとして扱ったときに検索結果が
>不気味になってしまうという意見をもらいました。わかち書きもフレイズ
>検索もどちらも安易な実装なので仕方がないのですが、とりあえずカタカ
>ナ語のときはわかち書きしないというパッチを作りました。

ついでに、フレイズ検索の際の途中結果の出力を変えてみました。いまま
でだとフレイズの左から調べていってヒット数 0 の単語がみつかると

| % namazu '{isotarnet working}'
| 検索結果
| 
| 参考ヒット数:  {  [ isotarnet: 0  ]  :: 0 }
| 
| 検索式にマッチする項目はありませんでした。

のように途中で切っていたのですが、添付のパッチをあてると
 
| % namazu '{isotarnet working}'
| 検索結果
| 
| 参考ヒット数:  {  [ isotarnet: 0  ]  [ working: 1 ]  :: 0 }
| 
| 検索式にマッチする項目はありませんでした。

のように最後まで表示するようになります。たぶんこっちの方が望ましい
ので今後はそうすることにします。

-- Satoru Takabayashi

diff -c namazu-1.2.0.6/src/search.c namazu-1.2.0.7-beta-1/src/search.c
*** namazu-1.2.0.6/src/search.c	Tue Sep  8 00:42:01 1998
--- namazu-1.2.0.7-beta-1/src/search.c	Tue Sep  8 13:40:16 1998
***************
*** 310,315 ****
--- 310,318 ----
      int i, j, v, n, *list;
      long ptr;
  
+     if (val.n == 0) {
+         return val;
+     }
      ptr = get_index_pointer(PhraseIndex, hash_key);
      if (ptr <= 0) {
          val.n = 0;
***************
*** 388,395 ****
              } else {
                  val = andmerge(val, tmp, &ignore);
              }
!             if (val.n == 0)
  		break;
                  
              if (i != 0) {
  		strcpy(word_mix, word_b);
--- 391,401 ----
              } else {
                  val = andmerge(val, tmp, &ignore);
              }
! 
!             /*
!             if (val.n == 0)  
  		break;
+             */
                  
              if (i != 0) {
  		strcpy(word_mix, word_b);
diff -c namazu-1.2.0.6/src/wakati.c namazu-1.2.0.7-beta-1/src/wakati.c
*** namazu-1.2.0.6/src/wakati.c	Tue Sep  8 00:42:01 1998
--- namazu-1.2.0.7-beta-1/src/wakati.c	Tue Sep  8 13:40:16 1998
***************
*** 31,36 ****
--- 31,39 ----
  #include "util.h"
  
  #define iseuc(c)  ((c) >= 0xa1 && (c) <= 0xfe)
+ #define is_kanji(c)  (iseuc(*c) && iseuc(*(c+ 1)))
+ #define is_katakana(c)  ((int)*c >= 0xa5 && \
+                          (int)*(c + 1) >= 0xa0 && (int)*(c + 1) <= 0xff)
  
  void wakati(uchar *key)
  {
***************
*** 40,47 ****
      for (i = 0; i < strlen(key); i++) {
  	if (iseuc(*(key + i))) {
  	    key_leng = 0;
! 	    for (j = 0; iseuc(*(key + i + j)) 
! 		     && iseuc(*(key + i + j + 1)); j += 2) {
  		uchar tmp[BUFSIZ];
  
  		strncpy(tmp, key + i, j + 2);
--- 43,51 ----
      for (i = 0; i < strlen(key); i++) {
  	if (iseuc(*(key + i))) {
  	    key_leng = 0;
! 	    for (j = 0; is_kanji(key + i + j) && (!is_katakana(key + i + j));
!                  j += 2) 
!             {
  		uchar tmp[BUFSIZ];
  
  		strncpy(tmp, key + i, j + 2);
***************
*** 73,78 ****
--- 77,85 ----
      } else {
  	printf("wakatigaki processing failed.\n");
  	exit(1);
+     }
+     if (Debug) {
+         fprintf(stderr, "Wakatied STRING: [%s]\n", key);
      }
  }