Daha çok arama motorlarında karşımıza çıkan, aranan değere en yakın değeri bulmamızı sağlayan levenshtein fonksiyonundan bahsedeceğim.
Sizde bu fonksiyon ile basit bir şekilde “bunu mu demek istediniz?” (did you mean?) uygulaması yapabilirsiniz. Bu fonksiyonun yaptığı iki değerin Levenştayn mesafesini hesaplamaktır. Buda kaç harf değiştiğinde, silindiğinde veya eklendiğinde diğer kelimeye dönüştüğü ile ilgili karmaşık bir algoritmadır.
Öncelikle girilen değer ile en yakın eşleşmeyi bulacağı örnek değerler kümeniz olmalı. Ben örnekte renkleri bir dizide tutarak kullandım. Siz veri tabanından da çekebilirsiniz.
Örnek uygulama:
<!doctype html> <html lang="tr"> <head> <meta charset="UTF-8"> <title>Bunu mu demek istediniz? did you mean?</title> </head> <body> <form method="post" action=""> <input type="text" name="txtRenk"> <input type="submit" value="Tamam"><br> </form> <?php if ($_POST) { $deger = $_POST["txtRenk"]; $renkler = array("kırmızı", "turkuaz", "yeşil", "gümüş", "siyah", "turuncu", "gri", "sarı", "lacivert", "beyaz", "mor", "mavi", "bordo"); // en kısa mesafenin bulunamaması durumu $yakinlik = -1; //en yakın eşleşmeyi bulmak için tüm değerleri karşılaştırıyoruz foreach ($renkler as $renk) { // girilen kelime ile dizideki elemanların eşleşmesine // levenshtein fonksiyonu ile kontrol ediyoruz $lev = levenshtein($deger, $renk); // eğer 0 ise tam eşleşme var demektir if ($lev == 0) { // tam eşleşme var ve değerlerimizi tanımlayıp döngüyü sonlandırıyoruz $enyakin = $renk; $yakinlik = 0; break; } //yakınlık bulunmadıysa (-1) veya daha yakın bir eşleşme bulunduysa //değişkenlerimizi buna göre değiştiriyoruz if ($lev <= $yakinlik || $yakinlik < 0) { $enyakin = $renk; $yakinlik = $lev; } } //en son yazdırıyoruz echo "Girilen Kelime: $deger <br>"; if ($yakinlik == 0) { echo "Tam eşleşen bulundu: $enyakin"; } else { echo "Bunu mu demek istediniz: $enyakin?"; } } ?> </body> </html>
Uygulama dosyasını indirmek için: bunumu.rar
Çalışmanın demo uygulaması için tıklayın.
Yorumlar
Bu yazı için hiç yorum yok. İlk yorumu yapmak ister misiniz?