【发布时间】:2019-04-23 04:32:04
【问题描述】:
背景:我有一个包含 13,000 条人名记录的列表,其中一些是重复的,我想找出相似的人名来进行手动复制过程。
对于像这样的数组:
["jeff","Jeff","mandy","king","queen"]
什么是获得的有效方法:
[["jeff","Jeff"]]
解释["jeff","Jeff"]因为他们的Levenshtein距离是1(可以像3一样可变)。
/*
Working but a slow solution
*/
function extractSimilarNames(uniqueNames) {
let similarNamesGroup = [];
for (let i = 0; i < uniqueNames.length; i++) {
//compare with the rest of the array
const currentName = uniqueNames[i];
let suspiciousNames = [];
for (let j = i + 1; j < uniqueNames.length; j++) {
const matchingName = uniqueNames[j];
if (isInLevenshteinRange(currentName, matchingName, 1)) {
suspiciousNames.push(matchingName);
removeElementFromArray(uniqueNames, matchingName);
removeElementFromArray(uniqueNames, currentName);
i--;
j--;
}
}
if (suspiciousNames.length > 0) {
suspiciousNames.push(currentName);
}
}
return similarNamesGroup;
}
我想通过 Levenshtein 距离找到相似度,而不仅仅是小写/大写相似度
我已经找到 fastest Levenshtein implementation 之一,但我仍然需要 35 分钟才能获得 13000 个项目列表的结果。
【问题讨论】:
-
@alex 认为比较两个字符串的 levenshtein 实现在这里没有帮助。
-
我怀疑
removeElementFromArray函数正在扼杀您的性能,因为它会改变您正在遍历的数组。删除suspiciousNames.push(matchingName);之后的4 行并使用console.time和console.timeEnd测试性能,最好从较小的数组开始。 -
["Jeff", "eff", "effl"]的预期输出是什么?另外,您是否只对 1 的 Levenshtein 距离感兴趣,或者它可能是可变的?
标签: javascript algorithm