Ana içeriğe geç

Python'da Metin Sınıflandırmayı Anlama

Metin sınıflandırmanın ne olduğunu, nasıl çalıştığını ve başarılı kullanım örneklerini keşfedin. Python'da bir metin ön işleme hattı kurmayı ve ardından bir metin sınıflandırma modeli oluşturmayı uçtan uca inceleyin.
· 12 dk. oku

Yapay Zeka ile Keşfedin

Metin verisi, şirketlerin bugün en sık kullandığı veri türlerinden biridir; ancak belirgin bir yapısı olmadığı için metin verisinden içgörü çıkarmak zor ve zaman alıcı olabilir. Metin verisiyle çalışmak, Doğal Dil İşleme (Natural Language Processing) alanının kapsamına girer ve bu alan yapay zekânın bir alt dalıdır. 

Doğal Dil İşleme (NLP), bilgisayarların insan dilleriyle nasıl etkileşime girdiğini ve bilgisayarların büyük miktarda doğal dil verisini işlemesi ve analiz etmesi için nasıl programlanacağını inceleyen bir bilgisayar bilimi ve yapay zekâ alanıdır.

NLP; soruları otomatik olarak yanıtlamak, metin özetleri üretmek, metinleri bir dilden başka bir dile çevirmek gibi pek çok amaçla kullanılır. NLP araştırmaları bilişsel bilim, dilbilim ve psikoloji gibi alanlarda da yürütülmektedir. Metin sınıflandırma, NLP için böyle bir kullanım örneğidir. 

Bu blog yazısında metin sınıflandırma kullanım örneklerini inceleyeceğiz. Ayrıca Python'da bir metin ön işleme hattı kurmayı ve ardından bir metin sınıflandırma modeli oluşturmayı uçtan uca gösteren bir örnek de yer alıyor.

Doğal dil işleme hakkında daha fazla bilgi edinmek isterseniz, Python ile Doğal Dil İşleme ve R ile Doğal Dil İşleme öğrenim yollarımız faydalı olacaktır. Metin verisini değerli içgörülere dönüştürmek için gereken temel NLP becerilerini kazanacaksınız. Ayrıca NLTK, scikit-learn, spaCy ve SpeechRecognition dahil olmak üzere popüler NLP Python kütüphaneleriyle de tanışacaksınız.

Metin Sınıflandırma Nedir?

Metin sınıflandırma, çeşitli alanlardaki iş problemlerini çözmek için kullanılan yaygın bir NLP görevidir. Metin sınıflandırmanın amacı, sıklıkla gözetimli makine öğrenmesinin yardımıyla, görülmemiş metin belgelerini kategorize etmek veya bir sınıfını tahmin etmektir.

Bir sınıfı tahmin etmek üzere bir tablo verisi üzerinde eğitilmiş bir sınıflandırma algoritmasına benzer şekilde, metin sınıflandırma da gözetimli makine öğrenmesi kullanır. İkisi arasındaki temel fark, metin sınıflandırmada girdinin metin olmasıdır.

Gözetimli makine öğrenmesi kullanmadan da metin sınıflandırması yapabilirsiniz. Algoritmalar yerine, metin sınıflandırma görevini gerçekleştirmek için manuel, kurala dayalı bir sistem tasarlanabilir. Bir sonraki bölümde kurala dayalı ve makine öğrenmesi temelli metin sınıflandırma sistemlerinin artılarını ve eksilerini karşılaştırıp inceleyeceğiz.

Metin Sınıflandırma Hattı

Görsel Kaynağı

Gözetimli makine öğrenmesi hakkında daha fazla bilgi edinmek isterseniz ayrı makalemize göz atın.

Metin Sınıflandırma Kullanım Alanları ve Uygulamaları

Spam sınıflandırma

Metin sınıflandırmanın pek çok sektörde birçok pratik kullanım alanı vardır. Örneğin, bir spam filtresi; e-postaları spam ve spam olmayan kategorilerine ayırmak için metin sınıflandırma kullanan yaygın bir uygulamadır. 

Spam Sınıflandırma

Görsel Kaynağı

Haber makalelerini ve blogları sınıflandırma

Bir başka kullanım alanı da metin belgelerini önceden belirlenmiş kategorilere otomatik olarak atamaktır. Etiketli veriler üzerinde (hem ham metin hem de hedefi içeren) bir gözetimli makine öğrenmesi modeli eğitilir. Model eğitildikten sonra, üretimde gelecekte yazılacak yeni ve görülmemiş veriler (makaleler/bloglar) için bir kategori (etiket) elde etmek üzere kullanılır.

Haber Makalesi Filtresi

Görsel Kaynağı

Müşteri destek taleplerini kategorize etme

Bir şirket, müşteri destek taleplerini konuya göre otomatik olarak kategorize etmek ya da talepleri önceliklendirip ilgili birime yönlendirmek için metin sınıflandırmayı kullanabilir. 

Müşteri Destek Talepleri

Görsel Kaynağı

Nefret söylemi tespiti

Günlük 1,7 milyardan fazla aktif kullanıcısıyla Facebook'ta kaçınılmaz olarak kurallara aykırı içerikler oluşuyor. Bu istenmeyen içeriklere nefret söylemi de dahildir. 

Facebook bu sorunu, Yapay zekâ metin sınıflandırıcısı tarafından nefret söylemi olarak işaretlenen gönderilerin manuel incelemesini isteyerek ele alıyor. Yapay zekâ tarafından işaretlenen gönderiler, kullanıcılar tarafından raporlanan gönderilerle aynı şekilde inceleniyor. Nitekim yalnızca 2020'nin ilk üç ayında, platform nefret söylemi olarak sınıflandırılan 9,6 milyon içeriği kaldırdı.

Facebook Metin Sınıflandırıcısı

Görsel Kaynağı

Metin Sınıflandırma Sistemlerinin Türleri

Temelde iki tür metin sınıflandırma sistemi vardır: kurala dayalı ve makine öğrenmesi temelli metin sınıflandırma.

Kurala dayalı metin sınıflandırma

Kurala dayalı teknikler, metni kategorilere ya da gruplara ayırmak için manuel olarak oluşturulmuş bir dizi dilsel kural kullanır. Bu kurallar, anlamsal olarak ilgili metinsel öğeleri kullanarak, bir metnin içeriğine göre sistemi metni belirli bir kategoriye atamaya yönlendirir. Her kural bir öncül veya örüntü ile öngörülen bir kategoriden oluşur.

Örneğin, elinizde çok sayıda yeni makale olduğunu ve hedefinizin bunları Spor, Politika, Ekonomi vb. gibi ilgili kategorilere atamak olduğunu düşünün. 

Kurala dayalı bir sınıflandırma sistemiyle, birkaç belgeyi insan gözüyle inceleyip şu tür dilsel kurallar oluşturursunuz:

  • Belge para, dolar, GSYH veya enflasyon gibi kelimeler içeriyorsa Politika grubuna (sınıfına) aittir. 

Kurala dayalı sistemler zaman içinde iyileştirilebilir ve insanlar tarafından anlaşılabilirdir. Ancak bu yaklaşımın bazı dezavantajları vardır. 

Öncelikle, bu sistemler derin alan uzmanlığı gerektirir. Kuralların oluşturulması zaman alır; çünkü karmaşık bir sistem için kural geliştirmek zordur ve sıklıkla kapsamlı araştırma ve test gerektirir. 

Yeni kurallar eklemenin mevcut kuralların sonuçlarını değiştirebilmesi nedeniyle, kurala dayalı sistemleri sürdürmek zordur ve etkin bir şekilde ölçeklenmezler.

Makine öğrenmesi temelli metin sınıflandırma

Makine öğrenmesi temelli metin sınıflandırma, gözetimli bir makine öğrenmesi problemidir. Girdi verisinin (ham metin) etiketlerle (hedef değişkenler olarak da bilinir) eşlenmesini öğrenir. Bu, metin dışı sınıflandırma problemlerine benzer; tablolu bir veri kümesinde bir gözetimli sınıflandırma algoritmasını bir sınıfı tahmin etmek üzere eğitiriz; tek fark, metin sınıflandırmada girdinin sayısal özellikler yerine ham metin olmasıdır. 

Diğer tüm gözetimli makine öğrenmesi problemleri gibi, metin sınıflandırmanın da iki fazı vardır: eğitim ve tahmin.

Makine Öğrenmesi ile Metin Sınıflandırma

Görsel Kaynağı

Eğitim fazı

Eğitim fazında gözetimli bir makine öğrenmesi algoritması, etiketli girdi veri kümesi üzerinde eğitilir. Bu sürecin sonunda, yeni ve görülmemiş veriler üzerinde tahminler (etiketler) elde etmek için kullanabileceğimiz eğitilmiş bir model elde ederiz.

Tahmin fazı

Bir makine öğrenmesi modeli eğitildiğinde, yeni ve görülmemiş veriler üzerinde etiket tahmin etmek için kullanılabilir. Bu genellikle önceki fazdan seçilen en iyi modelin sunucuda bir API olarak dağıtılmasıyla yapılır. 

Metin Ön İşleme Hattı

Metin verisini ön işlemek, herhangi bir doğal dil işleme görevinde önemli bir adımdır. Metin verisini daha ileri işlem veya analiz için temizlemeye ve hazırlamaya yardımcı olur. 

Bir metin ön işleme hattı, doğal dil işleme görevlerinde kullanılmak üzere ham metin verisine uygulanan bir dizi işlem adımıdır. 

Bir metin ön işleme hattındaki adımlar değişebilir; ancak genellikle tokenleştirme, durak kelime (stop word) çıkarma, kök bulma (stemming) ve gövdeleme (lemmatization) gibi görevleri içerir. Bu adımlar, metin verisinin boyutunu azaltmaya ve metin sınıflandırma ve bilgi çıkarımı gibi NLP görevlerinin doğruluğunu artırmaya yardımcı olur.

Metin verisi, yapısız olduğu ve çoğu zaman çok fazla gürültü içerdiği için işlenmesi zordur. Bu gürültü; yazım hataları, dilbilgisi hataları ve standart olmayan biçimlendirme şeklinde olabilir. Bir metin ön işleme hattı, bu gürültüyü temizlemeyi ve metin verisinin daha kolay analiz edilebilir hale gelmesini amaçlar.


Metin Madenciliği

Metin Kaynağı

Daha fazlasını öğrenmek ister misiniz? R ile Metin Madenciliği öğrenim yolumuza göz atın. 

Özellik Çıkarımı

Metinden özellik çıkarmanın, başka bir deyişle metin verisini (string) sayısal özelliklere dönüştürerek makine öğrenmesi modelini eğitilebilir hale getirmenin en yaygın iki yöntemi: Kelime Torbası (Bag of Words, diğer adıyla CountVectorizer) ve Tf-IDF'dir. 

Bag of Words

Kelime torbası (BoW) modeli, metin verisini sayısal özellikler olarak temsil etmenin basit bir yoludur. Derlemdeki bilinen kelimelerden bir sözlük oluşturmayı ve ardından her belge için, her kelimenin ne sıklıkta göründüğünü sayan bir vektör üretmeyi içerir.

Kelime Torbası

Görsel Kaynağı

TF-IDF

TF-IDF, terim sıklığı-ters belge sıklığı ifadesinin kısaltmasıdır ve metni sayısal özellikler olarak temsil etmenin bir başka yoludur. Kelime Torbası (BoW) modelinin bazı eksik yönlerini Tf-IDF giderir. Bu yazıda ayrıntıya girmeyeceğiz; ancak bu kavramı daha fazla keşfetmek isterseniz Python'da Doğal Dil İşlemeye Giriş kursumuza göz atın.

TF-IDF modeli, belge içindeki kelimelerin sıklığını ve ters belge sıklığını hesaba kattığı için kelime torbası modelinden farklıdır. Bu, TF-IDF modelinin, bir belgedeki önemli kelimeleri kelime torbası modeline kıyasla daha olası biçimde belirleyebileceği anlamına gelir.

Python'da Uçtan Uca Metin Sınıflandırma Örneği

Veri Kümesini İçe Aktarma

Öncelikle veri kümesini doğrudan bu GitHub bağlantısından içe aktararak başlayın. SMS Spam Koleksiyonu, İngilizce 5.574 SMS mesajını ve Spam veya Ham (spam değil) etiketini içeren bir veri kümesidir. Amacımız, SMS'in metninden ve etiketinden öğrenen ve SMS mesajlarının sınıfını tahmin edebilen bir makine öğrenmesi modeli eğitmektir.

# reading data

import pandas as pd

data = pd.read_csv('https://raw.githubusercontent.com/mohitgupta-omg/Kaggle-SMS-Spam-Collection-Dataset-/master/spam.csv', encoding='latin-1')

data.head()

SpamHam İşlenmemiş

Veri kümesini okuduktan sonra ihtiyacımız olmayan birkaç ek sütun olduğunu fark edin. Yalnızca ilk iki sütuna ihtiyacımız var. Kalan sütunları atıp ilk iki sütunu da yeniden adlandıralım.

# drop unnecessary columns and rename cols

data.drop(['Unnamed: 2', 'Unnamed: 3', 'Unnamed: 4'], axis=1, inplace=True)

data.columns = ['label', 'text']

data.head()

SpamHam Ön İşleme

Keşifsel Veri Analizi (EDA)

Veri kümesinde eksik değer olup olmadığını ve hedef dengenin durumunu görmek için bazı temel EDA adımları uygulayalım.

# check missing values

data.isna().sum()

EDA

# check data shape

data.shape
>>> (5572, 2)
# check target balance

data['label'].value_counts(normalize = True).plot.bar()

SpamHam EDA

Metin Ön İşleme

Tüm metin temizliğinin yapıldığı bölüm burasıdır. 5.572 belgenin tamamı üzerinden dönen bir döngü şu adımları gerçekleştirir:

  • Tüm özel karakterleri kaldırma
  • Tüm kelimeleri küçük harfe çevirme
  • Tokenleştirme
  • Durak kelimeleri kaldırma
  • Gövdeleme (lemmatization)
# text preprocessing




# download nltk

import nltk

nltk.download('all')




# create a list text

text = list(data['text'])




# preprocessing loop

import re

from nltk.corpus import stopwords

from nltk.stem import WordNetLemmatizer

lemmatizer = WordNetLemmatizer()




corpus = []




for i in range(len(text)):

    r = re.sub('[^a-zA-Z]', ' ', text[i])

    r = r.lower()

    r = r.split()

    r = [word for word in r if word not in stopwords.words('english')]

    r = [lemmatizer.lemmatize(word) for word in r]

    r = ' '.join(r)

    corpus.append(r)




#assign corpus to data['text']

data['text'] = corpus

data.head()

Spam Ham İşlenmiş 1.png

Eğitim-test ayrımı

Özellik çıkarımından önce veri kümesini eğitim ve test olarak ayıralım.

# Create Feature and Label sets

X = data['text']

y = data['label']




# train test split (66% train - 33% test)

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=123)




print('Training Data :', X_train.shape)

print('Testing Data : ', X_test.shape)
>>> Training Data : (3733,)

>>> Testing Data :  (1839,)

Özellik Çıkarımı

Burada, temizlenmiş metni sayısal özelliklere dönüştürmek için Kelime Torbası modelini (CountVectorizer) kullanıyoruz. Bu, makine öğrenmesi modelini eğitmek için gereklidir.

# Train Bag of Words model

from sklearn.feature_extraction.text import CountVectorizer

cv = CountVectorizer()

X_train_cv = cv.fit_transform(X_train)

X_train_cv.shape
>>> (3733, 7020)

Model Eğitimi ve Değerlendirme

Bu bölümde bir Lojistik Regresyon modeli eğitiyor ve eğitilen modelin karmaşıklık matrisini değerlendiriyoruz.

# Training Logistic Regression model

from sklearn.linear_model import LogisticRegression

lr = LogisticRegression()

lr.fit(X_train_cv, y_train)




# transform X_test using CV

X_test_cv = cv.transform(X_test)




# generate predictions

predictions = lr.predict(X_test_cv)

predictions
>>> array(['ham', 'spam', 'ham', ..., 'ham', 'ham', 'spam'], dtype=object)
# confusion matrix

import pandas as pd

from sklearn import metrics

df = pd.DataFrame(metrics.confusion_matrix(y_test,predictions), index=['ham','spam'], columns=['ham','spam'])

df

SpamHam Tablosu

Daha fazla ayrıntı için tam DataLab çalışma kitabına göz atın. 

Sonuç

NLP hâlâ pek çok üniversite ve şirketin yeni algoritmalar ve uygulamalar geliştirdiği, aktif bir araştırma ve geliştirme alanıdır. NLP; bilgisayar bilimi, dilbilim, psikoloji ve bilişsel bilim dâhil olmak üzere çeşitli geçmişlere sahip araştırmacıları bir araya getiren disiplinler arası bir alandır.

Metin sınıflandırma, NLP'de yaygın biçimde kullanılan güçlü bir görevdir ve sıklıkla gözetimli makine öğrenmesinin yardımıyla, görülmemiş metin belgelerini otomatik olarak kategorize etmek veya bir sınıfını tahmin etmek için kullanılabilir. 

Her zaman yüzde yüz doğru sonuç vermez; ancak doğru kullanıldığında analizlerinize büyük değer katabilir. Bir metin sınıflandırıcıyı kurmanın birçok yolu ve algoritması vardır ve tek bir en iyi yaklaşım yoktur. Veriniz ve amacınız için en iyi çalışan yöntemi bulmak üzere denemeler yapmak önemlidir.

Metin Sınıflandırma SSS

İkiden fazla etiket olduğunda Metin Sınıflandırma kullanılabilir mi?

Evet, yalnızca iki etiket varsa ikili sınıflandırma algoritmaları kullanırsınız. İkiden fazla etiket varsa, çok sınıflı bir sınıflandırma algoritması kullanmanız gerekir.

Metin Sınıflandırma bir NLP görevi midir?

Evet, NLP çok geniş bir alandır. Metin sınıflandırma, çok çeşitli sektörlerde uygulamaları olan, NLP'nin temel kullanım örneklerinden biridir.

Metin Sınıflandırma gözetimli bir makine öğrenmesi problemi midir?

Metin sınıflandırma sistemleri kurala dayalı da olabilir; ancak bakımının ve ölçeklenmesinin zor olması nedeniyle hızla gözden düşmektedir. Metin sınıflandırma görevleri için makine öğrenmesi temelli bir sistem, gözetimli makine öğrenmesi kullanır.

Doğal Dil İşleme nedir?

Doğal dil işleme (NLP), bilgisayar bilimi ve yapay zekâ alanlarında, bilgisayarlarla insan (doğal) dilleri arasındaki etkileşimlerle ilgilenen; özellikle bilgisayarların büyük miktarda doğal dil verisini işlemesi ve analiz etmesi için nasıl programlanacağını inceleyen bir disiplindir.

Metin Sınıflandırma ile duygu analizi aynı şey midir?

Duygu analizi, bir metin sınıflandırma sistemine örnektir. Ancak adından da anlaşılacağı üzere duygu analizi genellikle etiketin bir tür duygu (olumlu ya da olumsuz, mutlu ya da üzgün vb.) olduğu durumlarda yapılır.

Makine öğrenmesi kullanmadan Metin Sınıflandırma yapılabilir mi?

Evet, metin sınıflandırma için kurala dayalı sistemler de kullanabiliriz.

Metin Sınıflandırma için derin öğrenme kullanabilir miyiz?

Evet, makine öğrenmesi yerine herhangi bir derin öğrenme algoritması da kullanabiliriz. NLP ve Derin Öğrenme hakkında daha fazla bilgi edinmek için Python'da Dil Modellemesi için Yinelenen Sinir Ağları (RNN) adlı harika kursa göz atın. TensorFlow kullanarak bir Metin Sınıflandırma Modeli oluşturmak isterseniz, Datacamp'teki şu TensorFlow 2.0 Vaka Çalışmasına bakın.

Metin Sınıflandırma için en iyi algoritma nedir?

En iyi algoritma diye bir şey yoktur. Genellikle naif Bayes algoritmasının yüksek boyutlu (metin) veride iyi performans gösterdiği görülür.

BERT, Metin Sınıflandırmada kullanılır mı?

Evet, Çift Yönlü Kodlayıcı Temsilleri (Bidirectional Encoder Representations) anlamına gelen BERT, Transformer mimarisine dayanan bir derin öğrenme modelidir. Birçok başka kullanımın yanı sıra, BERT metin sınıflandırma sistemlerinde de kullanılabilir. Daha fazla ayrıntı için BERT ile NLP eğitimimize bakın.

Metin Sınıflandırma ve Metin Madenciliği aynı şey midir?

Hayır. Metin Madenciliği, yapısız metni anlamlı örüntüleri belirlemek üzere yapılandırılmış bir biçime dönüştürme sürecidir; metin sınıflandırmanın amacı ise sıklıkla gözetimli makine öğrenmesinin yardımıyla, görülmemiş metin belgelerini kategorize etmek veya bir sınıfını tahmin etmektir.

Konular

İlgili