Java 如何找到两个多行字符串之间的相似性百分比?
我有两个多行字符串。我使用下面的代码来确定它们之间的相似性。这利用了Levenshtein距离算法Java 如何找到两个多行字符串之间的相似性百分比?,java,algorithm,levenshtein-distance,Java,Algorithm,Levenshtein Distance,我有两个多行字符串。我使用下面的代码来确定它们之间的相似性。这利用了Levenshtein距离算法 public static double similarity(String s1, String s2) { String longer = s1, shorter = s2; if (s1.length() < s2.length()) { longer = s2; shorter = s1; } int longerLength = l
public static double similarity(String s1, String s2) {
String longer = s1, shorter = s2;
if (s1.length() < s2.length()) {
longer = s2; shorter = s1;
}
int longerLength = longer.length();
if (longerLength == 0) { return 1.0; /* both strings are zero length */ }
return (longerLength - editDistance(longer, shorter)) / (double) longerLength;
}
public static int editDistance(String s1, String s2) {
s1 = s1.toLowerCase();
s2 = s2.toLowerCase();
int[] costs = new int[s2.length() + 1];
for (int i = 0; i <= s1.length(); i++) {
int lastValue = i;
for (int j = 0; j <= s2.length(); j++) {
if (i == 0)
costs[j] = j;
else {
if (j > 0) {
int newValue = costs[j - 1];
if (s1.charAt(i - 1) != s2.charAt(j - 1))
newValue = Math.min(Math.min(newValue, lastValue),
costs[j]) + 1;
costs[j - 1] = lastValue;
lastValue = newValue;
}
}
}
if (i > 0)
costs[s2.length()] = lastValue;
}
return costs[s2.length()];
}
我可以建议你一种方法 您使用的是编辑距离,它提供了S1中需要更改/添加/删除以将其转换为S2的字符数 例如:
S1 = "abc"
S2 = "cde"
S1 = "abc"
S2 = "defghijklmno"
编辑距离是3,它们是100%不同的(考虑到您在某种逐字符比较中看到的)
如果你这样做的话,你可以得到一个大概的百分比
S1 = "abc"
S2 = "cde"
edit = edit_distance(S1, S2)
percentage = min(edit/S1.length(), edit/S2.length())
min是一种解决方法,用于处理字符串非常不同的情况,例如:
S1 = "abc"
S2 = "cde"
S1 = "abc"
S2 = "defghijklmno"
因此,编辑距离将大于S1的长度,并且百分比应大于100%,因此可能除以较大的大小会更好
希望这有助于您的
相似性
方法返回一个介于0和1之间的数字(包括两端),其中一个表示字符串相同(编辑距离为零)
但是,在您的authQuestion
方法中,您的行为就像它返回一个介于0和100之间的数字,这一行证明了这一点:
if(re > 60){
你需要把它改成
if(re > .6){
或
因为您在sql查询的where子句中使用了整个S1,所以它要么找到完美匹配,要么根本不会返回任何结果 正如@ErwinBolwidt所提到的,如果它不返回任何内容,那么您的
isQuestionAvailable
将始终保持false。
如果它返回一个完美匹配,那么你一定会得到100%的相似性
您可以做的是:使用S1的子字符串搜索与该部分匹配的问题
您可以进行以下更改:
authQuestion方法
checkStmt.setString(1, question.substring(0,20)); //say
在获取的结果中,您可以将每个结果与您的问题进行相似性比较。看看是否给了您一些想法。那么,您得到了多少百分比,您希望得到什么,以及为什么?还有,“优化算法”是什么意思?优化性能,或者你的意思是“修复”它直到它达到你期望的效果?修复它直到我得到我想要的。它总是100%打印我需要注意的是你的代码没有打印任何东西。我刚刚尝试了代码中的两个字符串,它给出了
96.94656488549618%
所以不是100%。由此我得出结论,问题可能出在用于打印输出的代码中,或者可能是您没有正确运行它。请包含您的main
方法。我不确定您打算如何处理SQL查询。如果使用S1字符串搜索,则在数据库中找不到S2。查询中使用的~*
运算符是postgresql不区分大小写的正则表达式匹配运算符,但传递的字符串不是正则表达式。因此,如果在数据库中找不到匹配项,您的while
循环将永远不会被输入,isQuestionAvailable
将保持false
。我已经尝试过了,但仍然无法按预期工作。我使用了re。6但是循环总是返回false。如果且只有代码未进入while循环,则返回true