Bu yazıda dilbilim, yapay zeka ve bilgisayar bilimi alanlarında yapılan çalışmalar sonucunda hayatımıza girmiş bir kavramı ele alacağız: Doğal dil işleme ya da İngilizce tabiriyle natural language processing (NLP). Kısaca NLP, bilgisayarların konuştuğumuz dili anlayabilmesi için yapılan bir dönüştürme işlemi. Konuştuğumuz dil, bir dizi kural çerçevesinde bir araya gelen alfabenin parçacıklarından oluşurken bilgisayarın dili 0 ve 1’lerden ibaret. Aracı bir çevirmenin gerekliliği mutlak ama böyle bir ihtiyaç nereden doğdu?
Birkaç örnek vermek gerekirse
amaçlı geliştirilen uygulamalar günümüzde NLP’yi vazgeçilmez kılıyor.
Temelde doğal dil işleme söz konusu olduğunda morfoloji alanı karşımıza çıkıyor. Biçimbilim olarak da bilinen bu alan, dilbilimin bir dalı ve özünde bir dilin anlam taşıyan en küçük birimlerinin yapısını inceliyor. Literatürdeki bazı anahtar kelimelere de NLP üzerine yapılan araştırmalarda sıklıkla rastlıyoruz.
Günümüzde doğal dil işlemede karşılaşılan belli başlı problemler için çeşitli çözüm önerileri sürekli olarak araştırılmakta. Dilbilim, yapay zeka ve bilgisayar bilimi alanlarındaki gelişmeler bu problemlere ancak interdisipliner yaklaşımlarla çözüm geliştirilebileceğinin sinyalini verir nitelikte.
NLP’nin çözümüne katkıda bulunduğu bazı sorunlar ise şunlar:
Sorunların doğal dil işleme ile belirli ölçülerde giderilmesi ise gelişkin bir nesne yönelimli programlama dili vasıtasıyla mümkün. Python işte bu noktada bize oldukça kapsamlı kütüphaneler sunuyor. NLP işlemleri için sık kullanılan bazı Python kütüphaneleri ise şunlar:
Başta da bahsettiğimiz gibi aslında bilgisayarların konuştuğumuz dili anlayabilmesi için bir dönüştürme işlemi yapıyoruz. Bu işleme başlamadan önce metnin belirli bir formata getirilmesi gerekiyor. Bunu metin ön işleme (text preprocessing) adımlarında uyguluyoruz.
Metin ön işlemenin ilk adımı ise kısaca ham metni küçük parçalara ayırma uygulaması olarak bilinen tokenize etme işlemi. Esas olarak iki çeşit tokenize etme türü bulunuyor. Bunlardan ilki cümle, ikincisi ise kelimeleri tokenize etmeye yönelik.
Tokenization
Yukarıdaki örnekte görülebileceği gibi öncelikle cümleleri tokenize ederek verilen cümleleri birbirinden ayırdık. Devamında ise elde edilen tüm kelimeler ve noktalama işaretlerini küçük parçalara ayırma işlemini gerçekleştirdik.
Metni parçalara ayırmamızın ardından çalışmamız için gerekli olmayan bazı yapıların ortaya çıktığını gördük. Bir temizlik ihtiyacı doğdu. Bu ise metin ön işleme adımının ikinci basamağı olan metin temizleme uygulamasının gerekliliğini ortaya koyuyor. Buradaki örnekte amacımız metni noktalama işaretlerinden ve özel karakterlerden arındırmak.
Text Cleaning
Ardından metni normalleştirme ihtiyacı göze çarpıyor. Peki ama bu ne anlama geliyor? Normalleştirme işleminin farklı bağlamları olabilir. Bunlardan bazıları:
Tüm bu normalleştirme işlemleri elimizdeki iş problemiyle de yakından ilgili. Hangilerinin uygulanması gerektiği kararını veri bilimcinin alması gerek.
Bir diğer ön işleme basamağı ise kelimeyi eklerinden arındırmayı içerir. Kelime gövdeleme (stemming) kavramı özünde bir metindeki her bir kelimeden eklerin kaldırılması işlemidir. Burada dillerin yapısına ilişkin bazı sorunlar oluşabilir. Kelimelerin fazla veya az kırpılması, ek olamayan yapıların ek gibi algılanması muhtemeldir. Gövdeleme algoritmalarına Python’daki nltk kütüphanesinde yer alan üç örnek verebiliriz: Porter Stemmer, Snowball Stemmer ve Lancaster Stemmer.
Snowball Stemmer
Her ne kadar kök bulma odağı itibariyle benzer bir kapsamda düşünülebilecekse de lemmatization uygulaması temelde kelimelerin morfolojik analizi ile kelimenin köküne ulaşılmasına giden daha karmaşık bir algoritmadır. Yine Python içindeki nltk kütüphanesinde yer alan WordNetLemmatizer ile bu işlem gerçekleştirilebilir.
Metin ön işleme adımının bir parçası olarak metinde herhangi bir önemi olmayan kelimeleri çıkarmayı da düşünebilir. Bir dilde yaygın kullanılan ve metinden bir öznitelik çıkarımı yaparken herhangi bir önem taşımayan kelimelerden kurtulmak yapacağımız çalışmada bize bazı avantajlar sunacaktır. Türkçede bu kelimeler ile, ama, sen, ki vs. gibi kelimelerdir.
Stop Words
Metin ön işleme adımının tamamlanmasının ardından artık metinden öznitelik çıkarım işlemlerine başlayabiliriz. Buradaki öznitelik kavramı, özellik veya değişken olarak da düşünülebilir.
Kelime çantası modeli, metinlerden özellik çıkarma yollarından bir tanesidir. Bu model bir belgedeki kelimelerin oluşumunu örneğin,terim sayılarını, açıklayan metnin bir temsilidir. Bilinen kelimelerden kelime haznesi oluşturulur, buna “kelime çantası” denir. Model, bir kelimenin belgenin neresinde olduğu ile değil, sadece belgede bulunup bulunmadığı ile ilgilenir.
Aşağıdaki örnekte dört cümleden oluşan bir belgemiz var. Öncelikle makinelerin işi karakterler veya kelimelerle değil, sayılarla. CountVectorizer fonksiyonu ise metni sayısal verilere dönüştürmek için kullanılıyor. Belgede toplamda sekiz benzersiz kelime var ve bu nedenle matriste her biri benzersiz bir kelimeyi temsil eden sekiz sütun yer alıyor. Çıktıdaki satırlar ise görülebileceği gibi belgedeki satırlarda yer alan cümlelere denk geliyor.
CountVectorizer
Matrisin hazırlanmasının ardından metin içindeki terimlerin ağırlıklandırması NLP projelerinin önemli bir kısmında kritik bir yaklaşım. Bir terimin doküman içerisindeki önemini istatistiki bir biçimde ifade etmek için TF-IDF yöntemini uygulamak gerekiyor.
Terim Frekansı (Term Frequency)
Basitçe TF-IDF’in ilk kısmındaki terim frekansı (TF), bir metinde geçen terim ağırlıklarını hesaplamak için kullanılmaktadır.
TF(t) = (Bir t teriminin tüm cümleleri içeren ilgili belgede gözlenme frekansı) / (Belgedeki toplam eşsiz terim sayısı)
Ters Belge Frekansı (Inverse Document Frequency)
IDF kısmında ise eşsiz kelimelerin belgedeki tüm cümleler içindeki ağırlığı hesaplanır.
IDF(t) = log (Toplam cümle sayısı ) / (İçinde t terimi olan cümle sayısı )
TF-IDF dışında metinlerden öznitelik çıkarmak için kullanılabilecek başka teknikler de buluyor. Kelime gömme yöntemleri, kelimelerin vektör temsillerini ifade eden bir teknik.
Google tarafından geliştirilen, tahmin ve sinir ağı tabanlı kelime temsil yöntemidir. Ağırlık öğrenmeye benzer bir şekilde kelime vektörleri öğrenilir ve kelimeler arasındaki benzerlik ya da zıtlık gibi durumlar matematiksel olarak ifade edilir. Bu yöntem dahilinde iki yaklaşım bilinmelidir: CBoW ve Skip-gram.
Bir kelimenin etrafındaki kelimeler verildiğinde hangi kelimenin bu kelimeler içinde görülme olasılığının en yüksek olduğunu bilmek istemesidir. Skip-gram ise girdiler ile çıktıları olasılıksal olarak birbirine benzeterek anlamsal olarak en uygun şekilde temsil etmek hedeflenir. Bu yöntemin avantajı farklı anlamlara gelebilecek kelimelerin birden fazla anlamını yakalayabilmesidir.
Özet olarak bu yazıda, doğal dil işlemeye dair bazı temel kavramlara ve basit bir NLP çalışmanın adımlarına değindik. Öte yandan NLP dünyası elbette bunlarla sınırlı değil. Konuyla ilgili daha detaylı bilgi sahibi olmak için Miuul'un "Doğal Dil İşlemeye Giriş" uzmanlık programına göz atabilirsiniz.
Kaynaklar