簡體   English   中英

計算兩個弦之間的levenshtein距離

[英]Calculating levenshtein distance between two strings

我正在執行以下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%相似度的行?

levenshtein函數的最通用版本是:

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

source和target都可以是任何非空字符串,最多255個字符。 成本參數分別指定字符插入,刪除或替換的費用。 您可以省略成本參數,如在函數的第二個版本中; 在這種情況下,他們都默認為1。

因此,使用默認參數的成本,你得到的結果是,你需要改變(通過插入,刪除或替換)的字符總數source ,以獲得target

如果需要計算百分比差異,則應將levenshtein函數結果除以源文本的長度(或目標長度 - 根據您對百分比差異的定義)。

用這個:

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

Levenshtein距離是一個字符串變為另一個字符串必須更改(移動,刪除或插入)的字母數。 簡而言之,它是不同的字母數。

那些相同的字母數是length - levenshtein

要將其表示為分數 ,除以長度,即(length - levenshtein) / length

要將分數表示為百分比 ,請乘以100

我通過執行乘法運算100 第一避免整數除法截斷問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM