PostgreSQL 9.3 で GIN/GiST インデックスを使用した全文検索で tf-idf (用語頻度-逆ドキュメント頻度) を使用しているかどうかを知りたいです。
特に、フレーズのコラムでは、より一般的な単語がいくつかありますが、非常にユニークな単語 (名前など) もあります。これらの列にインデックスを付けて、一致した一意の単語が一般的な単語よりも重み付けされるようにします。
PostgreSQL 9.3 で GIN/GiST インデックスを使用した全文検索で tf-idf (用語頻度-逆ドキュメント頻度) を使用しているかどうかを知りたいです。
特に、フレーズのコラムでは、より一般的な単語がいくつかありますが、非常にユニークな単語 (名前など) もあります。これらの列にインデックスを付けて、一致した一意の単語が一般的な単語よりも重み付けされるようにします。
いいえ。ts_rank 関数内には、グローバル (コーパス) 頻度を使用して結果をランク付けするネイティブな方法はありません。ただし、ランク アルゴリズムは、ドキュメント内の頻度に基づいてランク付けします。
http://www.postgresql.org/docs/9.3/static/textsearch-controls.html
したがって、「dog|chihuahua」を検索すると、「chihuahua」という単語の頻度が比較的低いにもかかわらず、次の 2 つのドキュメントは同じランクになります。
"I want a dog"
"I want a chihuahua"
ただし、次の行は、語幹処理されたトークン「dog」がドキュメントに 2 回含まれているため、上記の前の 2 行よりもランクが高くなります。
"dog lovers have an average of 1.5 dogs"
要するに、ドキュメント内の用語頻度が高いほどランクが高くなりますが、コーパス内の用語頻度が低くても影響はありません。
1 つの注意点: テキスト検索はストップワードを無視するため、「the」、「a」、「of」、「for」などの超高頻度の単語には一致しません (言語を正しく設定していると仮定します)。
Postgres はドキュメント間の類似度として TF-IDF を使用しません。
ts_rank
ドキュメントにクエリ用語が含まれる頻度が高いほど、値は高くなります。用語の世界的な頻度は考慮されていません。
ts_rank_cd
ドキュメントにクエリ用語がより近く、より頻繁に含まれている場合、より高くなります。用語の世界的な頻度は考慮されていません。
smlarと呼ばれるテキスト検索作成者からの拡張機能があり、TF-IDF を使用して配列間の類似度を計算できます。また、tsvectors を配列に変換し、高速なインデックス作成をサポートします。
多くの場合。詳細はhttp://www.postgresql.org/docs/9.1/static/textsearch-controls.htmlで説明されています
基本的な問題は、頻度という用語は、インデックスを作成しているコーパスに基づいたものではなく、辞書に設定されていることです。つまり、適切に言語を選択する限り、問題ないように思えます。