计算两个弦之间的levenshtein距离

时间:2017-01-03 10:01:34

标签: java postgresql levenshtein-distance

我正在执行以下Postgres查询。

SELECT *  FROM description WHERE levenshtein(desci, 'Description text?') <= 6  LIMIT 10;

我使用以下代码执行上述查询。

public static boolean authQuestion(String question) throws SQLException{
    boolean isDescAvailable = false;
    Connection connection = null;
    try {
        connection = DbRes.getConnection();
        String query = "SELECT *  FROM description WHERE levenshtein(desci, ? ) <= 6";
        PreparedStatement checkStmt = dbCon.prepareStatement(query);
        checkStmt.setString(1, question);
        ResultSet rs = checkStmt.executeQuery();
        while (rs.next()) {     
            isDescAvailable = true;
        }
    } catch (URISyntaxException e1) {
        e1.printStackTrace();
    } catch (SQLException sqle) {
        sqle.printStackTrace();
    } catch (Exception e) {
        if (connection != null)
            connection.close();
    } finally {
        if (connection != null)
            connection.close();
    }
    return isDescAvailable;
}

我想找到输入文本与数据库中存在的值之间的编辑距离。我想获取编辑距离为60%的所有数据。上述查询无法按预期工作。如何获得包含60%相似度的行?

2 个答案:

答案 0 :(得分:1)

levenshtein function的最常见版本是:

levenshtein(text source, text target, int ins_cost, int del_cost, int sub_cost) returns int
  

source和target都可以是任何非空字符串,最大值为   255个字符。成本参数指定a的充电量   字符插入,删除或替换。您可以   省略成本参数,如在函数的第二个版本中;在   在这种情况下,他们都默认为1。

因此,使用默认费用参数,您获得的结果是source中需要更改(通过插入,删除或替换)以获取target的字符总数。

如果您需要计算百分比差异,则应将levenshtein函数结果除以源文本的长度(或目标长度 - 根据您对百分比差异的定义)。

答案 1 :(得分:1)

使用此:

SELECT *
FROM description
WHERE 100 * (length(desci) - levenshtein(desci, ?))
         / length(desci) > 60

Levenshtein距离是一个字符串变为另一个字符串必须更改(移动,删除或插入)的字母数。简而言之,它是不同的字母数

相同的字母数为length - levenshtein

要将其表示为分数,除以长度,即(length - levenshtein) / length

要将分数表示为百分比,请乘以100

我首先按100 执行乘法以避免整数除法截断问题。