2013-02-12 2 views
2

Мне нужно сравнить имена, которые могут быть написаны несколькими способами. Например, такое имя, как Сент-Томас, иногда написано, например, St-Thomas или Sant Thomas. Предпочтительно, я хочу создать функцию, которая дает процент от «равенства» для сравнения, например, некоторые форумы (это сообщение 5% отредактировано например).PHP Сравните, равны ли строки (почти)

+0

Когда вы не ищете процент, другая возможность - регулярное выражение. Но для этого нужно знать, насколько сильно могут быть два имени. –

+0

Я думаю, что это то, что вы хотите: http://stackoverflow.com/questions/2285201/php-smart-error-tolerating-string-comparison – fons

+0

[аналогичный текст] (http://www.php.net/manual /de/function.similar-text.php) – bitWorking

ответ

17

PHP имеет две (основные) встроенные функции для этого.

levenshtein, который подсчитывает, сколько изменений (удаление/добавление/замена) необходимо для создания строки2 из строки1. (Чем ниже, тем лучше)

и

similar_text, который возвращает количество совпадающих символов (выше, тем лучше). Обратите внимание, что вы можете передать ссылку в качестве третьего параметра, и она даст вам процент.

<?php 
    $originalPost = "Here's my question to stack overflou. Thanks /h2ooooooo"; 
    $editedPost = "Question to stack overflow."; 
    $matchingCharacters = similar_text($originalPost, $editedPost, $matchingPercentage); 
    var_dump($matchingCharacters); //int(25) 
    var_dump($matchingPercentage); //float(60.975609756098) (hence edited 40%) 
?> 
+0

А функция levenshtein идеальна! Большое спасибо, ответит на ваш ответ через 6 минут :-). – dirk

+1

Если вы хотите что-то более продвинутое, посмотрите [это эссе] (http://web.archive.org/web/20061007123913/http://www.english.upenn.edu/~jlynch/Computing/compare.html) , – gronostaj

+0

@gronostaj: Спасибо ... но для моего приложения это должно быть достаточно хорошим.Производительность, похоже, тоже в порядке :-). – dirk

0

Вы можете использовать различные подходы.

Вы можете использовать функцию similar_text(), чтобы проверить наличие сходства.

ИЛИ

Вы можете использовать levenshtein() функцию, чтобы узнать ...

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

И затем проверьте наличие разумного порога для вашей проверки.

0
$v1 = 'pupil'; 
$v2 = 'people'; 
# TRUE if $v1 & $v2 have similar pronunciation 
soundex($v1) == soundex($v2); 
# Same but it use a more accurate comparison algorithm     
metaphone($v1) == metaphone($v2);    
# Calculate how many common characters between 2 strings 
# Percent store the percentage of common chars 
$common = similar_text($v1, $v2, $percent);  
# Compute the difference of 2 text             
$diff = levenshtein($v1, $v2); 

Таким образом, либо levenshtein($v1, $v2) или similar_text($v1, $v2, $percent) будет делать это для вас, но все еще есть компромисс. Сложность алгоритма levenshtein() равна O(m*n), где n и m - длина v1 и v2 (довольно хорошо по сравнению с similar_text(), что составляет O(max(n,m)**3), но все еще дорого).

Смежные вопросы