Дамерау-Левенштейн php - PullRequest
9 голосов
/ 02 июля 2010

Я ищу реализации алгоритма Дамерау – Левенштейна для PHP, но мне кажется, что я не могу найти ничего с моим другом Google. До сих пор мне приходилось использовать реализованный в PHP Левенштейн (без транспонирования Дамерау, что очень важно) или получить исходный код (на C, C ++, C #, Perl) и написать (перевести) его в PHP.

Кто-нибудь знает о реализации PHP?

Я использую soundex и двойной метафон для расширения «Вы имели в виду:» в своей корпоративной интрасети, и я хочу реализовать алгоритм Дамерау – Левенштейна, чтобы помочь мне лучше отсортировать результаты. Что-то похожее на эту идею: http://www.briandrought.com/blog/?p=66, моя реализация похожа на первые 5 шагов.

Ответы [ 3 ]

6 голосов
/ 30 июля 2010

У меня был удар в него рекурсивное решение, когда я вернулся.

/*
 * Naïve implementation of Damerau-Levenshtein distance
 * (Does not work when there are neighbouring transpositions)!
 */
function DamerauLevenshtein($S1, $S2)
{
    $L1 = strlen($S1);
    $L2 = strlen($S2);
    if ($L1==0 || $L2==0) {
        // Trivial case: one string is 0-length
        return max($L1, $L2);
    }
    else {
        // The cost of substituting the last character
        $substitutionCost = ($S1[$L1-1] != $S2[$L2-1])? 1 : 0;
        // {H1,H2} are {L1,L2} with the last character chopped off
        $H1 = substr($S1, 0, $L1-1);
        $H2 = substr($S2, 0, $L2-1);
        if ($L1>1 && $L2>1 && $S1[$L1-1]==$S2[$L2-2] && $S1[$L1-2]==$S2[$L2-1]) {
            return min (
                DamerauLevenshtein($H1, $S2) + 1,
                DamerauLevenshtein($S1, $H2) + 1,
                DamerauLevenshtein($H1, $H2) + $substitutionCost,
                DamerauLevenshtein(substr($S1, 0, $L1-2), substr($S2, 0, $L2-2)) + 1
            );
        }
        return min (
            DamerauLevenshtein($H1, $S2) + 1,
            DamerauLevenshtein($S1, $H2) + 1,
            DamerauLevenshtein($H1, $H2) + $substitutionCost
        );
    }
}
2 голосов
/ 29 августа 2014

Взгляните на нашу реализацию (с тестами и документацией).

0 голосов
/ 16 октября 2016

Как насчет использования встроенной функции php ...?

http://php.net/manual/en/function.levenshtein.php

int levenshtein ( string $str1 , string $str2 )


int levenshtein ( string $str1 , string $str2 , int $cost_ins , int $cost_rep , int $cost_del )
...