Вы можете транслитерировать слова латинскими буквами и использовать фонетический алгоритм, такой как 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>';