[groonga-dev,02820] Re: IN NATURAL LANGUAGE MODEにおける検索スコア

Back to archive index

Kouhei Sutou kou****@clear*****
2014年 9月 27日 (土) 14:26:31 JST


須藤です。

In <54256****@fdiar*****>
  "[groonga-dev,02818] Re: IN NATURAL LANGUAGE MODEにおける検索スコア" on Fri, 26 Sep 2014 15:45:39 +0200,
  Kazuhiko <kazuh****@fdiar*****> wrote:

>>>> 「boolean」ってスコアは小さめっていう意味合いもあったんでし
>>>> たっけ。私は、ANDとかORを使って検索できる、っていう意味なの
>>>> かなぁと思っていました。
>>>
>>> boolean、つまり「あったらTrue、なかったらFalse」で、Trueの数を返すものだ
>>> と思っていました。少なくともMyISAMだとそうです。
>> 
>> それでORは説明できると思いますが、ANDが説明できないような。。。
> 
> おっしゃるとおり。。。
> ということは、「natural language modeでは期待されるスコアとして類似度が
> 考えられるが、boolean modeでは0かそうでないかが返ることが重要で、スコア
> の値にそれ以上の何が期待されるかはよくわからない」ということでしょうか。

うーん、なんか、かずひこさん、考えが発散しちゃっているのかなぁ
という気がしました。整理したほうがよいのかも。

まず、WHEREにMATCH AGAINSTを指定せずに、SELECT MATCH AGAINST
でスコアだけを使うというのは考えないほうがよいと思います。そ
ういう使い方をしたいケースってあります?

で、「0かそうじゃないか」みたいに考えずに、「マッチするかど
うか」で考えたほうがよいと思います。検索というのは「指定した
条件にマッチしたものを選択する」っていう処理ですよね。そのレ
ベルで考えると「0かそうじゃないか」はもっと下のレイヤーでの
話で、「マッチするかどうか」で考えるときは気にするべきでない
ことだと思います。(せっかくの抽象化しているのに詳細が漏れ出
している。)

で、スコアは「マッチした度合い」(求める文書に近い度合い)だ
と思います。そして、それは絶対的な値であることが重要ではなく、
相対的な値であることが重要だと思います。例えば、文書Aのスコ
アが10で、文書Bのスコアが5であることが重要なのでなく、文書A
の方が文書Bよりも求める文書に近そうだ、ということが重要だと
いうことです。

# もう完全に余談ですけど、BOOLEAN MODEって論理演算を使うモー
# ド(ANDとかORを使うモード)であっているんじゃないかと思う
# うんですよねぇ。論理演算のことをboolean operationともいう
# らしいですし。
#    http://ja.wikipedia.org/wiki/%E8%AB%96%E7%90%86%E6%BC%94%E7%AE%97

> それでも、Mroongaのboolean modeでは「各キーワードが出現した数の合計、た
> だしANDやNOT等の条件を満たさない場合は無条件にゼロ」みたいに何らかの仕様
> が明記してあると安心して利用できる気がします。もちろん、「0かそうでない
> か以上の意味は期待できない」という仕様もありでしょう。その場合は、「じゃ
> あ、ソートしなくていいね」という判断ができますし。

スコアは求める文書に近い度合いなのでソートする意味があります。

>>>> もしかしたら、なんですけど、かずひこさんが求めている挙動って
>>>>
>>>>   "word1 word2 word3" IN BOOLEAN MODE
>>>>
>>>> (word1 OR word2 OR word3)だったりしないかなぁと思いました。
>>>
>>> 求めている挙動は、「適当にキーワードを多めにつっこんだら、いい感じのスコ
>>> アでソートされて返ってくる」です。
>>>
>>> 上述の仕様の違いで、Mroonga in boolean modeは、MyISAM in boolean modeよ
>>> りはましな結果になりそうですが、やっぱりキーワードごとの重みが考慮される
>>> ほうが「いい感じのスコアでソート」になりそうなので、(word1 OR word2 OR
>>> word3)だとあまり嬉しくありません。以下、比較実験しました。
>> 
>> 例を示してくれてありがとうございます!
>> ただ、この例だとどのcontentが上位にくるのが妥当なのかわから
>> ないので、「望ましい挙動」がわからないなぁと思いました。
>> 「fine tomorrow bell」で検索したら「Ring the bell.」が一番上
>> 位になってうれしい。。。の?みたいな感じです。
> 
> まあ、あれは例が極端なので、bellだけが突出して高い重みを持ってしまってい
> ますが、でも「TD-IDFはそういうもの」なんじゃないでしょうか。 :)

こっちも、かずひこさんの考えが発散しちゃっているのかなぁと思
いました。「いい感じのスコアでソート」を考えるならやっぱり
「いい感じはこういうこと」というのを決めないと評価できないと
思います。


それはそれとして、気になったんですけど、NATURAL LANGUAGE
MODEをキーワードを突っ込む感じで使おうとしています?それは期
待した使い方と違うんじゃないかと思いました。NATURAL LANGUAGE
MODEというだけあって、普通の文章を突っ込むものだと思うんです
よ、これ。

  I want to do full-text search in MySQL

みたいに普通の文章を突っ込んでそれと似たような文書を探すもの
じゃないですかねぇ。

  http://dev.mysql.com/doc/refman/5.6/en/fulltext-natural-language.html

の説明にははっきりとそうは書かれていませんけど、

 SELECT id, body,
    MATCH (title,body) AGAINST
      ('Security implications of running MySQL as root'
       IN NATURAL LANGUAGE MODE) AS score
    FROM articles
    WHERE MATCH (title,body) AGAINST
      ('Security implications of running MySQL as root'
       IN NATURAL LANGUAGE MODE);

みたいな利用例も載っていますし。

もし、↑みたいな普通の文章でなく、すでにキーワードの集まりに
なっているなら、NATURAL LANGUAGE MODEや類似文書検索(類似文
書検索なので、こっちも入力は文書を期待)ではなく、単にOR検索
でよいのではないかと思うんですよねぇ。


架空の例ではなく、実際のデータで試してみたほうがもっと地に足
の着いた検討ができるんじゃないかと思いました。


-- 
須藤 功平 <kou****@clear*****>
株式会社クリアコード <http://www.clear-code.com/>

Groongaベースの全文検索システムを総合サポート:
  http://groonga.org/ja/support/
パッチ採用 - プログラミングが楽しい人向けの採用プロセス:
  http://www.clear-code.com/recruitment/
コードリーダー育成支援 - 自然とリーダブルコードを書くチームへ:
  http://www.clear-code.com/services/code-reader/




groonga-dev メーリングリストの案内
Back to archive index