当前位置: 首页 > 面试题库 >

匹配两个不同列中的部分单词

盖玉石
2023-03-14
问题内容

我正在努力从我们的数据库中淘汰某个客户。我注意到一种趋势,人们用与他们填写公司名称相同的名字来填写名字。因此,示例如下所示:

business_name               first_name
-------------               ----------
locksmith taylorsville      locksmith

locksmith roy               locksmi

locksmith clinton           locks

locksmith farmington        locksmith

这些人是我不想被查询的人。他们是坏蛋。我正在尝试将查询与WHERE语句(大概)组合在一起,以隔离姓氏至少与公司名称部分匹配的人,但是我很困惑,可以使用一些帮助。


问题答案:

您可以采用基于相似性的方法
在答案底部尝试代码
它会产生如下结果

business_name           partial_business_name   first_name  similarity   
locksmith taylorsville  locksmith               locksmith   1.0  
locksmith farmington    locksmith               locksmith   1.0  
locksmith roy           locksmith               locksmi     0.7777777777777778   
locksmith clinton       locksmith               locks       0.5555555555555556

因此,您将能够根据相似度值控制要过滤的内容

代码

SELECT business_name, partial_business_name, first_name, similarity FROM 
JS( // input table
(
  SELECT business_name, REGEXP_EXTRACT(business_name, r'^(\w+)') AS partial_business_name, first_name AS first_name FROM 
    (SELECT 'locksmith taylorsville' AS business_name, 'locksmith' AS first_name),
    (SELECT 'locksmith roy' AS business_name, 'locksmi' AS first_name),
    (SELECT 'locksmith clinton' AS business_name, 'locks' AS first_name),
    (SELECT 'locksmith farmington' AS business_name, 'locksmith' AS first_name),
) ,
// input columns
business_name, partial_business_name, first_name,
// output schema
"[{name: 'business_name', type:'string'},
  {name: 'partial_business_name', type:'string'},
  {name: 'first_name', type:'string'},
  {name: 'similarity', type:'float'}]
",
// function
"function(r, emit) {

  var _extend = function(dst) {
    var sources = Array.prototype.slice.call(arguments, 1);
    for (var i=0; i<sources.length; ++i) {
      var src = sources[i];
      for (var p in src) {
        if (src.hasOwnProperty(p)) dst[p] = src[p];
      }
    }
    return dst;
  };

  var Levenshtein = {
    /**
     * Calculate levenshtein distance of the two strings.
     *
     * @param str1 String the first string.
     * @param str2 String the second string.
     * @return Integer the levenshtein distance (0 and above).
     */
    get: function(str1, str2) {
      // base cases
      if (str1 === str2) return 0;
      if (str1.length === 0) return str2.length;
      if (str2.length === 0) return str1.length;

      // two rows
      var prevRow  = new Array(str2.length + 1),
          curCol, nextCol, i, j, tmp;

      // initialise previous row
      for (i=0; i<prevRow.length; ++i) {
        prevRow[i] = i;
      }

      // calculate current row distance from previous row
      for (i=0; i<str1.length; ++i) {
        nextCol = i + 1;

        for (j=0; j<str2.length; ++j) {
          curCol = nextCol;

          // substution
          nextCol = prevRow[j] + ( (str1.charAt(i) === str2.charAt(j)) ? 0 : 1 );
          // insertion
          tmp = curCol + 1;
          if (nextCol > tmp) {
            nextCol = tmp;
          }
          // deletion
          tmp = prevRow[j + 1] + 1;
          if (nextCol > tmp) {
            nextCol = tmp;
          }

          // copy current col value into previous (in preparation for next iteration)
          prevRow[j] = curCol;
        }

        // copy last col value into previous (in preparation for next iteration)
        prevRow[j] = nextCol;
      }

      return nextCol;
    }

  };

  var the_partial_business_name;

  try {
    the_partial_business_name = decodeURI(r.partial_business_name).toLowerCase();
  } catch (ex) {
    the_partial_business_name = r.partial_business_name.toLowerCase();
  }

  try {
    the_first_name = decodeURI(r.first_name).toLowerCase();
  } catch (ex) {
    the_first_name = r.first_name.toLowerCase();
  }

  emit({business_name: r.business_name, partial_business_name: the_partial_business_name, first_name: the_first_name,
        similarity: 1 - Levenshtein.get(the_partial_business_name, the_first_name) / the_partial_business_name.length});

  }"
)
ORDER BY similarity DESC

在“如何在Google
BigQuery中执行Trigram操作”中使用?

并基于@thomaspark的https://storage.googleapis.com/thomaspark-sandbox/udf-
examples/pataky.js,其中Levenshtein的距离用于衡量相似性



 类似资料:
  • 我有两个具有经度和纬度值的数据帧,我想从数据帧#2中提取值(例如数据帧#2的第三列),这些值与数据帧1的列匹配...例如,数据帧1有两列(、),数据帧2有三列(、和一些值)...我想在数据帧1中添加第三列,其中的值对应于两个数据帧中两列完全匹配的值,类似于和...在、不匹配的对中,我希望添加,以便第三列(我要添加到数据。帧1)的长度为=。我尝试了merge函数,但在将的两列与的列进行匹配时遇到了困

  • 我想检查长度为5的字符串,如果两个正则表匹配在一起-但在单独的字符。 所以:

  • 问题内容: 我的印象是,尽管语法有所不同,但下面的函数a和b在逻辑上是等效的。但是,它们不是,我也不了解它们之间的区别。 在我看来,他们俩都在分配: x对变量z的值, y的值对应于变量x,并且 x + y的值等于变量y。 有人能帮助消除我对多变量分配以及函数a和函数b之间的逻辑差异的误解吗? 问题答案: 分配可以认为是“原子”操作。也就是说,认为在所有操作完成之前,“ 左侧”的所有值都是“冻结”的

  • 我的输入只能有两个值或。我可以使用什么正则表达式来确保这两个单词中的任何一个都已提交?

  • 问题内容: 我想比较具有两个不同Oracle表的逗号分隔值的两列(差异表)的值。我想找到与所有值 都 匹配的行( 所有值都应与值匹配)。 注意:逗号分隔值的顺序不同。 例子: T1: T2: MY RESULT应该仅在两个表中显示基于“所有名称匹配”的匹配行。 尝试过但无法使其正常工作。 我使用下面的代码来解析值: 问题答案: 您可以将表格转换为第一范式,然后比较存储在每一行中的化合物。起点可以是

  • 问题内容: 我需要在两列之间匹配一些单词。我无法在任何地方找到此解决方案,因此我需要帮助。 输出==> 如何比较表中名为“ title”的这两列,我需要在两列之间匹配一些单词。例如,在第1行中,“ Toscano”在两列中都是通用的,在第2行中,“奶油蛋卷”是通用的。 问题答案: 也许是这样的(这里是SQL FIDDLE )?