# groonga - オープンソースのカラムストア機能付き全文検索エンジン

- English

# 7.11.3.2. `scorer_tf_idf`

バージョン 5.0.1 で追加.

## 7.11.3.2.1. 概要

`scorer_tf_idf` は TF-IDF （term frequency-inverse document frequency。その文書中での単語の出現数を、その単語を文書の数で割ったもの）ベースのスコアー関数です。

簡単に言うと、TF-IDFとはTF（term frequency。その文書中での単語出現数）をDF（document frequency。その単語を含むドキュメント数）で割ったものです。「TF」は「単語がたくさん出現している方がより重要」という意味を表します。「TFをDFで割る」というのは「重要な単語がたくさん出現している方がより重要」という意味を表します。

Groongaのデフォルトのスコアー関数はTF（term frequency。単語の出現数）です。この関数は単語の重要度は考慮しませんが高速です。

TF-IDFは単語の重要度を考慮しますが、TFより遅くなります。

TF-IDFは多くの場合でTFよりも適切なスコアーを計算しますが、完璧ではありません。

「They are keyword, keyword, keyword ... and keyword」のように文書中に同じキーワードがたくさん含まれている場合、TFでもTF-IDFでもスコアーが増えます。検索エンジンのスパマーはこのテクニックを使うかもしれません。しかし、TF-IDFはこのテクニックを防ぐことができません。

Okapi BM25 はこのケースを解決できます。しかし、TF-IDFよりも遅くなります。また、Groongaではまだ実装されていません。

Groongaは scorer_tf_at_most スコアラーという別の方法でこのケースを解決できるスコアラーを提供しています。

> スコアー関数だけでスコアの計算をする必要はありません。スコアー関数は検索クエリーに非常に依存しています。検索クエリーだけでなく、マッチしたレコードのメタデータも使えないか検討しましょう。

> たとえば、Googleはスコアーの計算に ページランク を使っています。あなたも、データの種類（たとえば、「メモ」データよりも「タイトル」データの方が重要など）、タグ、位置情報などを使えないか検討してみましょう。

> スコアーの計算をスコアー関数だけで考えることはやめましょう。

## 7.11.3.2.2. 構文

このスコアラーの引数は1つです。:

    scorer_tf_idf(column)
    scorer_tf_idf(index)

## 7.11.3.2.3. 使い方

このセクションではscorerの使い方について説明します。

使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。

サンプルスキーマ:

実行例:

    table_create Logs TABLE_NO_KEY
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Logs message COLUMN_SCALAR Text
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    table_create Terms TABLE_PAT_KEY ShortText \
      --default_tokenizer TokenBigram \
      --normalizer NormalizerAuto
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Terms message_index COLUMN_INDEX|WITH_POSITION Logs message
    # [[0, 1337566253.89858, 0.000355720520019531], true]

サンプルデータ:

実行例:

    load --table Logs
    [
    {"message": "Error"},
    {"message": "Warning"},
    {"message": "Warning Warning"},
    {"message": "Warning Warning Warning"},
    {"message": "Info"},
    {"message": "Info Info"},
    {"message": "Info Info Info"},
    {"message": "Info Info Info Info"},
    {"message": "Notice"},
    {"message": "Notice Notice"},
    {"message": "Notice Notice Notice"},
    {"message": "Notice Notice Notice Notice"},
    {"message": "Notice Notice Notice Notice Notice"}
    ]
    # [[0, 1337566253.89858, 0.000355720520019531], 13]

match_columns の中で `scorer_tf_idf` を次のようにして指定できます:

実行例:

    select Logs \
      --match_columns "scorer_tf_idf(message)" \
      --query "Error OR Info" \
      --output_columns "message, _score" \
      --sort_keys "-_score"
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         5
    #       ],
    #       [
    #         [
    #           "message",
    #           "Text"
    #         ],
    #         [
    #           "_score",
    #           "Int32"
    #         ]
    #       ],
    #       [
    #         "Info Info Info Info",
    #         3
    #       ],
    #       [
    #         "Error",
    #         2
    #       ],
    #       [
    #         "Info Info Info",
    #         2
    #       ],
    #       [
    #         "Info Info",
    #         1
    #       ],
    #       [
    #         "Info",
    #         1
    #       ]
    #     ]
    #   ]
    # ]

`Info Info Info` には `Info` という単語が3回もでてきますが、 `Info Info Info` も `Error` もどちらもスコアーは `2` です。なぜなら、 `Error` は `Info` よりもより重要な単語だからです。 `Info` を含むドキュメントの数は `4` です。 `Error` を含むドキュメントの数は `1` です。少しのドキュメントにしか含まれていない単語はより特徴的な単語です。特徴的な単語は重要な単語です。

## 7.11.3.2.4. 引数

このセクションではすべての引数について説明します。

### 7.11.3.2.4.1. 必須引数

必須の引数は1つです。

#### 7.11.3.2.4.1.1. `column`

マッチ対象のデータカラムです。このデータカラムにはインデックスが張られていなければいけません。

#### 7.11.3.2.4.1.2. `index`

検索に使うインデックスカラムです。

### 7.11.3.2.4.2. 省略可能引数

省略可能な引数はありません。

## 7.11.3.2.5. 戻り値

このスコアラーは Float32 でスコアーの値を返します。

select は `Float` ではなく `Int32` で `_score` を返します。これは、後方互換性を維持するために `Float` から `Int32` にキャストしているためです。

スコアーはTF-IDFベースのアルゴリズムで計算します。

## 7.11.3.2.6. 参考

- スコアラー