Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何找到两个多行字符串之间的相似性百分比?_Java_Algorithm_Levenshtein Distance - Fatal编程技术网

Java 如何找到两个多行字符串之间的相似性百分比?

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

我有两个多行字符串。我使用下面的代码来确定它们之间的相似性。这利用了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 = 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