【问题标题】:Cosine similarity with BigQuery SQL?与 BigQuery SQL 的余弦相似度?
【发布时间】:2017-12-04 05:34:58
【问题描述】:

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

【问题讨论】:

    标签: sql vector google-bigquery


    【解决方案1】:

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

    #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
    

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

    第二个结果:

    等等:

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

    【讨论】:

      猜你喜欢
      • 2020-08-12
      • 2017-12-12
      • 2017-07-07
      • 2017-04-04
      • 2011-01-01
      • 2018-02-19
      • 2023-02-10
      • 1970-01-01
      相关资源
      最近更新 更多