CHATBOT NEDİR ?
Chatbot, bir cihazda, (Siri, Alexa, Google Asistan vb.), uygulamada, web sitesinde veya diğer ağlarda bulunan yapay zeka destekli bir yazılım parçasıdır. Tüketicinin ihtiyaçlarını ölçer ve ardından ticari işlem, otel rezervasyonu, form gönderme vb. gibi belirli bir görevi yerine getirmelerine yardımcı olur. Günümüzde hemen hemen her şirketin kullanıcılarla etkileşim kurmak için konuşlandırılmış bir sohbet robotu vardır. Şirketlerin chatbotları kullanma şekillerinden bazıları şunlardır:
- Uçuş bilgilerini iletmek için
- Müşteriler ve onlara ait mali durumlar arasında iletişim kurmak için
- Müşteri desteği
Tabi ki de chatbot kullanım alanları neredeyse sınırsız olarak düşünülebilir.
Chatbotların tarihi, Weizenbaum tarafından ELIZA adlı bir bilgisayar programının icat edildiği 1966 yılına kadar uzanır. Sadece 200 satırlık koddan bir psikoterapistin dilini taklit etti. Onunla hâlâ burada sohbet edebilirsiniz: Eliza.
Chatbotları zamansal evrime göre ele alacak olursak üç kategoride inceleyebiliriz.
Geleneksel Botlar;
- Sistem odaklı
- Otomasyona dayalı
- Minimal işlevsellik
- Yalnızla sistem içeriğini işleme yeteneği
Günümüz Botları;
- Sistem ve insanlar arasında ileri geri iletişim tarafından yönlendirilir
- Görev düzeyinde otomasyon
- Sistem içeriği ve görev içeriğini işleme yeteneği
Gelecek Botları;
- Sistemden insana, insandan insana ve sistemden sisteme gibi çoklu iletişim seviyesi
- Servis seviyesinde otomasyon
- Sistem içeriği, görev içeriği ve insana dair içerikleri işleme yeteneği
- Bir işletim sistemi olarak bot
Chatbotların Çalışma Prensibi ?
Chatbotlar, Kural Tabanlı(Rule Based) ve Kendi Kendine Öğrenen(Self Learning) gibi iki farklı tipe sahiptirler.
1. Kural Tabanlı Chatbot; Kural tabanlı bir yaklaşımda, bir bot, eğitim aldığı bazı kurallara dayalı olarak soruları yanıtlar. Tanımlanan kurallar çok basit ila çok karmaşık olabilir. Botlar basit sorguları işleyebilir, ancak karmaşık olanları yönetemez.
2. Kendi Kendine Öğrenen Chatbot; Kendi kendine öğrenen botlar, bazı Makine Öğrenimi tabanlı yaklaşımları kullanan ve kural tabanlı botlardan daha verimli olanlardır. Bu botlar ayrıca iki tipte olabilir, Erişim Tabanlı (Retrieval Based) veya Üretken (Generative).
- Erişim tabanlı modellerde, bir chatbot, önceden tanımlanmış yanıtlardan oluşan bir kitaplıktan bir yanıt seçmek için bazı buluşsal yöntemler kullanır. Chatbot, önceden tanımlanmış bir bot mesajları listesinden en iyi yanıtı seçmek için konuşmanın mesajını ve bağlamını kullanır. Bağlam, diyalog ağacındaki mevcut bir konumu, konuşmadaki tüm önceki mesajları, önceden kaydedilmiş değişkenleri (örneğin, kullanıcı adı) içerebilir. Bir yanıt seçmeye yönelik buluşsal yöntemler, kural tabanlı if-else koşullu mantıktan makine öğrenimi sınıflandırıcılarına kadar birçok farklı şekilde tasarlanabilir.
- Üretken botlar yanıtları üretebilir ve her zaman bir yanıtlar dizisinden bir ögeyle yanıt vermeyebilir. Bu, onları sorgudan, kelime kelime alıp yeni yanıtlar oluşturdukça daha akıllı hale getirir.
Chatbotun Python İle Geliştirilmesi
Gereksinimler: NLTK ve Scikit Kütüphanelerinin kullanımı hakkında bilgi birikimi.
NLP
İnsan dili ve bilgisayarlar arasındaki etkileşimlere odaklanan çalışma alanına Doğal Dil İşleme veya kısaca NLP denir. Bilgisayar bilimi, yapay zeka ve hesaplamalı dilbilimin kesişim noktasında yer alır.
NLP, bilgisayarların akıllı ve kullanışlı bir şekilde insan dilini analiz etmesi, anlaması ve anlam türetmesi için bir yoldur. Geliştiriciler, NLP’yi kullanarak otomatik özetleme, çeviri, adlandırılmış varlık tanıma, ilişki çıkarma, duygu analizi, konuşma tanıma ve konu bölümleme gibi görevleri gerçekleştirmek için bilgiyi organize edebilir ve yapılandırabilir.
NLTK
NLTK( Natural Language Toolkit), insan dili verileriyle çalışacak Python programları oluşturmaya yönelik lider bir platformdur. Sınıflandırma, simgeleştirme, kaynak oluşturma, etiketleme, ayrıştırma ve anlamsal akıl yürütme için bir metin işleme kitaplığı paketinin yanı sıra, endüstriyel güçlü NLP kitaplıkları için sarmalayıcılar ile birlikte WordNet gibi 50’den fazla kurumsal ve sözcük kaynağına, kullanımı kolay arabirimler sağlar.
NLTK, “Python kullanarak hesaplamalı dilbilimi öğretmek ve çalışmak için harika bir araç” ve “doğal dille oynamak için harika bir kitaplık” olarak adlandırıldı.
NLTK’nın İndirilmesi ve Kurulumu
1) pip install nltk komutunu çalıştırarak NLTK’nın kurulumu
2) python komutu ile python terminali çalıştırıp, import nltk yazılıp, kurulumun test edilmesi
NLTK Paketlerinin Kurulumu
NLTK import edildikten sonra nltk.download() komutu çalıştırılır. Bu komut, indirilecek modellerin seçilebildiği NLTK indiricisini açacaktır. Ayrıca tüm paketler bir defada indirilebilir
NLTK İle Metin Ön İşleme
Metin verileriyle ilgili ana sorun, hepsinin metin biçiminde (dizeler) olmasıdır. Ancak, makine öğrenimi algoritmaları, görevi gerçekleştirmek için bir tür sayısal özellik vektörüne ihtiyaç duyar. Bu nedenle, herhangi bir NLP projesine başlamadan önce, metin verisini eğitime ideal hale getirmek için onu önceden işlememiz gerekir. Temel metin ön işleme şunları içerir:
Algoritmanın aynı kelimeleri farklı durumlarda farklı olarak ele almaması için tüm metni büyük veya küçük harfe dönüştürmek.
- Simgeleştirme (Tokenization): Tokenization, normal metin dizelerini bir belirteç listesine, yani istediğimiz kelimelere dönüştürme sürecini tanımlamak için kullanılan terimdir. Cümle listesini bulmak için bir cümle belirteci kullanılabilir ve dizelerdeki kelimelerin listesini bulmak için bir Word Tokenizer kullanılabilir.
NLTK veri paketi, İngilizce için önceden eğitilmiş bir Punkt Tokenizer içerir. - Gürültüyü Kaldırma: Yani standart bir sayı veya harfte olmayan her şey.
- Durma Kelimelerini (Stop Words) Kaldırma: Bazen, bir kullanıcının ihtiyacına uygun belgelerin seçilmesine yardımcı olmada çok az değere sahip görünen bazı son derece yaygın kelimeler, kelime dağarcığından tamamen çıkarılır. Bu kelimelere durma kelimeleri denir.
- Stemming (Köklendirme): Stemming, çekimli (veya bazen türetilmiş) kelimeleri kök, taban veya kök biçimlerine (genellikle yazılı bir kelime biçimine) indirgeme işlemidir. Örneğin, “Stems”, “Stemming”, “Stemmed”, “ve Stemmization” sözcüklerini kökten türetseydik, sonuç tek bir sözcük olurdu, “stem”.
- Lemmatization (Başlıklandırma): Köklendirmenin hafif bir çeşidi Başlıklandırmadır. Bunlar arasındaki en büyük fark, kök çıkarmanın genellikle var olmayan kelimeler yaratabilmesidir, oysa başlıklar(lemmas) gerçek kelimelerdir. Yani, sonunda bulduğunuz kök kelime, sözlükte arayabileceğiniz bir şey değilken, bir başlığı arayabilirsiniz. Örnek verecek olursak; “koşacak”, “koşuyor” veya “koştu” gibi kelimelerin temel biçimi “koşmak” tır veya “daha iyi” ve “iyi” kelimeleri aynı başlıkta olduğu için aynı kabul edilir.
Bag Of Words (Kelime Torbası)
İlk ön işleme aşamasından sonra, metni anlamlı bir sayı vektörüne (veya dizisine) dönüştürmemiz gerekir. Kelime torbası, bir belgedeki kelimelerin oluşumunu açıklayan metnin bir temsilidir. İki şeyi içerir:
- Bilinen kelimelerden oluşan bir kelime dağarcığı
- Bilinen kelimelerin varlığının bir ölçüsü
Neden bir “kelime torbası” olarak adlandırılıyor? Bunun nedeni, belgedeki sözcüklerin sırası veya yapısıyla ilgili herhangi bir bilginin atılması ve modelin, yalnızca bilinen sözcüklerin belgede nerede ortaya çıktıklarıyla değil, belgede bulunup bulunmadığıyla ilgilenmesidir.
Kelime Torbasının arkasındaki sezgi, aynı içeriğe sahip olmaları durumunda belgelerin benzer olmasıdır. Ayrıca, sadece içeriğinden belgenin anlamı hakkında bir şeyler öğrenebiliriz.
Örneğin, sözlüğümüz {This, car, is, not, red} sözcüklerini içeriyorsa ve “This car is red” metnini vektörleştirmek istiyorsak, şu vektöre sahip oluruz: (1, 1, 1 0, 1).
TF-IDF Yaklaşımı
Kelime Torbası yaklaşımıyla ilgili bir sorun, çok sık kullanılan kelimelerin belgede baskın olmaya başlaması (örneğin, daha büyük puan), ancak çok fazla “bilgi içeriği” içermemesidir. Ayrıca, daha uzun belgelere daha kısa belgelerden daha fazla ağırlık verecektir.
Bir yaklaşım da kelimelerin sıklığını tüm belgelerde ne sıklıkta göründüklerine göre yeniden ölçeklendirmektir, böylece tüm belgelerde de sık görülen “ve” gibi kelimelerin puanları cezalandırılır. Bu puanlama yaklaşımına Terim Frekansı-Ters Belge Frekansı (Term Frequency-Inverse Document Frequency) veya kısaca TF-IDF adı verilir, burada:
Terim Frekansı: Geçerli belgedeki kelimenin sıklığının bir puanlamasıdır. Terim Frekansı, aşağıdaki gibi matematiksel olarak formülleştirilir.
TF = (İlgili terimin belgedeki kullanım frekansı) / (Belgedeki Terim Sayısı)
Ters Belge Frekansı: Kelimenin tüm belgelerde ne kadar nadir olduğunun puanlamasıdır. Ters Belge Frekansı aşağıdaki gibi matematiksel olarak formülleştirilir.
IDF = 1 + log (Belge sayısı/ İlgili terimin bulunduğu belge sayısı)
! TF-IDF ağırlığı, bilgi alma ve metin madenciliğinde sıklıkla kullanılan bir ağırlıktır. Bu ağırlık, bir kelimenin bir koleksiyon veya derlemedeki bir belge için ne kadar önemli olduğunu değerlendirmek için kullanılan istatistiksel bir ölçüdür.
Örneğin;
100 adet kelime içeren ve “telefon” kelimesinin 3 kez geçtiği bir belge düşünelim. Bu durumda “telefon” kelimesi için tf ve idf sayıları aşağıdaki şekilde hesaplanabilir.
TF = (3/100) = 0.03
Şimdi de 5 milyon belgemiz olduğunu ve bu belgelerinde on iki bin tanesinde “telefon” kelimesinin bulunduğunu varsayalım.
IDF = log (5,000,000 / 12,000) = log(416,66) = 2.62
Sonuçlarını elde ederiz. Bu sonuçlara göre ise TF-IDF ağırlığını (2.62 * 0.03) işlemi ile 0.078 olarak elde ederiz.
TF-IDF, Python scikit learn kütüphanesinden aşağıdaki şekilde import edilerek uygulanabilir.
“from sklearn.feature_extraction.text import TfidfVectorizer”
Cosine Similarity (Kosinus Benzerliği)
TF-IDF, vektör uzayında iki gerçek değerli vektör elde etmek için metinlere uygulanan bir dönüşümdür. Daha sonra herhangi bir vektör çiftinin Kosinüs benzerliğini, nokta çarpımlarını alarak ve bunu normlarının çarpımına bölerek elde edebiliriz. Bu, vektörler arasındaki açının kosinüsünü verir. Kosinüs benzerliği, sıfır olmayan iki vektör arasındaki benzerliğin bir ölçüsüdür. Bu formülü kullanarak herhangi iki belge d1 ve d2 arasındaki benzerliği bulabiliriz.
Cosine Similarity (d1, d2) = Dot product (d1, d2) / || d1 || * || d2 ||
Burada d1 ve d2, sıfırdan farklı iki vektördür.
Artık NLP işlemleri hakkında gerekli fikre sahip olduğumuzu düşünürsek bu işlemleri gerçek bir proje üzerinde deneyelim.
CHATBOT PROJESİ
1) Gerekli Kütüphanelerin Import Edilmesi
2) Örnek Metin Belgesi
Örneğimizde, kaynak https://yazilimkaravani.net/gunumuz-dunyasinin-petrolu-veri/ sayfasından alınan veri ile alakalı bir makale kullanacağız. İçeriği sayfadan kopyalayın ve ‘chatbot.txt’ adlı bir metin dosyasına yerleştirin. Ancak, istediğiniz herhangi bir kaynağı da kullanabilirsiniz.
3) Verinin Kaynaktan Belgeden Okunması
Yukarıdaki kod bloğunu çalıştırdıktan sonra, cümle ve kelime token listelerinden birer örneği incelemek için aşağıdaki kod bloğu çalıştırılabilir.
4) Ham Metnin Ön İşlemesi
Şimdi, token’ları(belirteç) girdi olarak alacak ve normalleştirilmiş token’ları döndürecek olan LemTokens adlı bir işlev tanımlayacağız.
5) Anahtar Kelimelerin Eşlenmesi
Daha sonra, bot tarafından selamlama için kullanımak üzere bir fonksiyon tanımlayacağız. Yani bir kullanıcının girdisi bir selamlama ise, bot bir selamlama yanıtı verecektir. Selamlamalar için basit bir anahtar kelime eşleme kullanılabilir.
6) Cevap Oluşturma
Giriş sorularına karşılık, botumuzla bir yanıt oluşturmak için belge benzerliği kavramı kullanılacaktır. Bu yüzden gerekli modülleri içe aktararak başlıyoruz.
- Bir ham belge koleksiyonunu, bir TF-IDF özellikleri matrisine dönüştürmek için scikit learn kütüphanesinden TFidfVectorizer modülü import edilir.
- Ayrıca yine scikit kütüphanesinden kosinüs benzerliği modülü de import edilir.
Bu, kullanıcı tarafından girilen kelimeler ile kaynaktaki kelimeler arasındaki benzerliği bulmak için kullanılacaktır. Bu, bir chatbot’un mümkün olan en basit uygulamasıdır.
Kullanıcının ifadesini bir veya daha fazla genel anahtar kelime için arayan ve birkaç olası yanıttan birini döndüren bir işlev yanıtı tanımlarız.
Anahtar kelimelerden herhangi biriyle eşleşen girdi bulamazsa, bir yanıt döndürür: “Üzgünüm, seni anlamıyorum !“
Son olarak, kullanıcının girdisine bağlı olarak, bir sohbeti başlatırken ve bitirirken botumuzun söylemesini istediğimiz satırları besleyeceğiz.
Projenin kaynak kodlarına GitHub üzerinden erişebilirsiniz: simple_chatbot
SONUÇ
Neredeyse hiç bilişsel beceriye sahip olmayan çok basit bir bot olmasına rağmen, NLP’ye girmek ve basit bir selamlama sohbeti yapmak için iyi bir yoldur. “Chatbot”, kullanıcı girdisine basit ve belirlenen yanıtları verebilir. Ancak bu örnek, bir chatbot yaratmanın tasarımını ve zorluklarını düşünmenize yardımcı olacaktır. İnternet kaynaklarla dolup taşıyor ve bu makaleyi okuduktan sonra eminim kendinize ait bir chatbot oluşturmak isteyeceksiniz. Hadi siz de kendinize ait bir chatbot oluşturmayı deneyin ve onu geliştirerek daha karışık cevaplar vermesini sağlayın.
Kendinize iyi bakın iyi geliştirmeler!