Article freyasx/75 of [1-99] on the server localhost:7119
  upper oldest olders older1 this newer1 newers latest
search
[Top/Up] [oldest] - [Older+chunk] - [Newer+chunk] - [newest + Check]

Newsgroups: mail-lists.freyasx

[FreyaSX] 「佐藤 豊」問題の解決
11 Jan 2006 01:34:01 GMT ysato@delegate.org (Yutaka Sato)
The DeleGate Project

「佐藤 豊」で検索すると、「佐藤豊」という文字列が検索できないという
問題があって気になってたので(^^)、修正しました。

要するに「豊」で検索できない、ということで、一般的には、日本語文字列
の最後の文字を単独では検索できない、ということです。

これは、Freyaでは「佐藤豊」は[佐藤][藤豊]と分解されて索引化され
るため、このような文字列中の「豊」を検索するには、例えば「*豊」という
ような検索が必要になり、そのような検索は(問い合わせ時に自動的にその
ような検索を試行するという解法もあるとは思いますが)(まだ)実装されて
いません。

そこで、単に[佐藤][藤豊][豊]のように、最後の一文字も索引化するように
しました。変更は、同封のパッチのようになります。この部分は基本的に、
原田さんのオリジナルFreyaのままです。単語が辞書にあった場合、その
単語の最後の1文字を索引化することは、おそらく、あまり意味が無いか
望ましくないかも知れないことなのでしょう。しかし、辞書にない語の場合、
特に現在のFreyaSXのように辞書を使わない場合、これは単独で検索対象と
すべき場合が少なくないのではないかと思われます。洩れがあるよりは、
余分に引っかかるほうが良いですしね。

これによって、索引ファイル群は多少大きくなりますが、DeleGate-MLの例で
みると、サイズの増加は、

  .ctx: 38749196  ->  41743920  1.077
  .idx: 27101309  ->  29068627  1.072
  .lex:  4577583  ->   4588889  1.002

という感じで、数%程度ですので、まあ構わないでしょう。

                   D G  
┌─┐┬┌──┬┐ //\^^ ( - ); {Do the more with the less -- B. Fuller}
├─┤│└─┐│ / 877m\_<   >_ <URL:http://www.delegate.org/delegate/>
┴ └┴──┘┴──────────────────────────────
佐藤豊@情報技術研究部門.産業技術総合研究所(独立行政法人)


diff -cr freyasx-0.99.13/freya/src/WordBreaker.cc ./freya/src/WordBreaker.cc
*** freyasx-0.99.13/freya/src/WordBreaker.cc	Tue Oct  4 00:38:06 2005
--- ./freya/src/WordBreaker.cc	Wed Jan 11 09:57:52 2006
***************
*** 42,47 ****
--- 42,49 ----
      Pat_node *prefixes[MAXPREFIXES];
      const char *cp = text;
      const char *cpforward = cp; // 登録済みの部分
+     int prevMatchNum = 0;
+ 
      while(*cp && *(cp + 1)){
          int matchNum = morphdic.search_prefix(cp, prefixes);
          char *kstr = 0;
***************
*** 55,61 ****
--- 57,69 ----
          if(matchNum == 0
             || 0 < klen && klen <= 4 ){ // 4 にすべきか?
              if(*(cp + 2) == '\0'){ // 最後の一文字
+ /*
                  if(cpforward < cp + 2){
+ */
+                 if(cpforward < cp + 2
+ 		 || prevMatchNum == 0 /* the prev. word is not in dict. */
+ 		 && cpforward == cp + 2
+ 		){
                      char sbuf[3];
                      Word term(cp, 2, sbuf,sizeof(sbuf));
                      bag[term] += toPos(ectx,offset);
***************
*** 89,94 ****
--- 97,103 ----
              cpforward = cp;
              offset += klen;
          }
+         prevMatchNum = matchNum;
      }
      return bag.size() - from;
  }

  admin search upper oldest olders older1 this newer1 newers latest
[Top/Up] [oldest] - [Older+chunk] - [Newer+chunk] - [newest + Check]
@_@V