Doğal Dil İşleme (Natural Language Processing)
Bu yazıda kısaca doğal dil işlemeden (NLP) ve metin verisi önişleme süreçlerinden bahsedeceğim. NLP çok kapsamlı bir konu olduğu için bunu yazı dizisi haline getirmek istedim.
Doğal Dil İşleme nedir?
“Bilgisayarların konuştuğumuz dili anlaması, işlemesi, yorum yapması ve hatta cümle üretebilmesi” doğal dil işlemedir. Doğal dil işleme, hesaplamalı bilimlerle (özellikle yapay zeka ve makine öğrenmesi) dil biliminin ortak kullanıldığı bir disiplindir. Bugün banka sitesinde konuştuğumuz chatbot, telefonumuzdaki asistana verdiğimiz komutlar, google/microsoft translate’te yaptığımız çeviriler, mesaj yazarken telefonumuzun bir sonraki kelimeyi tahmin etmesi gibi teknolojiler doğal dil işlemenin sonucudur. Bunun yanında son zamanlarda çok popüler olan metin madenciliği (text mining) de doğal dil işlemeye dahildir. Metin madenciliği sayesinde internette yığınlar halinde biriken düşünceyi işleyip anlam çıkarabiliyoruz. Mesela, twitter API’yla iklim değişikliği içerikli tweet’leri alıp tweet’i yazanların yüzde kaçının iklim değişikliğini tehlikeli bulduğunu öğrenip kamuoyu hakkında bilgi sahibi olabiliyoruz. Bunun dışında doğal dil işleme konuşma tanımada (speech recognition) kullanılıyor. Konuşma tanıma, otomatik dudak okuma gibi teknolojiler hem duyma engeli olanlara yardımcı olmak için, hem de gözetlemede (surveillance) kullanılıyor. Gizlilik ihlali olmaması adına CCTV kameralarda mikrofon yok, fakat bazı hükümetler CCTV’lerden dudak okuyarak olası bir güvenlik problemini engellemeye çalışıyor, tabii burada kişisel gizlilik mi kamu güvenliği mi etik dilemması da var. Bu da başka bir yazının konusu olsun.
Peki Doğal Dil İşleme Nasıl Uygulanır?
Doğal dil işleme süreçleri dilden dile değişiklik gösterir. Bilgisayar, önce kelimenin kökü üzerine gelen eklerle birlikte dönüşümüne bakar, buna kelime bilimi (lexical) denir. Bundan sonra cümledeki kelimelerin dizilimine göre ne anlama geldiğini anlamaya çalışır buna sözdizim denir (syntactic). Ardından cümlenin özünde anlatmaya çalıştığına bakar, buna semantic denir. Son olarak da cümlelerin bir araya gelerek ifade etmek istediğine bakar, bu da söylevdir (pragmatics). Özetle, bilgisayar kelime kökünü ayrı, kelimelerin dizilmesini ayrı, cümlenin ve söylevin anlamını ayrı inceleyerek konuşmanın bağlamını öğrenir ve bu konuşmadan bir anlam çıkarır.
Bu işin teorik kısmı, bilgisayar data’yı temizliyor ve anlam çıkarıyor. Bu yazıda sadece veri ön işlemeden bahsedeceğim.
Metin Temizleme
Metin temizlemeyi incelemeden önce bir kaç terime bakalım.
Stem: Stem İngilizce’de kök anlamına gelir, ama Türkçe’deki gibi klasik kök anlayışıyla örtüşmez. Üç kelimeyle örnek verecek olursam, yer, yemek, yeter kelimelerinin aynı metinde bulunması durumunda stemming süreci üçünün de kökünü -ye olarak alır.
Root: Root Türkçe’deki gibi kelime köküdür ve bir anlam taşıması beklenir.
Lemma: Lemma, kelimenin morfolojik olarak köküne inilmesidir. Mesela “Alıngan” kelimesinin lemma’sı “almak”tır, yani kelimelerin yalın halinin sözlükteki karşılığı gibi tanımlayabiliriz.
Stemming (Kök Bulma): Stemming kelimenin kökünü almaya verilen isimdir. Stemming NLP uygulanan dilin yapısına göre değişiklik gösterir.
Türkçede stemming örneği:
İngilizce’de stemming örneği:
Bilgisayar yukarıda verdiğim stem tanımına göre stemming yapıyor. Üç kelime düşünelim, universe (evren), universal (evrensel), university (üniversite). Bilgisayar üçünün kökünü “univers” olarak kabul ediyor ve aynı kökten geldiğini düşünüyor. Bilgisayarın ekleri çok kırptığı ya da eksik kırptığı durumlar sorun oluşturuyor. Aynı şekilde türkçede iki kelime düşünelim, koyun ve koymak. Koyun kelimesini hayvan bağlamında kullandığımız durumda bilgisayar bu iki kelimenin kökenini koy olarak algıladığı için sorun çıkıyor.
Üç tip stemming algoritması var, Snowball Stemmer, Porter Stemmer ve Lancaster Stemmer. Hepsi Python’un NLTK kütüphanesinde mevcut. Porter Stemmer içlerinde en eskisi, ve basitçe açıklamak gerekirse bulduğu kelimelerin ortak sonlarını çıkararak ortak kök elde etmeye çalışıyor. Snowball Stemmer, Porter Stemmer’ın iyileştirilmiş ve daha agresif hali -Porter2 olarak da adlandırılıyor-, daha hızlı çalışıyor, bu yüzden daha çok kullanılıyor. Lancaster Stemmer ise içlerinde en agresif algoritma, öyle ki bazen gerçekten bir anlama gelmeyen kökler bulabiliyor, fakat iyi tarafı daha müdahale edilebilir olması.
Lemmatization: Lemmatization kelimeleri morfolojik olarak inceler. Bir örnek olarak: “Gidiyorlar” gitmek fiilinin üçüncü çoğul şahsının geniş zamanda çekiminden oluşur. Burada kelimenin çekimlenmemiş ilk haline lemma denir, bu örnekte gitmek bir lemmadır. Lemmatization algoritmaları çalışmak için bir sözlüğe ihtiyaç duyar. Aynı şekilde ingilizcede bir örnek verirsek “Feeds”, feed fiilinin üçüncü tekil şahsının geniş zamanda çekimlenmiş halidir.
NLTK kütüphanesinde WordNetLemmatizer’la kelimelerin lemma’ları bulunabilir.
Tokenizing: Tokenizing bir cümleyi daha küçük anlamlı birimlere ayırmak olarak tanımlanabilir. Token’lar, anlamlı küçük birimlerdir, semboller, kelimeler, deyimler token’lara örnek verilebilir. Kullandığınız tokenizer’a göre ayrıştırma değişir. Örneğe bakalım,
Word Tokenizer: Cümleyi kelimelere ayırır ve noktalama işaretlerini de ayıklar, İngilizce’de iyelik belirten “apostrof s”yi de birlikte ayırır.
Sentence Tokenizer: Paragrafı cümlelere ayırır.
Treebank Word Tokenizer: Cümlelerdeki kelimeleri boşluklara ve noktalama işaretlerine göre ayırır.
WordPunctTokenizer: Cümledeki noktalama işaretlerini ayıklar.