Sen latin karakter kelimeleri transliterate ve kelime özünü almak ve sahip olanlar karşılaştırmak için Soundex gibi bir fonetik algoritma kullanabilir. Senin durumunda o C250
olan sonuncusu hariç sözlerin tümü için C252
olacaktır.
levenshtein
veya similar_text
gibi karşılaştırmalı fonksiyonları ile Edit sorun giriş değeri ve olası eşleşen değerin her bir çifti için onları aramak gerekir olmasıdır. Yani, 1 milyon girişleri ile bir veritabanı varsa bu fonksiyonları 1000000 kez aramak gerekir anlamına gelir.
Ama sindiriminin çeşit hesaplamak soundex
veya metaphone
gibi fonksiyonlar, gerçek karşılaştırmalar sayısını azaltmaya yardımcı olabilir. Eğer soundex
ya da veritabanında bilinen her kelime için metaphone
değerini saklamak varsa, çok hızlı bir şekilde olası eşleşmelerin sayısını azaltabilir. Olası eşleşen değer kümesi azalır Daha sonra, o zaman iyi maç olsun karşılaştırmalı işlevlerini kullanabilirsiniz.
İşte bir örnek:
// 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>';