「佐藤 豊」で検索すると、「佐藤豊」という文字列が検索できないという 問題があって気になってたので(^^)、修正しました。 要するに「豊」で検索できない、ということで、一般的には、日本語文字列 の最後の文字を単独では検索できない、ということです。 これは、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; }