namazu-ml(avocado)


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

Re: Namazu v1.2.0.7 released!



kenzo-@xxxxxxxxxx (Ken-ichi Hirose) wrote:

><UEL:http://www.tama.or.jp/%7Ekenzo-/Namazu/nmz1207.exe>

これを貰ってきて Namazuのペイジに OS/2版とともに置いておきました。


>で、完結にしたい所を誠に申し訳ありませんが、挙動がおかしい現象に
>出食わしてしまったので御報告致します。。。

v1.2.0.x もしばらくはメンテナンスをつづけるのでバグを見つけたら報
告して頂ければ助かります。


>Win32 では command line で
>
>c:\>namazu "試してみよう"
>
>とやってもわかち書きされずに
>
>	:
>参考ヒット数: [ 試してみよう: 0 ] 

これはそうなるでしょうね。ひらがな部分はわかち書きされないようにし
たので。送り仮名のことは考えていなかったので「試し」を認識しないよ
うです。ちょっとまずいですね。


>となってしまいます。しかし cgi で実行すると
>
>	:
>参考ヒット数: {[ 試し: 4 ] [ てみよう: 1 ] ::1 }

これは何かの間違いでしょう。ヴァージョンが違うのではないですか?


>これが「検索の方法」だと正常にわかち書きされてフレーズ検索となります。?_?
>source は。。。まだ見てません。_o_

わかち書きにはあまり期待しない方が良いです。漢字のみからなるフレイ
ズに関してはそこそこまともに分割してくれますが、漢字/ひらがな/カタ
カナが混じると弱くなります。

統計を取ったわけではありませんが、検索語のわかち書きが必要な場合は
それほど多くないと思うのでそれなりにいい加減な処理でもいいんじゃな
いかと思っています。

# わかち書きを真剣に取り組もうと思ったらそれだけで一つの大きな課題
# になりますよね。


前述の送り仮名については対応してみたのでパッチをつけておきます。気
になる方はお試しください。

-- Satoru Takabayashi

diff -c namazu-1.2.0.7/src/cgi.c namazu-1.2.0.8-beta-1/src/cgi.c
*** namazu-1.2.0.7/src/cgi.c	Thu Sep 17 19:04:50 1998
--- namazu-1.2.0.8-beta-1/src/cgi.c	Fri Sep 18 04:56:16 1998
***************
*** 62,68 ****
      /* note that CERN HTTPD would add empty PATH_INFO */
      if (getenv("PATH_INFO")) {
          char *path_info = getenv("PATH_INFO");
!         if (strlen(path_info) > 0) {
              sprintf(tmp, "%s%s", DEFAULT_DIR, path_info);
              if ((uchar *) NULL ==
                  (DbNames[DbNumber] = (uchar *) malloc(strlen(tmp) + 1)))
--- 62,68 ----
      /* note that CERN HTTPD would add empty PATH_INFO */
      if (getenv("PATH_INFO")) {
          char *path_info = getenv("PATH_INFO");
!         if (strlen(path_info) > 0 && strlen(path_info) < 128) {
              sprintf(tmp, "%s%s", DEFAULT_DIR, path_info);
              if ((uchar *) NULL ==
                  (DbNames[DbNumber] = (uchar *) malloc(strlen(tmp) + 1)))
diff -c namazu-1.2.0.7/src/search.c namazu-1.2.0.8-beta-1/src/search.c
*** namazu-1.2.0.7/src/search.c	Thu Sep 17 19:04:50 1998
--- namazu-1.2.0.8-beta-1/src/search.c	Fri Sep 18 04:56:16 1998
***************
*** 378,387 ****
      if (!MoreShortFormat) {
          printf(" { ");
      }
      for (i = 0; ;i++) {
          q = strchr(p, '\t');
          if (q) 
!             *q = (uchar)NULL;
          if (strlen(p) > 0) {
              HLIST tmp;
  
--- 378,390 ----
      if (!MoreShortFormat) {
          printf(" { ");
      }
+     while (*p == '\t') {  /* beggining tabs are skipped */
+         p++;
+     }
      for (i = 0; ;i++) {
          q = strchr(p, '\t');
          if (q) 
!             *q = '\0';
          if (strlen(p) > 0) {
              HLIST tmp;
  
diff -c namazu-1.2.0.7/src/wakati.c namazu-1.2.0.8-beta-1/src/wakati.c
*** namazu-1.2.0.7/src/wakati.c	Thu Sep 17 19:04:50 1998
--- namazu-1.2.0.8-beta-1/src/wakati.c	Fri Sep 18 04:56:16 1998
***************
*** 52,75 ****
      return 0;
  }
  
  void wakati(uchar *key)
  {
!     int i, j, key_leng;
      uchar buf[BUFSIZE * 2] = "";
  
      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) 
!                          && !is_hiragana(key + i + j);  j += 2)
              {
  		uchar tmp[BUFSIZE];
  
  		strncpy(tmp, key + i, j + 2);
  		*(tmp + j + 2) = '\0';
  
! 		if (binsearch(tmp) != -1) {
! 		    key_leng = j + 2;
  		}
  	    }
  	    if (key_leng > 0) {
--- 52,100 ----
      return 0;
  }
  
+ #define ASCII 0
+ #define KANJI 1
+ #define KATAKANA 2
+ #define HIRAGANA 3
+ 
+ int detect_code_type(uchar *c)
+ {
+     if (is_hiragana(c)) {
+         return HIRAGANA;
+     } else if (is_katakana(c)){
+         return KATAKANA;
+     } else if (is_kanji(c)) {
+         return KANJI;
+     }
+     return ASCII;
+ }
+ 
  void wakati(uchar *key)
  {
!     int i, j;
!     int prev = 0, current = 0;
      uchar buf[BUFSIZE * 2] = "";
  
      for (i = 0; i < strlen(key); i++) {
+         current = detect_code_type(key + i);
  	if (iseuc(*(key + i))) {
!             int key_leng = 0;
! 
! 	    for (j = 0; is_kanji(key + i + j) ;  j += 2)
              {
  		uchar tmp[BUFSIZE];
  
+                 if (j == 0 && (is_katakana(key + i + j) ||
+                     is_hiragana(key + i + j))) 
+                 {
+                     /* if beggining character is Katakana or Hiragana */
+                     break;
+                 }
  		strncpy(tmp, key + i, j + 2);
  		*(tmp + j + 2) = '\0';
  
! 		if (binsearch(tmp) != -1) { /* hit */
! 		    key_leng = j + 2; 
  		}
  	    }
  	    if (key_leng > 0) {
***************
*** 77,104 ****
  		    strcat(buf, "\t");
  		}
  		strncat(buf, key + i, key_leng); 
! 		if (*(key + i + key_leng) != '\0') {
! 		    strcat(buf, "\t");
! 		}
  		i += key_leng - 1;
  	    } else {
  		strncat(buf, key + i, 2);
  		i++;
  	    }
  	} else {
!             if (i > 0 && iseuc(*(key + i - 1))) {
                  strcat(buf, "\t");
              }
              while(*(key + i) && !iseuc(*(key + i))) {
                  strncat(buf, key + i, 1);
                  i++;
              }
!             if (*(key + i)) {
!                 strcat(buf, "\t");
!             }
              i--;
! 	}
      }
      if (strlen(buf) <= BUFSIZE) {
  	strcpy(key, buf);
      } else {
--- 102,133 ----
  		    strcat(buf, "\t");
  		}
  		strncat(buf, key + i, key_leng); 
!                 strcat(buf, "\t");
  		i += key_leng - 1;
  	    } else {
+                 if (prev != current
+                     && strlen(buf) != 0 && *(buf + strlen(buf) -1) != '\t') 
+                 {
+ 		    strcat(buf, "\t");
+                 }
  		strncat(buf, key + i, 2);
  		i++;
  	    }
  	} else {
!             if (i > 0) {
                  strcat(buf, "\t");
              }
              while(*(key + i) && !iseuc(*(key + i))) {
                  strncat(buf, key + i, 1);
                  i++;
              }
!             strcat(buf, "\t");
              i--;
!         }
!         prev = current;
      }
+     chop(buf);
+ 
      if (strlen(buf) <= BUFSIZE) {
  	strcpy(key, buf);
      } else {