In message <_A75@freyasx.ML_> on 01/11/06(10:33:55) I wrote: |「佐藤 豊」で検索すると、「佐藤豊」という文字列が検索できないという |問題があって気になってたので(^^)、修正しました。 | |要するに「豊」で検索できない、ということで、一般的には、日本語文字列 |の最後の文字を単独では検索できない、ということです。 | |これは、Freyaでは「佐藤豊」は[佐藤][藤豊]と分解されて索引化され |るため、このような文字列中の「豊」を検索するには、例えば「*豊」という |ような検索が必要になり、そのような検索は(問い合わせ時に自動的にその |ような検索を試行するという解法もあるとは思いますが)(まだ)実装されて |いません。 | |そこで、単に[佐藤][藤豊][豊]のように、最後の一文字も索引化するように |しました。変更は、同封のパッチのようになります。この部分は基本的に、 ということで、前回の変更により、以下のようになりました。 (0) [佐藤豊]のような文字列の最後の1文字[豊]も索引化する この変更の結果、『単独での[豊]が索引中に存在すると、「豊」での検索に対して、 [豊な]のようなものが引っかからなくなる』という問題が起こりました。 「豊*」で検索してやれば、この問題は無いのですが、単独の[豊]が索引中にあるか ないかで、[豊]を含む文字列の検索の仕方が変わってしまうことになり、それ では困ります。 そもそも、これらはオリジナルFreyaでは必ず「豊*」と検索しなければならな かったものですが、FreyaSX/0.99.13 で (1) 「検索語」で一つもヒットしなかったら「検索語*」として自動再検索する という改変をしたため、* なしで引けるようになったものです。 このような自動的な再検索をしないよう、たとえば「豊$」のように明示する機能 が必要かも知れません。。。と思ったら、この拡張はフレーズ検索に対しては 行っていないので「"豊"」としてやればOKですね。 さて、今回見つかった問題は、 (2) 「豊」一文字だけでヒットしてしまうと、(1)の自動再検索機能が働かない ということです。これは、前述のパッチのために発生頻度が高くなった(1文字の 索引の頻度が増えたため)ことは確かなのですが、もともと起こり得たことです。 (例:形態素辞書を使って[行政法人]が[行政法][人]に分割された時など) そこで、解決法として、 (3) 検索語が一文字だけの場合には、必ず * 付きで検索するようにする ということにしました。 変更点は、同封のパッチのようになります。 −− ・複数文字の場合、1文字ずつずらしながら2文字つづつマッチして行くので、 1文字だけの場合だけが、この問題の対象になります。 ・(1)の「検索語の自動的な*拡張は」もともと形態素辞書を使って長い語として 作られた索引語に対して、その部分列を検索するために導入したものですが、 形態素辞書を使わない場合には必要ないのではないかと思っていましたが、 結局少し形を変えて必要ということになったのでした。 ・索引作成時に「豊 」で登録する、というのも手かと思いましたが、 形態素辞書を使った場合には1文字での索引も作られるので、結局検索時に (3)のように対処する必要はあるようです。 ・1文字がひらがなやカタカナ一文字の場合には、索引化しないようにすれば 索引は小さくなるとは思いますが、そのような1文字の検索をしたいことも あるので、前回の (0) のパッチのままにします。 D G ┌─┐┬┌──┬┐ //\^^ ( - ); {Do the more with the less -- B. Fuller} ├─┤│└─┐│ / 877m\_< >_ <URL:http://www.delegate.org/delegate/> ┴ └┴──┘┴────────────────────────────── 佐藤豊@情報技術研究部門.産業技術総合研究所(独立行政法人) diff -cr5 freyasx-0.99.13/freya/src/Query.cc ./freya/src/Query.cc *** freyasx-0.99.13/freya/src/Query.cc Mon Oct 10 10:59:11 2005 --- ./freya/src/Query.cc Thu Jan 12 21:25:36 2006 *************** *** 123,132 **** --- 123,137 ---- if(NULL == word) return NULL; /* return ret.retrieve(word, resultLen, type, isprefixsearch); */ Result *result; + if( (word[0] & 0x80) && (word[1] & 0x80) && (word[2] == 0) ){ + /* a single Japanese charcter */ + result = ret.retrieve(word, resultLen, type, 1); + return result; + } result = ret.retrieve(word, resultLen, type, isprefixsearch); if( resultLen == 0 && (word[0] & 0x80) ){ /* automatially retry prefix-search for Japanese word */ result = ret.retrieve(word, resultLen, type, 1); }