PHP dasturlash tilidan foydalanib qidiruv tizimi (search engine) yaratish
Ushbu maqola uzmovi.com veb sayti va @Uzmovirobot uchun ishlab chiqilgan kichik algoritm doirasida yozilgan.
Bugungi kunda google yoki yandex kabi qidiruv tizimlaridan foydalanmaydigan kishi bo’lmasa kerak. Chunki ushbu tizimlar foydalanuvchi uchun juda qulay shaklda ishlab chiqilgan.
Ayniqsa o’zbek segmenti uchun qulayliklari juda ko’p, masalan ko’p holatlarda bizini odamlar so’rovlarni shevada yoki imlo xatoliklari bilan berishlariga qaramasdan tizim aynan to’g’ri javobni chiqarib beraveradi.
Ho’sh bunday tizim qanday ishlaydi va u uchun nimalar kerak?
Birinchi navbatda Rus olimi Vladimir Levenshtein haqida eslash kerak. Ushbu olim tomonidan 1965-yilda Levenshtein distance (Leventeyn masofasi) algoritmi ishlab chiqildi. Ushbu algoritm yordamida biz bir so’zdan ikkinchi so’zgacha bo’lgan masofani aniqlashimiz mumkin.
Masalan toshkent shevasidagi oka so’zini olaylik, imlo bo’yicha ushbu so’z aka shaklida hisoblanadi. Demak biz oka so’zidan aka so’zini ishlab chiqishimiz kerak. Ushbu holatda oka so’zidagi o a harfiga almashtiriladi va unda to’g’ri shakldagi aka so’zi kelib chiqadi. Yoki «olim» so’zini eng kam amallar bajarish orqali «Ali» so’ziga aylantirishni olaylik. Bu uchun «o» ni «A» ga almashtirish va «m» ni o’chirib tashlash kerak bo’ladi. Demak, «olim» va «Ali» so’zlari orasidagi Levenshteyn masofasi 2 ga teng ekan, birincha oka so’zimizda esa masofa birga teng.
Ushbu aylantirish uchun bajarilgan amallar ketma-ketligini Tahrirlash ketma-ketligi deyish mumkin va uni quyidagicha yozsak bo’ladi: Almashtirish (o, A) O’chirish (m) Bir matnni ikkinchi matnga aylantirish uchun bajariladigan eng qisqa Tahrirlash ketma ketligini topish uchun yuqoridagi uch amalning har birini baholab olishdan foydalansak bo’ladi: — w (a, b) – matndagi a belgini b belgiga almashtirish bahosi; — w (ε, b) – matnga b belgini qo’shish bahosi; — w (a, ε) – matndan a belgini o’chirib tashlash bahosi. Bundan kelib chiqib amallarning shunday bir ketma ketligini topish kerakki, ularning umumiy qiymati eng kichik bo’lsin va shunda ushbu ketma ketlik biz izlagan Tahrirlash ketma ketligi bo’ladi. Levenshteyn masofasini o’zini hisoblash Tahrirlash ketma-ketligini topishdan osonroq amalga oshiriladi. U yuqoridagi masalaning — w (a, a)=0; — w (a, b)=1, agar ab bo’lsa; — w (ε, b)=1; — w (a, ε)=1 bo’lgandagi shaklidir holos.
Quyidagi yuqoridagi yechimchi avtomatizatsiya qilish uchun sample kod. Yoki umuman phpni o’zida ham native levenshtein(str1, str2) funksiyasi mavjud.
function levenshtein_distance($s,$t) { $m = strlen($s); $n = strlen($t); for($i=0;$iMa'lumotlar bazasidan qidiruvchi amalga oshirish:
Baza sifatida oddiy bir jsonni olaylik va unda maqola sarlavhasi, keyinchalik qidiruvga javob berish uchun maqola manzili bo'lsin.
[ { "title": "Maxluqlar tatilda 3 premyera uzbek o'zbek tilida", "url": "http://uzmovi.com/tarjima-kinolar/3682-maxluqlar-tatilda-3-premyera-uzbek-ozbek-tilida.html" }, { "title": "26 maxsus guruh premyera o'g'rilar hind kino 29 bo'lim", "url": "http://uzmovi.com/tarjima-kinolar/2017-26-maxsus-guruh.html" }, { "title": "Mushuklar itlarga qarshi", "url": "http://uzmovi.com/tarjima-kinolar/1362-mushuklar-itlarga-qarshi.html" } ]Demak maqola sarlavhasidan kerakli so'zga yaqin so'zlarni qidiramiz va yaqinlik bo'yicha uzatamiz.
function extract_words($text) { $text = trim( preg_replace( array( '/s{2,}/', '/[tn]/' ), ' ', $text ) ); return preg_split("/[^w]*([s]+[^w]*|$)/", $text, -1, PREG_SPLIT_NO_EMPTY);; } function search_dis($query, $text, $minlev=4) { $words = extract_words($text); $diss = 0; foreach($words as $word){ $lev = levenshtein_distance($query, $word); if($levYaqin masofali sarlavhalarni topish va uni alohida massivga joylab saralash
$search_word = "primyira"; $database = file_get_contents('database.json'); $database = json_decode($database, TRUE); $temp = []; foreach ($database as $item) { $diss = search_dis( $search_word, $item['title']); if($diss > 0){ $temp[] = [ 'title' => $item['title'], 'url' => $item['url'], 'distance' => $diss ]; } } usort($temp, function($a, $b) { if($a['distance']==$b['distance']) return 0; return $a['distance'] > $b['distance']?1:-1; }); print_r($temp);Natijalar (primyira):
Array ( [0] => Array ( [title] => Qotillar killerlar premyera [url] => http://uzmovi.com/tarjima-kinolar/3230-qotillar-killerlar-premyera.html [distance] => 1 ) [1] => Array ( [title] => Bekket premyera [url] => http://uzmovi.com/tarjima-kinolar/3714-bekket-premyera.html [distance] => 1 ) )Natijalar (zulmad):
Array ( [0] => Array ( [title] => Zulmat hind kino [url] => http://uzmovi.com/tarjima-kinolar/2933-zulmat-hind-kino.html [distance] => 1 ) )
Web Dasturlash
PHP dasturlash tilidan foydalanib qidiruv tizimi (search engine) yaratish