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.