字串函式 levenshtein ()

eternal_strong發表於2020-05-18

levenshtein() 計算兩個字串之間的編輯距離

levenshtein(string str1, string str2,int insert,int replace,int delete):int

編輯距離,是指兩個字串之間,通過替換、插入、刪除等操作將字串str1轉換成str2所需要操作的最少字元數量。 該演算法的複雜度是 O(m * n),其中 n 和 m 分別是str1str2的長度 (當和演算法複雜度為 O(max(n,m)**3) 的 similar_text() 相比時,此函式還是相當不錯的,儘管仍然很耗時。)。

在最簡單的形式中,該函式只以兩個字串作為引數,並計算通過插入、替換和刪除等操作將str1轉換成str2所需要的操作次數。

第二種變體將採用三個額外的引數來定義插入、替換和刪除操作的次數。此變體比第一種更加通用和適應,但效率不高。

引數 說明
str1 必需。需要比較的第一個字串。
str2 必需。需要比較的第二個字串。
insert 可選。插入一個字元的成本。預設是 1。
replace 可選。替換一個字元的成本。預設是 1。
delete 可選。刪除一個字元的成本。預設是 1。

返回值:
此函式返回兩個字串引數之間的編輯距離,如果其中一個字串引數長度大於限制的255個字元時,返回-1。

$input  = 'carrrot';

$words = ['apple','pineapple','banana','orange','radish','carrot'];

$shortest = -1;

foreach ($words as $word) {
    $lev = levenshtein($input,$word);

    if ($lev == 0) {  //完全匹配
        $closest = $word;
        $shortest = 0;
        break;
    }

    // 如果此次距離比上次找到的要短
    // 或者還沒找到接近的單詞
    if ($lev <= $shortest || $shortest < 0) {
        $closest = $word;
        $shortest = $lev;
    }
}

echo 'input word:<br>';
if ($shortest == 0) {
    echo 'exact match found:'.$closest.'<br>';
} else {
    echo 'did you mean: '.$closest.'<br>';
}

// input word:
// did you mean: carrot
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章