PHP - умное, допускающее ошибки сравнение строк - PullRequest
4 голосов
/ 18 февраля 2010

Я ищу либо рутину, либо способ поиска допустимых ошибок сравнения строк.

Допустим, у нас есть тестовая строка Čakánka - да, она содержит символы CE.

Теперь я хочу принять любую из следующих строк как OK:

  • cakanka
  • cákanká
  • ČaKaNKA
  • CAKANKA
  • CAAKNKA
  • CKAANKA
  • cakakNa

Проблема в том, что я часто переключаю буквы в слове, и я хочу свести к минимуму недовольство пользователя неспособностью (т. Е. Спешить) правильно написать одно слово.

Итак, я знаю, как сделать сравнение ci (просто сделайте его строчным:]), я могу удалять символы CE, я просто не могу обернуться, терпя несколько переключенных символов.

Кроме того, вы часто помещаете один символ не только в неправильное место (character => cahracter), но иногда смещаете его на несколько мест (character => carahcter), просто потому, что один палец был ленивым во время письма.

Спасибо:]

Ответы [ 3 ]

4 голосов
/ 18 февраля 2010

Не уверен (особенно в отношении акцентов / специальных символов, с которыми вам, возможно, придется сначала разобраться) , но для символов, которые находятся в неправильном месте или отсутствуют, levenshtein функция , которая вычисляет расстояние Левенштейна между двумя строками, может помочь вам (цитирование) :

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

Расстояние Левенштейна определяется как минимальное количество символов, которое вы должны заменить, вставить или удалить в преобразовать str1 в str2


Другие, возможно, полезные функции могут быть soundex, similar_text или metaphone.

И некоторые примечания пользователя на страницах руководства по этим функциям, особенно на странице руководства в levenshtein, могут также принести вам кое-что полезное; -)

3 голосов
/ 18 февраля 2010

Вы можете транслитерировать слова латинскими буквами и использовать фонетический алгоритм, такой как Soundex , чтобы получить суть вашего слова и сравнить его с теми, которые у вас есть. В вашем случае это будет C252 для всех ваших слов, кроме последнего, которое C250.


Редактировать Проблема со сравнительными функциями, такими как levenshtein или similar_text, заключается в том, что вам необходимо вызывать их для каждой пары входного значения и возможного сопоставленного значения. Это означает, что если у вас есть база данных с 1 миллионом записей, вам нужно будет вызывать эти функции миллион раз.

Но такие функции, как soundex или metaphone, которые вычисляют какой-то дайджест, могут помочь уменьшить количество фактических сравнений. Если вы сохраняете значение soundex или metaphone для каждого известного слова в вашей базе данных, вы можете очень быстро сократить количество возможных совпадений. Позже, когда набор возможных значений соответствия будет уменьшен, вы сможете использовать сравнительные функции для получения наилучшего соответствия.

Вот пример:

// building the index that represents your database
$knownWords = array('Čakánka', 'Cakaka');
$index = array();
foreach ($knownWords as $key => $word) {
    $code = soundex(iconv('utf-8', 'us-ascii//TRANSLIT', $word));
    if (!isset($index[$code])) {
        $index[$code] = array();
    }
    $index[$code][] = $key;
}

// test words
$testWords = array('cakanka', 'cákanká', 'ČaKaNKA', 'CAKANKA', 'CAAKNKA', 'CKAANKA', 'cakakNa');
echo '<ul>';
foreach ($testWords as $word) {
    $code = soundex(iconv('utf-8', 'us-ascii//TRANSLIT', $word));
    if (isset($index[$code])) {
        echo '<li> '.$word.' is similar to: ';
        $matches = array();
        foreach ($index[$code] as $key) {
            similar_text(strtolower($word), strtolower($knownWords[$key]), $percentage);
            $matches[$knownWords[$key]] = $percentage;
        }
        arsort($matches);
        echo '<ul>';
        foreach ($matches as $match => $percentage) {
            echo '<li>'.$match.' ('.$percentage.'%)</li>';
        }
        echo '</ul></li>';
    } else {
        echo '<li>no match found for '.$word.'</li>';
    }
}
echo '</ul>';
1 голос
/ 18 февраля 2010

Проверка орфографии делает что-то вроде нечеткое сравнение строк . Возможно, вы сможете адаптировать алгоритм на основе этой ссылки. Или возьмите угадывающий код проверки орфографии из проекта с открытым исходным кодом, например Firefox .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...