有没有一种方法可以衡量Google BigQuery中的字符串相似度

and*_*894 5 javascript regex google-bigquery udf

我想知道是否有人知道在BigQuery中测量字符串相似度的方法。

似乎将具有一个整洁的功能。

我的情况是我需要比较两个URL的相似性,以确保它们引用同一篇文章。

我可以找到使用javascript的示例,因此也许可以使用UDF,但是我根本没有使用过UDF(或者使用javascript :))

只是想知道是否可以使用现有的regex函数,或者是否有人可以让我开始将javascript示例移植到UDF中。

任何帮助,不胜感激,谢谢

编辑:添加一些示例代码

因此,如果我将UDF定义为:

// distance function

function levenshteinDistance (row, emit) {

  //if (row.inputA.length <= 0 ) {var myresult = row.inputB.length};
  if (typeof row.inputA === 'undefined') {var myresult = 1};
  if (typeof row.inputB === 'undefined') {var myresult = 1};
  //if (row.inputB.length <= 0 ) {var myresult = row.inputA.length};

    var myresult = Math.min(
        levenshteinDistance(row.inputA.substr(1), row.inputB) + 1,
        levenshteinDistance(row.inputB.substr(1), row.inputA) + 1,
        levenshteinDistance(row.inputA.substr(1), row.inputB.substr(1)) + (row.inputA[0] !== row.inputB[0] ? 1 : 0)
    ) + 1;

  emit({outputA: myresult})

}

bigquery.defineFunction(
  'levenshteinDistance',                           // Name of the function exported to SQL
  ['inputA', 'inputB'],                    // Names of input columns
  [{'name': 'outputA', 'type': 'integer'}],  // Output schema
  levenshteinDistance                       // Reference to JavaScript UDF
);

// make a test function to test individual parts

function test(row, emit) {
  if (row.inputA.length <= 0) { var x = row.inputB.length} else { var x = row.inputA.length};
  emit({outputA: x});
}

bigquery.defineFunction(
  'test',                           // Name of the function exported to SQL
  ['inputA', 'inputB'],                    // Names of input columns
  [{'name': 'outputA', 'type': 'integer'}],  // Output schema
  test                       // Reference to JavaScript UDF
);
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下查询进行测试:

SELECT outputA FROM (levenshteinDistance(SELECT "abc" AS inputA, "abd" AS inputB))
Run Code Online (Sandbox Code Playgroud)

我得到错误:

错误:TypeError:无法读取第11行第38-39列中未定义的属性'substr'错误位置:用户定义的函数

似乎row.inputA可能不是字符串,或者由于某些原因,字符串函数无法对其起作用。不知道这是类型问题还是UDF在默认情况下可以使用的工具有意思。

再次感谢任何帮助,谢谢。

Col*_*ost 8

如果您熟悉 Python,则可以使用从 GCS 加载的外部库在 BigQuery 中使用fuzzywuzzy定义的函数。

脚步

  1. 下载 fuzzywuzzy ( fuzzball )的 javascript 版本
  2. 获取库的编译文件:dist/fuzzball.umd.min.js并将其重命名为更清晰的名称(例如fuzzball
  3. 将其上传到谷歌云存储桶
  4. 创建一个临时函数以在查询中使用库(将 OPTIONS 中的路径设置为相关路径)
CREATE TEMP FUNCTION token_set_ratio(a STRING, b STRING)
RETURNS FLOAT64
LANGUAGE js AS """
  return fuzzball.token_set_ratio(a, b);
"""
OPTIONS (
  library="gs://my-bucket/fuzzball.js");

with data as (select "my_test_string" as a, "my_other_string" as b)

SELECT  a, b, token_set_ratio(a, b) from data
Run Code Online (Sandbox Code Playgroud)


Fel*_*ffa 8

准备使用共享 UDF - Levenshtein 距离:

SELECT fhoffa.x.levenshtein('felipe', 'hoffa')
 , fhoffa.x.levenshtein('googgle', 'goggles')
 , fhoffa.x.levenshtein('is this the', 'Is This The')

6  2  0
Run Code Online (Sandbox Code Playgroud)

声优:

SELECT fhoffa.x.soundex('felipe')
 , fhoffa.x.soundex('googgle')
 , fhoffa.x.soundex('guugle')

F410  G240  G240
Run Code Online (Sandbox Code Playgroud)

模糊选择一个:

SELECT fhoffa.x.fuzzy_extract_one('jony' 
  , (SELECT ARRAY_AGG(name) 
   FROM `fh-bigquery.popular_names.gender_probabilities`) 
  #, ['john', 'johnny', 'jonathan', 'jonas']
)

johnny
Run Code Online (Sandbox Code Playgroud)

如何: