Doğal Dil İşleme+1:6. Veri Ön İşleme-2

Veri Ön İşleme (2)

Nltk İle Veri Ön işleme

Bir önceki yazımızda veri bilimi ve makine öğrenmesinde veri ön işlemenin ne kadar önemli olduğundan bahsetmiş ve daha çok Python fonksiyonları ile veri ön işlemeye giriş yapmıştık. Bu yazımızda ise NLTK Kütüphanesi ile veri ön işlemeyi ele alacağız.

 

Nltk (Natural Language Toolkit) dair bilgileri ‘Doğal Dil İşleme +1: 4.Python Doğal Dil İşleme Kütüphaneleri’ isimli yazımızda vermiştik. Yine de kısaca bahsedecek olursak Python geliştiricileri tarafından geliştirilmiş, doğal dil işleme(DDİ) alanında veri ön işleme ve istatistiksel işlemler yapmamızı sağlayan bir kütüphanedir. Bazı eski kaynaklarda Türkçe dilini desteklemediğini görebilirsiniz ama bu yazının yazıldığı zamanlarda Türkçe dilini çok iyi olmasa da desteklemektedir. Kurulumu ve NLTK Kütüphanesi için daha fazla bilgi almak isterseniz kütüphaneler ile ilgili yazımıza göz atmanızı tavsiye ederiz.

 

Token

Nltk ile ilk ele alacağımız konu tokenleştirme işlemidir. 2 çeşit tokenleştirme işlemi vardır. Bunlardan birisi kelime olarak diğeri ise cümle olarak tokenleştirme işlemidir. Bir metni kelime olarak tokenlerine ayırdığımızda her kelime bir token olur. Bu işlemi split() fonksiyonu ile de gerçekleştirebiliriz. İsterseniz ilk önce split() fonksiyonu ile deneyelim. Ardında neden NLTK kütüphanesine ihtiyacımız olduğunu görelim.

Wikipedia’dan aldığımız yapay zekanın tanımı olan cümleyi dokuman isimli değişkenimize atadık.

Okuma zorluluğu olmaması için split edilen ilk 5 kelimeye bakalım.

‘zekâ’ kelimesinin sonunda da görüldüğü üzere split() fonksiyonu ile tokenleştirme işlemi yaptığımızda virgül, nokta gibi karakterleri kelime ile birlikte almakta. Bir modelleme işlemi yaptığımızda bu karakterler modelimizin başarasını düşürebilir. Aynı işlemi Nltk ile şu şekilde yapabiliriz;

İlk önce kütüphanemizi projemize dahil ediyoruz.  Sonrasında tokenize işlemini gerçekleştiriyoruz.

Noktalama işaretlerinin ayrı bir kelime olarak alındığı, modelimiz için daha başarılı olacak olan bir liste elde ettik. Örnekte olduğu gibi virgül veya daha farklı bir noktalama işaretinden kurtulmak isterseniz bir önceki yazımızda bu konuya değinmiştik. İsterseniz bir de cümleler için tokenleştirme işlemine bakalım.

Cümleler için tokenleştirme işleminide başarı ile gerçekleştirdik. Sadece nokta ile biten değil, soru işareti ve ünlem işareti ile biten cümlerlerde tokenleşecektir. Tokenleşme işlemi sonucu bir liste döndüğü için, eğer Python biliyorsanız listeler üzerinde gerçekleştirebileceğiniz her işlemi çıktılar üzerinde de gerçekleştirebilirsiniz.

Stemming
https://www.eximiaco.tech/en/2019/11/17/implementing-the-porter-stemming-algorithm-in-c/
https://www.eximiaco.tech/en/2019/11/17/implementing-the-porter-stemming-algorithm-in-c/

Stemming işlemi ya da Türkçeye çevirirsek kök bulma işlemi, elimizdeki kelimenin köküne inmemizi sağlar. Türkçe sondan eklemeli bir dil olduğu için kelimelerin sonuna eklediğimiz ekleri temizlemek kuracağımız model için oldukça faydalı bir işlemdir. Aslında projelerde çok sık kullanılmaz. Doğal dil işleme alanın temelini oluşturan konulardan biri olduğu için anlatmamız gerekmektedir. Neden çok sık kullanılmadığını ise birazdan daha iyi anlayacağız.

Fonksiyonlarımızı tanımlıyoruz. PorterStemmer default olarak İngilizce dilini alsa da SnowballStemmer için İngilizce dilini tanımlamalıyız.

Kelimelerini köklerine ineceğiz. İngilizce beklemek anlamına gelen wait kelimesinden, çekimlerinden, waiter kelimesinden ve children kelimesinden oluşan bir corpusumuz var. Wait kelimesinden türetilmiş yeni kelimelerin yine kökünü bulmasını beklemekteyiz. ‘Waiter’ kelimesi ise garson anlamına geldiği için değiştirilmemeli. Children kelimesi de child kelimesinin çoğul hali olduğu için ama yine de artık farklı bir anlam taşıdığı için değişiklik yapmamasını bekleyeceğiz.

Görüldüğü üzere her 2 algoritmada da tam istediğimiz gibi bir dönüşüm elde ettik ama başka kelimelerde de denerseniz başarılı birçok kök bulma işlemi gerçekleştirdiğiniz kadar bazı kelimelerden de hatalı bir şekilde ek çıkarıldığını görebilirsiniz. Aslında bu sebeple stemming işlemi pek fazla projelerde kullanılmaz. Çünkü doğru bir şekilde yapılsa da yapılmasa da her kelime bizim için bir anlam ifade yapıyor ve kök alma işlemi sırasında analizimizi kötü şekilde etkileyebilecek anlam kayıpları yaşayabiliriz.

Lemmatizing

karşılaştırma

Lemmatizing ile stemming arasında ki farklılıklara bakmak için ilk önce bir örnek yapalım. Stemming işleminde kullandığımız kelimelerden kullanacağım.

2 kök bulma işleminin çıktılarına baktığımızda ciddi farklılıklar görmekteyiz. Çünkü basit olarak bahsetmemiz gerekirse stemming sadece kelimelerin sonunda ki ekleri silmektedir. Bu da bahsettiğimiz gibi projelerde ciddi sorunlara yol açabilir. Lemmatizing işleminde ise daha farklı şekilde kelimelerin morfolojik analizi kullanarak kelimelerin sözlükteki köklerine inebiliyoruz.  Göreceğiniz üzere stemming yaparken ‘children’ kelimesinin köküne inememiştik. Şuan ise ‘child’ kökünü elde edebildik.  Fiil kelimelerimizi dönüştürmemesinin sebebi ise lemmatizing işleminin default olarak isimlerde kök bulmasıdır. Fiillerimizde kök bulmak için ise kodumuzu şu şekilde güncelleyebiliriz.(v harfi Türkçe karşılığı “fiil” olan “verb” kelimesinin ilk harfidir.)

EXTRA!

Yazımızda Nltk Kütüphanesi ile veri ön işleme işlemlerinden bahsetmiş olsakta, projelerde sağladığı avantaja göre farklı kütüphaneler ile de işlem yapılmaktadır. Bizde size bunun ufak bir örneğini göstermek istedik. Yukarda ki tokenleştirme işlemini Textblob Kütüphanesi ile gerçekleştireceğiz. Aynı cümleyi kullanacağız.

Nltk Kütüphanesi ile gerçekleştirdiğimiz işlemde noktalama işaretlerini farklı bir token olarak tanımlamıştı. Textblob Kütüphanesi ile gerçekleştirdiğimiz tokenleştirme işleminde ise noktalama işaretlerini sildi. Bir önceki yazımızda da gördüğümüz üzere DDİ projelerinde noktalama işaretleri veri ön işleme aşamasında silinmektedir zaten. Textblob Kütüphanesi ile fazladan kod yazmayarak bu işlemi gerçekleştiriyoruz. Bu önemlidir çünkü projelerde az sayıda kod kullanarak fazla işlem yapmak, ekip ile çalışırken kod karmaşası yaşanmasını önler, projenin hızlı çalışmasını sağlar, hataları aza indirir.

 

Çalışmalarınızı bu şekilde kolaylaştıracak kısa yolları sık sık kod yazarak ve araştırarak bulabilirsiniz. Mesela yazılarımızı takip edebilirsiniz 🙂 Bizde sizin için DDİ alanında hem çalışmalarınızı kolaylaştıracak, hem projelerinizi daha iyi hale getirecek, hem de ufkunuzu açacak bilgileri derleyip, üretip, size sunmak için çalışıyoruz.

Takipte Kalın! 🙂

Kod için tıklayın.

Serinin Diğer Yazıları;
Doğal Dil İşlemeye Giriş
DDİ’nin Arka Planı, Zorlukları, Geleceği
Doğal Dil İşleme ve String İşlemleri
Doğal Dil İşleme Kütüphaneleri
DDİ’de Veri Ön İşleme-1

Yazarlar: Mustafa Selim ÖZEN, Saygın YILDIZ

Kaynakça:
1- https://www.eximiaco.tech/en/2019/11/17/implementing-the-porter-stemming-algorithm-in-c/ (stemming resmi)

2 – https://www.udemy.com/course/python-egitimi/

3- https://merveenoyan.medium.com/do%C4%9Fal-dil-i%CC%87%C5%9Fleme-natural-language-processing-2d7c72daf245

4- https://medium.com/analytics-vidhya/pythons-natural-language-tool-kit-nltk-tutorial-part-1-645688219a91

One thought on

Doğal Dil İşleme+1:6. Veri Ön İşleme-2

Bir cevap yazın