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

Kapak Resmi

Veri bilimi ve yapay zekâ projelerinde her aşama önemlidir. Bu aşamalarda en çok üstünde durulması gereken aşamalardan biride veri ön işleme aşamasıdır. Gündelik hayatımızda veriler toplanırken oluşan yanlış veriler, eksiklikler, aykırı gözlemler modelimizin başarısını büyük oranda düşürecektir. Özellikle de doğal dil işleme alanı için veri ön işleme, diğer yazılarımızda bahsettiğimiz gündelik hayatta kullanılan dilin, üzerinde işlem yapacağımız dilden çok daha farklı olmasından dolayı oluşan zorluklar gibi birçok zorluğu minimize etmemizde büyük fayda sağlamaktadır.

Üzerinde işlem yapacağımız veriler, sizlerin herhangi bir veri yüklemeden yapmanızı istediğimiz için burada oluşturulan küçük verilerdir. Ancak örnek olması amacıyla Github reposuna örnek veriler ve bunlar için oluşturulan alıştırmalar en kısa sürede yüklenecektir.

Yakında gelecek

Yazıda gördüğünüz kodların neden tercih edildiği ise önemli bir konudur. İnternette bulduğumuz farklı kod parçacıklarını ve kendi yollarımızı büyük bir veri seti(90 binden fazla satır) üzerinde denedik. Hız, yazım ve anlama kolaylıkları açısından karşılaştırdık. Bazı kodlar aynı veri seti üzerinde 5 dakikadan uzun süren çalışma zamanı verdi bizlere. Bizde yazıyı kısa ve öz tutmak için bulabildiğimiz en iyi çalışma zamanına sahip kodları sizler için derledik. Kaynakça bölümünde kodların nerelerden alındığını bulabilir daha fazlası için ziyaretleri gerçekleştirebilirsiniz. Keyifli okumalar…

Gerekli kurulumları, veri setinin oluşturulması, ilk örnekten sonra eksik olan kodları ve çok daha fazlasını en aşağıda yer alan repo linkine giderek ulaşabilirsiniz.

Veri Setinin Oluşturulması

veri kümesi

1.Büyük – Küçük Harf Dönüşümü

Girişte söylediğimiz gibi farklı kod parçacıkları, altında yatan bazı teknik detaylardan dolayı diğerlerinden çok daha hızlı çalışıyorlar. İlk örneğimizde karşılaştırmalı olarak bunu anlattıktan sonra diğer örneklerde, bulduğumuz en iyi kodları sizler ile paylaşacağız.

Büyük-küçük harf değişimi Doğal Dil İşleme çalışmalarının ön işleme kısmının olmazsa olmazlarındandır. Bazı ön işleme adımları tercihe bağlı olarak yapılmayabilir ancak bu neredeyse her zaman yapılmalıdır. Zira insanlar birbirleri ile herhangi bir yol ile iletişim kurarken büyük veya küçük harf ayrımı yapmazlar.(Özel isimler vb. Hariç)

İlk olarak akla ilk gelebilecek, klasik bir yöntem olan for döngüsü ile bunu verimize uygulamaya çalışalım.

Yukarıdaki kodun yazımı daha da kolaylaştırılabilirdi, özellikle verinin lokasyonunun alındığı yerlerde. Ancak bu kod, çok sütunlu verilerde küçük değişiklikler ile kolay bir şekilde istenilen sütunlara işlem yapılabilir kılıyor. Range yani döngünün geçerli olacağı aralık belirlenirken tüm satırların ve “istenilen” sütunun uzunluğu alınıyor, döngüye her girildiğinde i=0’ dan başlayarak, istenilen sütundaki i’ninci satırdaki harfleri tamamen küçültüyor ve bunu tekrar verinin o satırına atıyor. Bu işlem ise başta hesaplanan uzunluktan 1 adım önce tamamlanıyor.

Not: Son çıktılar, yazıyı uzatmamak için yüklenmedi.

apply() fonksiyonu : Pandas DataFrame yapısında yer alan apply() fonksiyonu içerisinde lambda kullanarak var olan değişkenin içerisinde değişiklik yapabilir ya da DataFrame objesi içerisinde yer alan değişkenlerden yeni değişkenler türetilebilir. [1]

lambda fonksiyonu: Python’da anlık fonksiyonlar tanımlayıp kullanmak mümkündür. Bu fonksiyonlar hem çok daha kısa basit görünüşlüdür. İsimsiz fonksiyon yazılabilir. Kod satırlarında defalarca yardımınıza koşacak map(), reduce () ve filter () fonksiyonları lambda ile birlikte kullanılmaktadır. Ayrıca for ve if’ler ile birlikte beyin yakıcı kodlar yazılabilir.

split() fonksiyonu: Listeyi belirtilen ayıracı kullanarak yeniden döndürür. yani split() karakter dizilerini istenen şekilde böler.[2]

join() fonksiyonu: Verilen ilk değer ile sonrakini birleştirerek, verilen dize bitene kadar işleme devam eder.

lower() fonksiyonu: Python’da Stringler adlı yazımızda da değindiğimiz lower() fonksiyonu verilen tüm kelimeleri küçük harf yapar. Böylece tüm kelimeler adına şartlar eşitlenmiş ve sanki farklı kelimeymiş gibi görünen ifadeler olmaz.

Farklı veri setlerinde, isteğe bağlı olarak farklı sütunlarda işlem yapılabileceği için yani ölçeklenebilir olması için apply fonksiyonu ile işleme başlandı. Sonrasında kısa ve isimsiz bir fonksiyon yazma adına lambda içinde, her kelime döngü sırasında ayrı ayrı önce küçültülüyor sonrasında ile bir boşluk ile birleştirilerek işlem devam ediyor. Yani cümleler oluşturuluyor. Daha sonrasında sonraki satıra geçiliyor ve tüm satırlara bu uygulanıyor.

2.Özel Karakterlerin Silinmesi

Sonraki yazılarda detaylı olarak işlenecek düzenli ifadeler(regular expression) konusundan, 2 adet ifade kullanılarak yapılan bu işlem 1 satırda tüm verideki özel karakterleri ve noktalama işaretlerini yok etmemize yarıyor. Bu ön işleme adımı her zaman yapılması gereken bir işlem değildir. Zira, cümlelerin ne zaman bittiğinin anlaşılması, emoji tespiti, soru ifadelerinin çıkarılması ve çok farklı işlemlerde bu ifadeler gerekli olabiliyorlar.

\w ifadesi : İngilizcedeki “word” yani “kelime” sözcüğünün baş harfidir. Bütün sözcüklerle eşleşir. “Unicode” kategoride olmayan şu karakterlere de denk gelir: “[a-z, A-Z_0-9]”. Yani sözcüklerde, verilen aralıktaki karakter gelirse işlem yapılır.
Biz kodda bu ifade olmayanları sil demiş olduk bir nevi.(^ ifadesi bunu sağladı)

\s ifadesi : İngilizcedeki “space” yani “boşluk” kelimesinin baş harfidir.

3.Sayıların Silinmesi

Tarih, saat, skor gibi verilerin, analiz işlemlerinde kullanılmadığı durumlarda, yani yalnızca kelime bazlı analizlerde sayı verileri gereksiz olurlar. Bu yüzden bu veri çeşidi kaldırılarak işlemler devam eder.

Yukarıda gördüğünüz gibi yeniden bir düzenli ifade ifadesi kullanıldı.
\d ifadesi : Bütün ondalık sayılara eşlenir. Ayrıca “[0-9]” ifadesine de denk gelir. Yani bu sayılar görüldüğünde işlem yap anlamına gelir.

4.Duraklama Kelimelerinin Silinmesi

Yazılarımızda bir süre NLTK kütüphanesini çok sık kullanıyor olacağız. Daha sonrasında aynı yazıların repolarında ve ileri ki yazılarımızda karşılaştırmalı olarak veya başka kütüphane kullanmamız gerektiği için Spacy, Gensim, Zemberek, SparkNLP gibi çeşitli kütüphaneler kullanmaya, anlatmaya çalışacağız. Bu yazıda örnek olması bakımından hem NLTK hem de Advertools kütüphanelerinde duraklama kelimelerini(stop words) kaldırma işlemi yapacağız. 2 kütüphaneninde Türkçe desteği var bu konuda. O halde önce NLTK ile başlayalım.

DataFrame’e dönüştürme işlemini neden yaptığımızı veya şimdiye kadar neden yapmadığımızı sorabilirsiniz. Daha önce yaptığımız işlemler yapıları gereği, sonucu pandas’ın DataFrame veri yapısı olarak değil yine pandas’ın DataSeries veri yapısı olarak çıktı verirler. Yaptığımız işlemlerde zorunlu olarak DataFrame gerekmediği için sürekli veri yapısı dönüştürmesi yapmadık. Ancak bu işlemde gerekiyor. Bu yüzden çeviri işlemi yaptık. Sonraki kod satırı ise alışık olduğumuz bir düzende. Ek olarak sadece eğer ifademiz var. Onun da işlevi yalnızca, döngü anında sıradaki kelimenin duraklama_kelimeleri listemizde olup olmadığını kontrol etmek, eğer var ise verimizden bunu çekip çıkarmak.

Advertools kütüphanesinde Türkçe duraklama kelimeleri daha çok bulunuyor. Bunları kodu çalıştırarak görebilirsiniz.

İndirme ve yükleme işlemlerinden sonra yapılan işlemler neredeyse aynı zaten. Sıralı bir şekilde kütüphanedeki tüm Türkçe duraklama kelimelerini almamızı sağlıyor ve sonrasında verimizden bunları çıkarıyoruz.

5.Az Geçen Kelimelerin veya Çok Etkileyen İfadelerin Çıkarılması

AZ

ÇOK

 

Burada yapılan işlem ise, veri setimizdeki kelimelerin kaçar defa geçtiğini bulmak, azdan çoğa sıralamak ve sonrasından istediğimiz kadarını veri setimizden çıkarmak.

Bunu neden yaptığımız konusu ise bazen çok önemli ollabiliyor. Örnek vermek gerekirse, bazen veri setimizde o kadar fazla kelime olur ki, modele bunların hepsini sokmak istemeyiz. Bu yüzden az geçen kelimeleri atmamız iyi olur. Bazen de bir kelime, bir ifade o kadar çok geçer ki, kullanılan yöntemlere göre, analizi(duygu analizini) çok etkileyebilir bu ifade. Mesela model 🙂 emojisi geçen her cümleyi olumlu saymaya başlayabilir. Ancak olumsuz bir ifade de bunun kullanılması az da olsa mümkündür. Çok olumsuz ifadelerin bile bu yüzden olumlu çıktığı görülen bir durumdur. Bu yüzden bahsi geçen işlemler gerektiğinde tercih edilebilir.

6.İstenmeyen Kelimelerin Silinmesi

Duraklama kelimelerinin kaldırılmasıyla aynı işlem uygulanıyor burada aslında. Diğer tüm işlemlere göre çok daha az uygulanan bu ön işleme adımı, gözle görülen, analizi etkileyip etkilemediğini merak ettiğimiz ifadeler için kullanılabilir. Bu işlem buraya yazılacak kadar önemli veya bulması zor bir işlem değil ama atlanılan ve yapılmaya değer işlemlerden.

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

Yazarlar: Mustafa Selim ÖZEN, Saygın YILDIZ

Kullanılan kodlar için buraya tıklayabilirsiniz.

 

Kaynakça:
Yazıda gördüğünüz kodların çoğunluğunu M.Vahit KESKİN Hoca’nın Udemy için hazırladığı eğitimden aldık. Bulabildiğimiz en hızlı kodlar oldukları için, size zaman kazandırmak için böyle bir yöntem uyguladık. Farklı kod parçacıklarını repoda bulabilirsiniz.

1. https://yigitsener.medium.com/pythonda-lambda-kullan%C4%B1m%C4%B1-ile-pandas-apply-filter-map-ve-reduce-%C3%BCzerinden-uygulamal%C4%B1-anlat%C4%B1m%C4%B1-20a12684d162#:~:text=Pandas%20Apply%20Fonksiyonu%20ile%20Lambda,alan%20de%C4%9Fi%C5%9Fkenlerden%20yeni%20de%C4%9Fi%C5%9Fkenler%20t%C3%BCretilebilir.[1]
2. https://medium.com/@robuno/python-split-metodu-6066ef795d0d [2]
3. https://www.udemy.com/course/python-egitimi/ [bahsi geçen kodlar bu videolardan ve repodan alındı]
4. https://www.w3schools.com/python/python_regex.asp
5. https://bidb.itu.edu.tr/seyir-defteri/blog/2013/09/08/d%C3%BCzenli-i-fadeler-(regular-expressions)