37 sətr kod | yarım milyarddan çox suala səsli cavab verə bilən çatbot

Nijat Zeynalov
5 min readMar 3, 2020

--

Çörək muzeyi, Ağdam, Azərbaycan

İstəsək də, istəməsək də; çatbotlar indi rəqəmsal dünyamızda mövcuddur və belə görünür ki, ayrılmaq niyyətləri də yoxdur. Son illərdə Maşın Öyrənməsinin və “təbii dil emalı” dediyimiz (NLP) texnologiyalarının inkişafı ilə, çatbotlar son dərəcə faydalı və populyar hala gəlib. Üstəlik, bugünkü çatbotlar ilk nümunələrindən daha ağıllı, daha sürətli və daha faydalıdır.
Təkrar qeyd edim ki, çatbot texnologiyası "təbii dil emalı" NLP texnologiyasına əsaslanır, lakin eyni texnologiya Google Now, Apple Siri və ya Microsoft Cortana kimi günümüzdə geniş istifadə olunan səs tanıma əsaslı virtual assistantlarının hazırlanmasında da tətbiq olunmuşdur.

Bəs, Dərin Öyrənmə biliklərinə sahib olmadan və ya ümumiyyətlə proqramlaşdırma bilikləri olmadan çatbot yaratmaq necə, mümkündür? Bəli! Flow XO, ChatterOn, Sequel kimi platformalar bizə proqramlaşdırma biliyimiz olmadan öz çatbotumuzu yaratmağa yardım etsə də, bu çatbotlar əksər hallarda bəlli bir çərçivədə xidmət göstərə bilir, əvvəlcədən müəyyən edilmiş suallara cavab verə bilir.

İstəyərdiniz mi, ağlınıza gələn bütün suallara cavab verən bir virtual assistanta sahib olasınız? Boş zamanlarınızda doymadan həmsöhbət olacağınız bir assistant! Yarım milyarddan çox suala məntiqi cavablar verən bir assistant. Özü də, heç bir APİ, verilənlər bazası olmadan, 37 sətrlik Python kodu ilə. Kim istəməz ki?!

Elə isəə, qolları çımarlayın, Python İDE-nizi açın, musiqinin səsini azaldın, başlayaq!

1. İlk olaraq gərəkli kitabxanaları yükləyək:

Yəqin ki, kitabxanalardan aydın oldu ki, edəcəyimiz əməliyyat web scrapping olacaq. Bəs haradan scrapping edəcəyik? Google-dan? Yoox, bu ki mümkün deyil, çünki biz sualı yazdıqda hazır cavabı görmək istəyirik. Google isə bizə vebsaytları gətirəcək və biz sualımızın dəqiq və məntiqli cavabının axtarış zamanı çıxan hansı vebsaytda olduğunu bilmirik.

Deməli, bizə elə bir platforma lazımdır ki, orada insanlar tərəfindən verilmiş çoxlu suallar və cavablar olsun. Ağlınıza quora.com gəldi? Aha, mənimdə ağlıma ilk o gəlmişdi, lakin təəssüflər olsun ki, quora scrappingə icazə vermir. Bir yol tapıb etmək olmaz ki? Olar, ancaq qanunsuzdur. Bəs, başqa harada belə xəzinə var deyə düşünürdüm ki, yadıma yahoo answers düşdü. Harada ki, soruşulan sualların sayı artıq bir milyarda çatır. Bəs yahoo öz verilənlərindən istifadə etməyə icazə verir? Bəli! “Koca yürekli” yahoo!

Scrapping əməliyyatımıza keçməzdən öncə, yaxşı olar ki yahoo answers-in interfeysi ilə tanış olaq.

Məsələn: sual olaraq yazırıq ki, evlənmək üçün ən yaxşı yaş neçədir? göründüyü kimi sorğuya uyğun suallar sıralandı. Məntiqən ilk nəticə sualımıza daha uyğundur prinsipini əlimizdə bayraq tutaraq, ilk nəticəyə daxil olaq.

Buradan isə görürük ki, bu suala bir neçə cavab verilib. Aydındır ki, biz istifadəçilər tərəfindən favorit hesab edilən cavabı seçsək bu daha məntiqli olar. Deməli bizi maraqlandıran suala cavab tapmaq üçün brovseri açırıq- ana səhifədə sualı yazırıq- ilk nəticəyə daxil oluruq- suala verilən ən yaxşı cavabı tapırıq. Pythonla isə etməli olduğumuz sadəcə sualı konsola yazmaqdır:

Bura qədər hərşeyin aydın olduğunu düşünərək, davam edirəm.

Biz hər hansı vebsaytdan məlumat çəkmək niyyətindəyiksə, ilk öncə requests kitabxanasının get() metodundan istifadə etməliyik. Məsələn:

Bu kodun nəticəsində vebsaytın HTML kodlarını görəcəksiz. Əgər pythonla facebook üzərindən axtarış edib, html kodlarını görmək istəsək:

Sonuncu nümunəni təsadüfən yazmadım. Çünki, dəyişkənə mənimsətdiyimiz veriləni sadə string toplama əməliyyatı ilə url-yə əlavə edə bilirik. Dəyişkənə mənimsətdiyimiz veriləni input-la istifadəçidən də ala bilərik. Çatbotumuzu hazırlayarkən bu metoddan istifadə edəcəyik.

Məclisimizin bu yerində çox yaxşı olar ki, BeautifulSoup kitabxanası haqqında danışaq. BeautifulSoup HTML və ya XML sənədləri ilə işləmək üçün yaradılan güclü və sürətli kitabxanadır. Adını “Alisa möcüzələr diyarında” əsərində bir tısbağanın söylədiyi hekayədən götürüb.

Bizim ikinci sətr kodumuzun uzun olduğu sizi narahat etməsin, yahoo göndərilən hər sorğu üçün axtarış idsi yaradır və bu id-ni kopyalayaraq bütün axtarış sorğularımızda istifadə edəcəyik. Daha sonra isə page2.content dəyərini BeautifulSoup-a daxil edirik , burada hansı kitabxanaya analiz üçün müraciət etmək istədiyimizə biz qərar veririk. Bizim bu nümunədə “html.parser”-ə ehtiyyacımız olacaq.

İkinci mərhələdə isə, bu suala gələn ilk cavabın yerləşdiyi sinifin adını find() metodunun içinə daxil edirik, bu metod səhifə mənbəyində xüsusi bir dəyər çəkməyə imkan verir.

Deməli belə gözəl insanlar, artıq sorğunu yazıb ilk nəticəni seçdik. İndi isə qaldı, ikinci pəncərəyə keçmək, yəni bu nəticəyə verilən favorit cavabı seçmək. Yuxarıdakı ekran görüntüsündən də şahid olduğunuz kimi, bütün nəticələrin yerləşdiyi sinifin daxilində həm də bu nəticənin linki var. Bizim əlimizdə də birinci nəticənin bütün HTML kodları olduğundan (name dəyişkəni) buradan requlyar ifadələrin yardımı ilə asanlıqla mövcud linkləri tapa bilərik.

Daha sonra isə, əvvəl etdiyimiz addımları təkrarlayırıq. Bizim yeni səhifəmiz page1-dir və bu səhifə cavabları özündə ehtiva edir. Ona görə də, cavabların olduğu sinifi find() metodunun içinə daxil edib, favorit cavabın daxilindəki mətni scrapping edirik.

Bəli, artıq çatbotumuz hazır vəziyyətə gəldi! İndi isə bu çatbotumuzu daha da havalı edək! Çatbotumuz bütün cavabları bizə səsli şəkildə versin. Bunun üçün gərəkli kitabxana pyttsx3-dır. Bu kitabxana pythonda mətndən nitqə çevirmək üçün tətbiq olunan kitabxanadır. Alternativ kitabxanalardan fərqli olaraq, offline işləyir və həm Python 2, həm də 3-ə uyğundur.

Burada yazdığımız kodun ilk sətrində Microsoft tərəfindən səs tanıma və sintez üçün nəzərdə tutulmuş texnologiyanın (Microsoft Speech API (SAPI5)) başladılmasını bildirir. getproperty mühərrikin mövcud dəyərini alır, setproperty isə bu dəyəri yenisi ilə dəyişdirir. say metodu daxil edilən giriş mətnini mühərrikdə söyləmə metodu olaraq bilinməkdədir, runandWait səs əmrlərini emal edir.

Bütün dediklərimizi funksiyaların köməyi ilə bəsitləşdirib, bütöv şəkildə göstərək:

Bu layihəni daha dazənginləşdirib real çatbot şəklində hazırlamaq mümkündür, tam şəkildə hazır olmasa da mən github hesabımda paylaşmışam. Məsələn, o bugünki hava temperaturunu scrapping edib deyə bilir, google calendardan istifadə edərək sabah və ya daxil etdiyim təsadüfi gündə olan dərslərimi qeyd edir, laptopu söndürmək və bunun kimi standart işləri görür, youtube üzərindən mahnı oxuda bilir və s. Siz daha da təkmilləşdirib, istifadə edə bilərsiniz.

Beləcə, 37 sətrlik kodla suallarımızı səsli cavablandıracaq bir çatbot tipli proqram yazmış olduq. 37 demişkən, fürsətdən istifadə edib 37 repressiya qurbanlarını ehtiramla anır, ruhları qarşısında baş əyirəm.

Uğur olsun! Məqaləmi “alqışlamağı” unutmayın! :)

--

--