Natural Language Toolkit(NLTK)

Herkese merhaba, bloğumun ikinci yazısında sizlere doğal dil işlemenin bir kütüphanesi olan Natural Language Toolkit(NLTK)’i Python ile kodlayarak anlatacağım. Tabii öncelikle sizlere kısaca NLTK nedir ve ne işe yarar bundan bahsetmek istiyorum.

NLTK, doğal dil araç takımı anlamına gelir. Natural Language Toolkit; insan dili verileriyle çalışmak için Pyhton programlama dili ile geliştirilmiş ve geliştirilmekte olan 50’nin üzerinde derlem(corpus) ve sözcük kaynağı(lexical resources) ile oluşturulmuş açık kaynaklı bir kütüphanedir. Bu kütüphanede bir takım modüller de mevcuttur, bu modüller verilerimizi ön işlemeden geçirirken, makine öğrenmesi algoritmalarını kullanırken, Twitter API ile işlemler yaparken vs kullanacağımız paketlerdir. Örnek olarak; bir cümledeki kelimeleri ayırma (Tokenization), kelimede var olan ekleri kaldırıp kökü bulma(Stemming) işlemlerini verebilirim. Daha açıklayıcı olması adına Python programlama dili ile kodlamaya başlayalım.

Öncelikle NLTK kütüphanesini kullanabilmek için indirmeniz gerekmektedir, kendi sitesinden (nltk.org) kullandığınız işletim sistemine uygun olanı indirip kullanabilirsiniz.

Burada Google Colab’ı kullandım, nedeni ise notebook olduğundan her satırın sonunda sonucu çıktı alabiliyor olmam.

pip install nltk
Requirement already satisfied: nltk in /usr/local/lib/python3.6/dist-packages (3.2.5)
Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from nltk) (1.12.0)

Her ne kadar notebook kullanıyor olsamda size NLTK kütüphanesini nasıl indirdiğimi göstermek istedim. Yukarıda gördüğünüz gibi öncelikle kütüphaneyi indirdim.

import nltk
nltk.download('punkt')
from nltk.tokenize import word_tokenize, sent_tokenize
[nltk_data] Downloading package punkt to /root/nltk_data...
[nltk_data] Unzipping tokenizers/punkt.zip.

Kütüphanemi import edip yapmak istediğim işlemler için nltk’da bulunan tokenize modülünü kullandım. word_tokenize modülü bana biraz sonra vereceğim her iki cümledeki her bir kelimeyi birbirinden ayıracakken, sent_tokenize modülünü sadece iki cümleyi birbirinden ayırmak için kullanacağım.

sentence="Veri Bilimi Okuluna hoş geldiniz. Bugünkü blog yazısının konusu Natural Language Toolkit"
print(sent_tokenize(sentence))
['Veri Bilimi Okuluna hoş geldiniz.', 'Bugünkü blog yazısının konusu Natural Language Toolkit']

Cümleyi ikiye ayırdı.

print(word_tokenize(sentence))
['Veri', 'Bilimi', 'Okuluna', 'hoş', 'geldiniz', '.', 'Bugünkü', 'blog', 'yazısının', 'konusu', 'Natural', 'Language', 'Toolkit']

Her bir kelimeyi birbirinden ayırmışta olduk. Buna tokenization işlemi denilmekte, veriye ön işleme(preprocessing) yaparken bunun gibi diğer işlemler uygulanır. Şimdi de Stemming işlemi yapalım.

from nltk.stem import PorterStemmer
ps=PorterStemmer()
words = "gaming, the gamers play games"
words = word_tokenize(words)
 
for word in words:
    print(word + ":" + ps.stem(word))
gaming:game
,:,
the:the
gamers:gamer
play:play
games:game

Yukarıdaki işlemi PorterStemmer Türkçe için desteklemiyor. Bu yüzden İngilizce yapmak zorunda kaldım, Türkçe için from snowballstemmer import stemmer yapmanız yeterli olacaktır en azından Python bunu da yapabiliyor.

NLTK, bir veri setinin ön işlemesini(preprocessing), yani veriyi makinenin anlayacağı hale getireceğimiz zaman bizi gereksiz kelimelerle uğraştırmaktan da kurtarıyor. Aslında gereksiz demek biraz yanlış oluyor, sadece öznitelik çıkarımı yaparken önemli olmayan kelimelerle(ben, sen, de, da, ki, ile vs) uğraştırmaktan kurtarıyor. Gelin NLTK’nın bize sağladığı bu güzelliği de deneyelim, Türkçe içinde destekliyor hem. 🙂

nltk.download('stopwords')
from nltk.corpus import stopwords
stopWords = set(stopwords.words('turkish'))
sentence="Ali ile Ayşe okula gitti."
words = word_tokenize(sentence)
wordsFiltered = []
 
for w in words:
    if w not in stopWords:
        wordsFiltered.append(w)
 
print(wordsFiltered)
[nltk_data] Downloading package stopwords to /root/nltk_data...
[nltk_data]   Package stopwords is already up-to-date!
['Ali', 'Ayşe', 'okula', 'gitti', '.']

Çıktıda da görüldüğü gibi ile bağlacını atmış olduk.

NLTK kütüphanesinde en sık kullanılan modüller bunlardır, modüllerin tamamını görmek için şu siteye https://www.nltk.org/py-modindex.html gidebilirsiniz.

Son olarak küçük bir uygulama yapıp yazıyı sonlandırmak istiyorum. Yapacağım uygulamayı Google Colab’ta yazdığım için names veri setini indirmeme gerek yoktu fakat eğer siz local olarak çalıştırmak isterseniz JupyterLab kullanacak iseniz, öncelikle NLTK kütüphanesini indirdikten ve daha sonra nltk.download(‘names’) yazıp veri setini indirdikten sonra aşağıdaki kodu çalıştırabilirsiniz. Veri setinin içeriğini(female.txt ve male.txt) merak ediyorsanız şu linke tıklayabilirsiniz: https://www.kaggle.com/nltkdata/names#female.txt

NLTK gerçekten çok geniş, pratik ve kolaylık sağlayan bir kütüphane. Küçük bir uygulama ile isimden kadın mı erkek mi olduğunu bulan, tahmin etmeye çalışan bir proje yapalım. Böylelikle en azından NLTK’nın bir projede nasıl kullanıldığını ne işe yaradığını tam olarak kavramış oluruz diye düşünüyorum. Bu proje için uygulamamız gereken dört adım var, şöyle;

  • Veri Hazırlama (Data preparation)
  • Öznitelik Çıkarma (Feature extraction)
  • Eğitim (Training)
  • Tahmin (Prediction)
import nltk.classify.util
from nltk.classify import NaiveBayesClassifier
from nltk.corpus import names
 
def gender_features(word): 
    return {'last_letter': word[-1]} 
 
# Load data and training 
names = ([(name, 'male') for name in names.words('male.txt')] + 
	 [(name, 'female') for name in names.words('female.txt')])
 
featuresets = [(gender_features(n), g) for (n,g) in names] 
train_set = featuresets
classifier = nltk.NaiveBayesClassifier.train(train_set) 
 
# Predict
print(classifier.classify(gender_features('Frank')))
male

Gördüğünüz gibi import nltk.classify.util ile makine öğrenmesi algoritmalarınıda kullanabiliyor ve daha sonra from nltk.corpus import names ile hali hazırda etiketli names veri setini kullanıp gerekli işlemleri yaptıktan sonra ismin kadına mı erkeğe mi ait olduğunu bulabiliyoruz.

Doğal dil işlemenin bir kütüphanesi olan NLTK’yı sizlere açıklamaya çalıştım umarım sizler adına faydalı bir içerik olmuştur. Bir sonraki yazımda word2vec’ten bahsedeceğim, görüşmek üzere 🙂

Kaynak: https://www.nltk.org/ https://pythonspot.com/category/nltk/

Ceylan Opuz

Yazar Hakkında
Toplam 3 yazı
Ceylan OPUZ
Ceylan OPUZ
Bilgisayar Mühendisliği son sınıf öğrencisi, ilgi alanları; Yapay zeka, Veri Bilimi, Doğal Dil İşleme
Yorumlar (Yorum yapılmamış)

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

×

Bir Şeyler Ara