与 BigQuery SQL 的余弦相似度?

Fel*_*ffa 6 sql vector google-bigquery

我在 BigQuery 中存储了向量(请参阅如何使用 SQL (BigQuery) 计算 TF/IDF),并且我想找到它们之间最相似的向量。如何使用 BigQuery 标准 SQL 计算余弦相似度?

Fel*_*ffa 6

此查询查看为每个文档定义的向量,给定其维度(按单词),并将它们与余弦距离公式相乘:

#standardSQL
SELECT ANY_VALUE(title2) orig, ANY_VALUE(tf2id) id_orig, a.id id_similar 
  , ROUND(SAFE_DIVIDE( SUM(b.tf_idf * IFNULL(c.tf_idf,0)),(SQRT(SUM(b.tf_idf*b.tf_idf))*SQRT(SUM(POW(IFNULL(c.tf_idf,0),2))))),4) distance
  , ANY_VALUE(title1) similar
  , ARRAY_AGG((ROUND(b.tf_idf,4), ROUND(c.tf_idf,4))) weights
  , ARRAY_AGG((b.word, c.word)) words
FROM (
  SELECT id, tfidfs tf1, tf2, tf2id
  , a.title title1
  , b.title title2
  FROM `fh-bigquery.stackoverflow.tf_idf_experiment_3` a
  CROSS JOIN (
    SELECT tfidfs tf2, id tf2id, title 
    FROM `fh-bigquery.stackoverflow.tf_idf_experiment_3`
    WHERE id = 11353679 
    LIMIT 1
  ) b
) a
, UNNEST(tf1) b LEFT JOIN UNNEST(tf2) c ON b.word=c.word
GROUP BY id
ORDER BY distance DESC
Run Code Online (Sandbox Code Playgroud)

第一个结果是同一个文档,证明我们得到的距离为 1:

在此输入图像描述

第二个结果:

在此输入图像描述

ETC:

在此输入图像描述

警告:此 SQL 代码执行 LEFT JOIN,因此我们只能获取左侧文档中的单词的空值,而不是右侧文档中的单词,反之亦然。