让我解释。
我要为一家公司做一些模糊匹配,所以 ATM 我用了一个 levenshtein 距离计算器,然后计算两个词的相似度百分比。如果术语的相似度超过 80%,则 Fuzzymatch 返回“TRUE”。
我的问题是我在实习,马上就要离开了。将继续这样做的人不知道如何将 excel 与宏一起使用,并希望我尽我所能实现我所做的。
所以我的问题是:无论函数效率如何,是否有任何方法可以在 Excel 中创建一个标准函数来计算我之前所做的,而不使用宏?
谢谢。
让我解释。
我要为一家公司做一些模糊匹配,所以 ATM 我用了一个 levenshtein 距离计算器,然后计算两个词的相似度百分比。如果术语的相似度超过 80%,则 Fuzzymatch 返回“TRUE”。
我的问题是我在实习,马上就要离开了。将继续这样做的人不知道如何将 excel 与宏一起使用,并希望我尽我所能实现我所做的。
所以我的问题是:无论函数效率如何,是否有任何方法可以在 Excel 中创建一个标准函数来计算我之前所做的,而不使用宏?
谢谢。
如果你来谷歌搜索类似
levenshtein distance google sheets
我把它和milot-midia对这个要点的代码注释放在一起(https://gist.github.com/andrei-m/982927 - MIT 许可下的代码)
Tools
->Script Editor
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)
虽然对于任何大小合理的字符串都无法在单个公式中完成,但您可以单独使用公式来使用工作表计算字符串之间的 Levenshtein 距离。
这是一个可以处理最多 15 个字符的字符串的示例,它可以轻松扩展为更多:
https://docs.google.com/spreadsheet/ccc?key=0AkZy12yffb5YdFNybkNJaE5hTG9VYkNpdW5ZOWowSFE&usp=sharing
这对于除了临时比较之外的任何东西都不实用,但它确实很好地展示了算法的工作原理。
查看先前计算 Levenshtein 距离的答案,我认为不可能将其创建为公式。
看看这里的代码
实际上,我想我刚刚找到了解决方法。我将它添加到代码的错误部分...
添加这一行
} 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%……尽管更接近正确的建筑拼写)