カテゴリ:

集計関数 (類似度推定)、 ウィンドウ関数

APPROXIMATE_SIMILARITY

MinHash 状態に基づいて、入力の類似度(Jaccardインデックス)の推定値を返します。 MinHash 状態の詳細については、 2つ以上のセットの類似性の推定 をご参照ください。

エイリアス:

APPROXIMATE_JACCARD_INDEX

こちらもご覧ください:

MINHASHMINHASH_COMBINE

構文

APPROXIMATE_SIMILARITY( [ DISTINCT ] <expr> [ , ... ] )

APPROXIMATE_SIMILARITY(*)

引数

式は、 MINHASH 関数の呼び出しによって返される1つ以上の MinHash 状態でなければなりません。つまり、式は MinHash 状態情報である必要があり、おおよその類似性が必要な列または式ではありません。(以下の例はこれを明確にするのに役立ちます)

MinHash 状態の詳細については、 2つ以上のセットの類似性の推定 をご参照ください。

戻り値

0.0~1.0(この値を含む)の間の浮動小数点数。1.0はセットが同一であることを示し、0.0はセットにオーバーラップがないことを示します。

使用上の注意

  • DISTINCT を引数として含めることができますが、効果はありません。

  • 入力 MinHash 状態には、等しい長さの MinHash 配列が必要です。

  • 入力 MinHash 状態の配列の長さは、近似値の品質の指標です。

    関数 MINHASH で使用され る k の値が大きいほど、近似値は良くなります。ただし、この値は、類似性を推定するための計算時間に線形の影響を及ぼします。

USE SCHEMA snowflake_sample_data.tpch_sf1;

SELECT APPROXIMATE_SIMILARITY(mh) FROM
    (
      (SELECT MINHASH(100, C5) mh FROM orders WHERE c2 <= 50000)
         UNION
      (SELECT MINHASH(100, C5) mh FROM orders WHERE C2 > 50000)
    );

+----------------------------+
| APPROXIMATE_SIMILARITY(MH) |
|----------------------------|
|                       0.97 |
+----------------------------+

こちらは、3つの関連する関数 MINHASHMINHASH_COMBINEAPPROXIMATE_SIMILARITY を示す、より広範な例です。この例では、3つのテーブル(ta、tb、tc)を作成します。そのうちの2つ(ta、tb)は類似しており、そのうちの2つ(ta、tc)は完全に異なります。

値が含まれるテーブルを作成および生成します。

CREATE TABLE ta (i INTEGER);
CREATE TABLE tb (i INTEGER);
CREATE TABLE tc (i INTEGER);

-- Insert values into the 3 tables.
INSERT INTO ta (i) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
-- Almost the same as the preceding values.
INSERT INTO tb (i) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (11);
-- Different values and different number of values.
INSERT INTO tc (i) VALUES (-1), (-20), (-300), (-4000);

データの初期セットのMinHash情報を計算します。

CREATE TABLE minhash_a_1 (mh) AS SELECT MINHASH(100, i) FROM ta;
CREATE TABLE minhash_b (mh) AS SELECT MINHASH(100, i) FROM tb;
CREATE TABLE minhash_c (mh) AS SELECT MINHASH(100, i) FROM tc;

テーブルのいずれかにデータを追加します。

INSERT INTO ta (i) VALUES (12);

MINHASH_COMBINE 関数のデモ:

-- Record minhash information about only the new rows:
CREATE TABLE minhash_a_2 (mh) AS SELECT MINHASH(100, i) FROM ta WHERE i > 10;

-- Now combine all the minhash info for the old and new rows in table ta.
CREATE TABLE minhash_a (mh) AS
  SELECT MINHASH_COMBINE(mh) FROM
    (
      (SELECT mh FROM minhash_a_1)
      UNION ALL
      (SELECT mh FROM minhash_a_2)
    );

このクエリは、2つの類似したテーブル(ta、tb)のおおよその類似性を示しています。

SELECT APPROXIMATE_SIMILARITY (mh) FROM
  (
    (SELECT mh FROM minhash_a)
    UNION ALL
    (SELECT mh FROM minhash_b)
  );
+-----------------------------+
| APPROXIMATE_SIMILARITY (MH) |
|-----------------------------|
|                        0.75 |
+-----------------------------+

このクエリは、2つの非常に異なるテーブル(ta、tc)のおおよその類似性を示しています。

SELECT APPROXIMATE_SIMILARITY (mh) FROM
  (
    (SELECT mh FROM minhash_a)
    UNION ALL
    (SELECT mh FROM minhash_c)
  );
+-----------------------------+
| APPROXIMATE_SIMILARITY (MH) |
|-----------------------------|
|                           0 |
+-----------------------------+