8

让我解释。

我要为一家公司做一些模糊匹配,所以 ATM 我用了一个 levenshtein 距离计算器,然后计算两个词的相似度百分比。如果术语的相似度超过 80%,则 Fuzzymatch 返回“TRUE”。

我的问题是我在实习,马上就要离开了。将继续这样做的人不知道如何将 excel 与宏一起使用,并希望我尽我所能实现我所做的。

所以我的问题是:无论函数效率如何,是否有任何方法可以在 Excel 中创建一个标准函数来计算我之前所做的,而不使用宏?

谢谢。

4

4 回答 4

15

如果你来谷歌搜索类似 levenshtein distance google sheets

我把它和milot-midia对这个要点的代码注释放在一起(https://gist.github.com/andrei-m/982927 - MIT 许可下的代码)

  • 从标题菜单中的表格,Tools->Script Editor
  • 为项目命名
    • 函数的名称(不是项目)将让您使用 func
  • 粘贴以下代码

function Levenshtein(a, b) {
  if(a.length == 0) return b.length; 
  if(b.length == 0) return a.length;

  // swap to save some memory O(min(a,b)) instead of O(a)
  if(a.length > b.length) {
    var tmp = a;
    a = b;
    b = tmp;
  }

  var row = [];
  // init the row
  for(var i = 0; i <= a.length; i++){
    row[i] = i;
  }

  // fill in the rest
  for(var i = 1; i <= b.length; i++){
    var prev = i;
    for(var j = 1; j <= a.length; j++){
      var val;
      if(b.charAt(i-1) == a.charAt(j-1)){
        val = row[j-1]; // match
      } else {
        val = Math.min(row[j-1] + 1, // substitution
                       prev + 1,     // insertion
                       row[j] + 1);  // deletion
      }
      row[j - 1] = prev;
      prev = val;
    }
    row[a.length] = prev;
  }

  return row[a.length];
}

您应该能够从电子表格中运行它

=Levenshtein(cell_1,cell_2)

于 2016-02-25T18:21:40.377 回答
2

虽然对于任何大小合理的字符串都无法在单个公式中完成,但您可以单独使用公式来使用工作表计算字符串之间的 Levenshtein 距离。

这是一个可以处理最多 15 个字符的字符串的示例,它可以轻松扩展为更多:

https://docs.google.com/spreadsheet/ccc?key=0AkZy12yffb5YdFNybkNJaE5hTG9VYkNpdW5ZOWowSFE&usp=sharing

这对于除了临时比较之外的任何东西都不实用,但它确实很好地展示了算法的工作原理。

于 2013-06-22T00:11:09.213 回答
0

查看先前计算 Levenshtein 距离的答案,我认为不可能将其创建为公式。

看看这里的代码

于 2012-07-05T13:29:08.857 回答
0

实际上,我想我刚刚找到了解决方法。我将它添加到代码的错误部分...

添加这一行

  } else if(b.charAt(i-1)==a.charAt(j) && b.charAt(i)==a.charAt(j-1)){
    val = row[j-1]-0.33;  //transposition

所以它现在显示

  if(b.charAt(i-1) == a.charAt(j-1)){
    val = row[j-1]; // match
  } else if(b.charAt(i-1)==a.charAt(j) && b.charAt(i)==a.charAt(j-1)){
    val = row[j-1]-0.33;  //transposition
  } else {
    val = Math.min(row[j-1] + 1, // substitution
                   prev + 1,     // insertion
                   row[j] + 1);  // deletion 
  } 

似乎可以解决问题。现在“biulding”的准确率为 92%,“bilding”的准确率为 88%。(而原始公式“建筑”只有 75%……尽管更接近正确的建筑拼写)

于 2018-08-17T12:04:48.843 回答