什么是确定2个字符串是否“足够相似”的良好指标
我正在研究一个非常粗略的初稿算法,以确定2个字符串的相似程度。我还使用Levenshtein Distance来计算字符串之间的编辑距离。
我目前所做的基本上是获取编辑总数并将其除以较大字符串的大小。如果该值低于某个阈值(当前随机设置为 25%),则它们“足够相似”。
但是,这完全是武断的,我认为这不是计算相似性的好方法。是否有某种数学方程或概率/统计方法来获取Levenshtein距离数据并使用它来表示“是的,根据所做的编辑次数和字符串的大小,这些字符串足够相似”?
另外,这里的关键是我使用了任意阈值,我宁愿不这样做。我如何计算这个阈值而不是分配它,以便我可以安全地说2个字符串“足够相似”?
更新
我正在比较表示 Java 堆栈跟踪的字符串。我想这样做的原因是按相似性对一堆给定的堆栈跟踪进行分组,并将其用作过滤器对“内容”进行排序:)由于更高层次的原因,这种分组很重要,我无法完全公开分享。
到目前为止,我的算法(伪代码)大致如下:
/*
* The input lists represent the Strings I want to test for similarity. The
* Strings are split apart based on new lines / carriage returns because Java
* stack traces are not a giant one-line String, rather a multi-line String.
* So each element in the input lists is a "line" from its stack trace.
*/
calculate similarity (List<String> list1, List<String> list2) {
length1 = 0;
length2 = 0;
levenshteinDistance = 0;
iterator1 = list1.iterator();
iterator2 = list2.iterator();
while ( iterator1.hasNext() && iterator2.hasNext() ) {
// skip blank/empty lines because they are not interesting
str1 = iterator1.next(); length1 += str1.length();
str2 = iterator2.next(); length2 += str2.length();
levensteinDistance += getLevenshteinDistance(str1, str2);
}
// handle the rest of the lines from the iterator that has not terminated
difference = levenshteinDistance / Math.max(length1, length2);
return (difference < 0.25) ? true : false; // <- arbitrary threshold, yuck!
}