Feature #1529

類似文書比較にて、トークンが多く含まれるでは無く、似ている文章のスコアを高くする

Added by Kentoku SHIBA about 5 years ago. Updated about 5 years ago.

Status:新規Start date:10/26/2012
Priority:NormalDue date:
Assignee:-% Done:

0%

Category:-
Target version:-

Description

mroonga2.07をラッパーモードで使用し、類似文書検索
機能で、テキストの近似値を取得したいと考えています。

そこで、質問なのですが、
「多く含まれる」ではなく「似ている」文書のスコアを高くできないものでしょうか?

具体的には、DBのmroongaテーブルのカラムに
「あああ」
「ああああああ」
と入っているとします。現在は「あああ」で検索すると、スコアは
「ああああああ」のほうが高く取得します。
完全一致している「あああ」のスコアを最高スコアになるように出来ないでしょうか?

History

#1 Updated by Kentoku SHIBA about 5 years ago

速度への影響がどのくらいになるかは試していないのですが、以下
のようなSQLでとりあえず動きました。

  SELECT *,
         MATCH (column_name) AGAINST ("あああ")
         FROM table_name
         WHERE
           MATCH (column_name) AGAINST ("あああ")
         ORDER BY
           column_name = "あああ" DESC,
           MATCH (column_name) AGAINST ("あああ") DESC
         LIMIT 10;

ヒットするレコード数が多くなるとつらくなるかもしれません
が。。。

#2 Updated by Kentoku SHIBA about 5 years ago

完全一致のみスコアが高ければ良い場合は、以下のように書くことができます。

IF(column_name = 'あああ', とても大きな値, MATCH (column_name) AGAINST ('あああ'))

「似ている」文書をスコアで考える場合、完全一致したスコアを基準に そのスコアに近いスコアのものが、より似ていると考えることもできるかと思われます。 これをmroongaで実現するには、完全一致を求めるUDF(ここでは仮にnewudf()とします)などを 作成し、以下のようなSQLを実行すればよいと考えられます。

  SELECT
    ABS(MATCH (column_name) AGAINST ('あああ') - newudf('あああ')) score
  FROM
    table_name
  WHERE
    MATCH (column_name) AGAINST('あああ')
  ORDER BY
    score
  ;
scoreが0に近い方を、より「似ている」と判断します。

Also available in: Atom PDF