Natural Language Toolkit - Metin Sınıflandırma
Metin sınıflandırması nedir?
Adından da anlaşılacağı gibi metin sınıflandırması, metin veya belge parçalarını kategorize etmenin yoludur. Ama burada, neden metin sınıflandırıcıları kullanmamız gerektiği sorusu ortaya çıkıyor. Bir belgede veya bir metin parçasında kelime kullanımını inceledikten sonra, sınıflandırıcılar ona hangi sınıf etiketinin atanması gerektiğine karar verebilir.
İkili Sınıflandırıcı
Adından da anlaşılacağı gibi, ikili sınıflandırıcı iki etiket arasında karar verecektir. Örneğin, olumlu ya da olumsuz. Bunda metin parçası veya belge ya bir etiket ya da başka bir etiket olabilir, ancak ikisi birden olamaz.
Çok etiketli Sınıflandırıcı
İkili sınıflandırıcının tersine, çok etiketli sınıflandırıcı bir metin veya belgeye bir veya daha fazla etiket atayabilir.
Etiketli Vs Etiketsiz Özellik kümesi
Özellik adlarının özellik değerleriyle anahtar / değer eşlemesine özellik kümesi denir. Etiketli özellik kümeleri veya eğitim verileri, daha sonra etiketlenmemiş özellik kümesini sınıflandırabilmesi için sınıflandırma eğitimi için çok önemlidir.
Etiketli Özellik Kümesi | Etiketsiz Özellik Kümesi |
---|---|
Bu (feat, label) gibi görünen bir demettir. | Bu başlı başına bir başarıdır. |
Bilinen bir sınıf etiketine sahip bir örnektir. | İlişkili etiket olmadan buna örnek diyebiliriz. |
Bir sınıflandırma algoritmasını eğitmek için kullanılır. | Sınıflandırma algoritması eğitildikten sonra, etiketlenmemiş bir özellik kümesini sınıflandırabilir. |
Metin Özelliği Çıkarma
Metin özelliği çıkarma, adından da anlaşılacağı gibi, bir sözcük listesini bir sınıflandırıcı tarafından kullanılabilen bir özellik kümesine dönüştürme işlemidir. Metnimizi dönüştürmek zorundayız‘dict’ stil özelliği setleri, çünkü Natural Language Tool Kit (NLTK) ‘dict’ stil özellik setleri.
Kelime Çantası (BoW) modeli
NLP'deki en basit modellerden biri olan BoW, makine öğrenimi algoritmalarında olacak şekilde modellemede kullanılabilmesi için metin veya belgeden özellikleri çıkarmak için kullanılır. Temel olarak, bir örneğin tüm sözcüklerinden bir sözcük varlığı özelliği kümesi oluşturur. Bu yöntemin arkasındaki kavram, bir kelimenin kaç kez geçtiğini veya kelimelerin sırasını önemsememesi, yalnızca kelimenin bir kelime listesinde bulunup bulunmadığı ile ilgilenmesidir.
Misal
Bu örnek için bow () adında bir fonksiyon tanımlayacağız -
def bow(words):
return dict([(word, True) for word in words])
Şimdi arayalım bow()kelimeler üzerinde işlev. Bu işlevleri bagwords.py adlı bir dosyaya kaydettik.
from bagwords import bow
bow(['we', 'are', 'using', 'tutorialspoint'])
Çıktı
{'we': True, 'are': True, 'using': True, 'tutorialspoint': True}
Eğitim sınıflandırıcılar
Önceki bölümlerde, metinden özelliklerin nasıl çıkarılacağını öğrendik. Şimdi bir sınıflandırıcı eğitebiliriz. İlk ve en kolay sınıflandırıcıNaiveBayesClassifier sınıf.
Naïve Bayes Sınıflandırıcı
Belirli bir özellik setinin belirli bir etikete ait olma olasılığını tahmin etmek için Bayes teoremini kullanır. Bayes teoreminin formülü aşağıdaki gibidir.
$$ P (A | B) = \ frac {P (B | A) P (A)} {P (B)} $$Buraya,
P(A|B) - Aynı zamanda, son olasılık, yani birinci olayın olasılığı, yani ikinci olayın, yani B'nin meydana gelmesi durumunda A'nın meydana gelme olasılığı da denir.
P(B|A) - İkinci olayın, yani B'nin ilk olaydan sonra, yani A'nın meydana gelme olasılığıdır.
P(A), P(B) - Aynı zamanda önceki olasılık, yani ilk olayın olasılığı, yani A veya ikinci olay, yani B'nin meydana gelme olasılığı olarak da adlandırılır.
Naïve Bayes sınıflandırıcısını eğitmek için, movie_reviewsNLTK'dan külliyat. Bu külliyatın iki kategorisi vardır, yani:pos ve neg. Bu kategoriler, kendileri için eğitilmiş bir sınıflandırıcıyı bir ikili sınıflandırıcı yapar. Derlemedeki her dosya ikiden oluşur; biri olumlu film incelemesi ve diğeri olumsuz film incelemesidir. Örneğimizde, her bir dosyayı sınıflandırıcıyı hem eğitmek hem de test etmek için tek bir örnek olarak kullanacağız.
Misal
Sınıflandırıcı eğitimi için, [(featureset, label)]. İştefeatureset değişken bir dict ve etiket, için bilinen sınıf etiketidir. featureset. Adlı bir fonksiyon oluşturacağızlabel_corpus() adlı bir külliyat alacak movie_reviewsve ayrıca adlı bir işlev feature_detectorvarsayılan olan bag of words. {Label: [featureset]} formunun bir eşlemesini oluşturur ve döndürür. Bundan sonra, bu eşlemeyi, etiketli eğitim örneklerinin ve test örneklerinin bir listesini oluşturmak için kullanacağız.
import collections
def label_corpus(corp, feature_detector=bow):
label_feats = collections.defaultdict(list)
for label in corp.categories():
for fileid in corp.fileids(categories=[label]):
feats = feature_detector(corp.words(fileids=[fileid]))
label_feats[label].append(feats)
return label_feats
Yukarıdaki fonksiyonun yardımıyla bir eşleme elde edeceğiz {label:fetaureset}. Şimdi adında bir fonksiyon daha tanımlayacağızsplit geri dönen bir eşleme alacak label_corpus() işlev ve her özellik grubu listesini etiketli eğitime ve ayrıca test örneklerine böler.
def split(lfeats, split=0.75):
train_feats = []
test_feats = []
for label, feats in lfeats.items():
cutoff = int(len(feats) * split)
train_feats.extend([(feat, label) for feat in feats[:cutoff]])
test_feats.extend([(feat, label) for feat in feats[cutoff:]])
return train_feats, test_feats
Şimdi, bu işlevleri derlememizde kullanalım, yani film
from nltk.corpus import movie_reviews
from featx import label_feats_from_corpus, split_label_feats
movie_reviews.categories()
Çıktı
['neg', 'pos']
Misal
lfeats = label_feats_from_corpus(movie_reviews)
lfeats.keys()
Çıktı
dict_keys(['neg', 'pos'])
Misal
train_feats, test_feats = split_label_feats(lfeats, split = 0.75)
len(train_feats)
Çıktı
1500
Misal
len(test_feats)
Çıktı
500
Biz gördük movie_reviewskülliyatta 1000 pos dosyası ve 1000 neg dosyası vardır. Ayrıca 1500 etiketli eğitim örneği ve 500 etiketli test örneği elde ediyoruz.
Şimdi eğitelim NaïveBayesClassifier kullanarak train() sınıf yöntemi -
from nltk.classify import NaiveBayesClassifier
NBC = NaiveBayesClassifier.train(train_feats)
NBC.labels()
Çıktı
['neg', 'pos']
Karar Ağacı Sınıflandırıcısı
Bir diğer önemli sınıflandırıcı da karar ağacı sınıflandırıcıdır. Onu eğitmek için buradaDecisionTreeClassifiersınıf bir ağaç yapısı oluşturacaktır. Bu ağaç yapısında her düğüm bir özellik adına karşılık gelir ve dallar özellik değerlerine karşılık gelir. Ve dalların aşağısında ağacın yapraklarına, yani sınıflandırma etiketlerine ulaşacağız.
Karar ağacı sınıflandırıcısını eğitmek için aynı eğitim ve test özelliklerini kullanacağız, örn. train_feats ve test_featsyarattığımız değişkenler movie_reviews külliyat.
Misal
Bu sınıflandırıcıyı eğitmek için arayacağız DecisionTreeClassifier.train() aşağıdaki gibi sınıf yöntemi -
from nltk.classify import DecisionTreeClassifier
decisiont_classifier = DecisionTreeClassifier.train(
train_feats, binary = True, entropy_cutoff = 0.8,
depth_cutoff = 5, support_cutoff = 30
)
accuracy(decisiont_classifier, test_feats)
Çıktı
0.725
Maksimum Entropi Sınıflandırıcısı
Diğer bir önemli sınıflandırıcı MaxentClassifier olarak da bilinen conditional exponential classifier veya logistic regression classifier. Onu eğitmek için burada,MaxentClassifier sınıfı, kodlamayı kullanarak etiketli özellik kümelerini vektöre dönüştürür.
Karar ağacı sınıflandırıcısını eğitmek için aynı eğitim ve test özelliklerini kullanacağız, örn. train_featsve test_featsyarattığımız değişkenler movie_reviews külliyat.
Misal
Bu sınıflandırıcıyı eğitmek için arayacağız MaxentClassifier.train() aşağıdaki gibi sınıf yöntemi -
from nltk.classify import MaxentClassifier
maxent_classifier = MaxentClassifier
.train(train_feats,algorithm = 'gis', trace = 0, max_iter = 10, min_lldelta = 0.5)
accuracy(maxent_classifier, test_feats)
Çıktı
0.786
Scikit-learn Sınıflandırıcı
En iyi makine öğrenimi (ML) kitaplıklarından biri Scikit-learn'dur. Aslında çeşitli amaçlar için her türden makine öğrenimi algoritmasını içerir, ancak hepsi aşağıdaki gibi aynı uyum tasarım modeline sahiptir -
- Modeli verilere uydurma
- Ve tahmin yapmak için bu modeli kullanın
Scikit-learn modellerine doğrudan erişmek yerine, burada NLTK'ları kullanacağız. SklearnClassifiersınıf. Bu sınıf, NLTK'nın Sınıflandırıcı arayüzüne uymasını sağlamak için bir scikit-learn modelinin etrafındaki bir sarmalayıcı sınıfıdır.
Bir eğitmek için aşağıdaki adımları izleyeceğiz SklearnClassifier sınıf -
Step 1 - Önce önceki tariflerde yaptığımız gibi eğitim özellikleri oluşturacağız.
Step 2 - Şimdi, bir Scikit-öğrenme algoritması seçin ve içe aktarın.
Step 3 - Sonra, bir SklearnClassifier Seçilen algoritma ile sınıf.
Step 4 - Son olarak antrenman yapacağız SklearnClassifier eğitim özelliklerimizle sınıf.
Bu adımları aşağıdaki Python tarifine uygulayalım -
from nltk.classify.scikitlearn import SklearnClassifier
from sklearn.naive_bayes import MultinomialNB
sklearn_classifier = SklearnClassifier(MultinomialNB())
sklearn_classifier.train(train_feats)
<SklearnClassifier(MultinomialNB(alpha = 1.0,class_prior = None,fit_prior = True))>
accuracy(sk_classifier, test_feats)
Çıktı
0.885
Hassasiyet ve geri çağırma ölçümü
Çeşitli sınıflandırıcıları eğitirken bunların doğruluğunu da ölçtük. Ancak doğruluktan ayrı olarak sınıflandırıcıları değerlendirmek için kullanılan çok sayıda başka ölçüt vardır. Bu ölçümlerden ikisiprecision ve recall.
Misal
Bu örnekte, daha önce eğittiğimiz NaiveBayesClassifier sınıfının hassasiyetini ve geri çağrılmasını hesaplayacağız. Bunu başarmak için, biri eğitimli sınıflandırıcı ve diğeri etiketli test özellikleri olmak üzere iki bağımsız değişken alacak olan metrics_PR () adlı bir işlev oluşturacağız. Her iki argüman da sınıflandırıcıların doğruluğunu hesaplarken geçirdiğimizle aynıdır -
import collections
from nltk import metrics
def metrics_PR(classifier, testfeats):
refsets = collections.defaultdict(set)
testsets = collections.defaultdict(set)
for i, (feats, label) in enumerate(testfeats):
refsets[label].add(i)
observed = classifier.classify(feats)
testsets[observed].add(i)
precisions = {}
recalls = {}
for label in classifier.labels():
precisions[label] = metrics.precision(refsets[label],testsets[label])
recalls[label] = metrics.recall(refsets[label], testsets[label])
return precisions, recalls
Kesinliği bulmak ve geri çağırmak için bu işlevi arayalım -
from metrics_classification import metrics_PR
nb_precisions, nb_recalls = metrics_PR(nb_classifier,test_feats)
nb_precisions['pos']
Çıktı
0.6713532466435213
Misal
nb_precisions['neg']
Çıktı
0.9676271186440678
Misal
nb_recalls['pos']
Çıktı
0.96
Misal
nb_recalls['neg']
Çıktı
0.478
Sınıflandırıcı ve oylamanın kombinasyonu
Sınıflandırıcıları birleştirmek, sınıflandırma performansını iyileştirmenin en iyi yollarından biridir. Ve oylama, birden çok sınıflandırıcıyı birleştirmenin en iyi yollarından biridir. Oylama için tek sayıda sınıflandırıcıya ihtiyacımız var. Aşağıdaki Python tarifinde NaiveBayesClassifier sınıfı, DecisionTreeClassifier sınıfı ve MaxentClassifier sınıfı olmak üzere üç sınıflandırıcıyı birleştireceğiz.
Bunu başarmak için, aşağıdaki gibi voting_classifiers () adında bir işlev tanımlayacağız.
import itertools
from nltk.classify import ClassifierI
from nltk.probability import FreqDist
class Voting_classifiers(ClassifierI):
def __init__(self, *classifiers):
self._classifiers = classifiers
self._labels = sorted(set(itertools.chain(*[c.labels() for c in classifiers])))
def labels(self):
return self._labels
def classify(self, feats):
counts = FreqDist()
for classifier in self._classifiers:
counts[classifier.classify(feats)] += 1
return counts.max()
Üç sınıflandırıcıyı birleştirmek ve doğruluğu bulmak için bu işlevi arayalım -
from vote_classification import Voting_classifiers
combined_classifier = Voting_classifiers(NBC, decisiont_classifier, maxent_classifier)
combined_classifier.labels()
Çıktı
['neg', 'pos']
Misal
accuracy(combined_classifier, test_feats)
Çıktı
0.948
Yukarıdaki çıktıdan, birleşik sınıflandırıcıların tek tek sınıflandırıcılardan en yüksek doğruluğu elde ettiğini görebiliriz.