Perangkat Bahasa Alami - Klasifikasi Teks
Apa itu klasifikasi teks?
Klasifikasi teks, sesuai dengan namanya, adalah cara untuk mengkategorikan potongan teks atau dokumen. Tetapi di sini muncul pertanyaan mengapa kita perlu menggunakan pengklasifikasi teks? Setelah memeriksa penggunaan kata dalam dokumen atau bagian teks, pengklasifikasi akan dapat memutuskan label kelas apa yang harus diberikan padanya.
Pengklasifikasi Biner
Seperti namanya, pengklasifikasi biner akan memutuskan antara dua label. Misalnya positif atau negatif. Dalam hal ini, bagian teks atau dokumen dapat berupa satu label atau lainnya, tetapi tidak keduanya.
Pengklasifikasi Multi-label
Berlawanan dengan pengklasifikasi biner, pengklasifikasi multi-label dapat menetapkan satu atau beberapa label ke bagian teks atau dokumen.
Kumpulan Fitur Berlabel Vs Tidak Berlabel
Pemetaan nilai kunci dari nama fitur ke nilai fitur disebut kumpulan fitur. Kumpulan fitur berlabel atau data pelatihan sangat penting untuk pelatihan klasifikasi agar nantinya bisa mengklasifikasikan set fitur tak berlabel.
Set Fitur Berlabel | Set Fitur Tidak Berlabel |
---|---|
Ini adalah tupel yang terlihat seperti (feat, label). | Itu adalah prestasi tersendiri. |
Ini adalah instance dengan label kelas yang dikenal. | Tanpa label terkait, kita dapat menyebutnya sebagai instance. |
Digunakan untuk melatih algoritme klasifikasi. | Setelah dilatih, algoritme klasifikasi dapat mengklasifikasikan kumpulan fitur yang tidak berlabel. |
Ekstraksi Fitur Teks
Ekstraksi fitur teks, seperti namanya, adalah proses mengubah daftar kata menjadi kumpulan fitur yang dapat digunakan oleh pengklasifikasi. Kita harus mengubah teks kita menjadi‘dict’ gaya fitur diatur karena Natural Language Tool Kit (NLTK) mengharapkan ‘dict’ set fitur gaya.
Model Bag of Words (BoW)
BoW, salah satu model paling sederhana di NLP, digunakan untuk mengekstrak fitur dari potongan teks atau dokumen sehingga dapat digunakan dalam pemodelan seperti dalam algoritma ML. Ini pada dasarnya membangun kumpulan fitur kehadiran kata dari semua kata dalam sebuah instance. Konsep di balik metode ini adalah tidak peduli berapa kali sebuah kata muncul atau urutan kata-katanya, metode ini hanya peduli apakah kata tersebut ada dalam daftar kata atau tidak.
Contoh
Untuk contoh ini, kita akan mendefinisikan sebuah fungsi bernama bow () -
def bow(words):
return dict([(word, True) for word in words])
Sekarang, mari kita telepon bow()berfungsi pada kata-kata. Kami menyimpan fungsi ini dalam file bernama bagwords.py.
from bagwords import bow
bow(['we', 'are', 'using', 'tutorialspoint'])
Keluaran
{'we': True, 'are': True, 'using': True, 'tutorialspoint': True}
Pengklasifikasi pelatihan
Di bagian sebelumnya, kita belajar bagaimana mengekstrak fitur dari teks. Jadi sekarang kita bisa melatih pengklasifikasi. Pengklasifikasi pertama dan termudah adalahNaiveBayesClassifier kelas.
Penggolong Naïve Bayes
Untuk memprediksi probabilitas suatu set fitur tertentu milik label tertentu, digunakan teorema Bayes. Rumus teorema Bayes adalah sebagai berikut.
$$ P (A | B) = \ frac {P (B | A) P (A)} {P (B)} $$Sini,
P(A|B) - Ini juga disebut probabilitas posterior yaitu probabilitas peristiwa pertama yaitu A terjadi mengingat peristiwa kedua yaitu B terjadi.
P(B|A) - Ini adalah probabilitas peristiwa kedua yaitu B terjadi setelah peristiwa pertama yaitu A terjadi.
P(A), P(B) - Disebut juga probabilitas prior yaitu probabilitas kejadian pertama yaitu A atau event kedua yaitu B terjadi.
Untuk melatih pengklasifikasi Naïve Bayes, kami akan menggunakan movie_reviewskorpus dari NLTK. Korpus ini memiliki dua kategori teks, yaitu:pos dan neg. Kategori ini membuat pengklasifikasi dilatihkan padanya sebagai pengklasifikasi biner. Setiap file dalam korpus terdiri dari dua, satu review film positif dan review film negatif. Dalam contoh kami, kami akan menggunakan setiap file sebagai contoh tunggal untuk melatih dan menguji pengklasifikasi.
Contoh
Untuk pengklasifikasi pelatihan, kita memerlukan daftar set fitur berlabel, yang akan berbentuk [(featureset, label)]. Di sinifeatureset variabel adalah a dict dan label adalah label kelas yang dikenal untuk featureset. Kami akan membuat fungsi bernamalabel_corpus() yang akan mengambil korpus bernama movie_reviewsdan juga fungsi bernama feature_detector, yang secara default adalah bag of words. Ini akan membangun dan mengembalikan pemetaan dari bentuk, {label: [featureset]}. Setelah itu kita akan menggunakan pemetaan ini untuk membuat daftar contoh pelatihan berlabel dan contoh pengujian.
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
Dengan bantuan fungsi di atas kita akan mendapatkan pemetaan {label:fetaureset}. Sekarang kita akan mendefinisikan satu fungsi lagi bernamasplit yang akan mengambil kembali pemetaan dari label_corpus() berfungsi dan membagi setiap daftar set fitur menjadi pelatihan berlabel serta contoh pengujian.
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
Sekarang, mari kita gunakan fungsi-fungsi ini pada korpus kita, yaitu movieroulette -
from nltk.corpus import movie_reviews
from featx import label_feats_from_corpus, split_label_feats
movie_reviews.categories()
Keluaran
['neg', 'pos']
Contoh
lfeats = label_feats_from_corpus(movie_reviews)
lfeats.keys()
Keluaran
dict_keys(['neg', 'pos'])
Contoh
train_feats, test_feats = split_label_feats(lfeats, split = 0.75)
len(train_feats)
Keluaran
1500
Contoh
len(test_feats)
Keluaran
500
Kami telah melihatnya di movie_reviewskorpus, ada 1000 file pos dan 1000 file neg. Kami juga mendapatkan 1500 contoh pelatihan berlabel dan 500 contoh pengujian berlabel.
Sekarang mari kita berlatih NaïveBayesClassifier menggunakan nya train() metode kelas -
from nltk.classify import NaiveBayesClassifier
NBC = NaiveBayesClassifier.train(train_feats)
NBC.labels()
Keluaran
['neg', 'pos']
Pengklasifikasi Pohon Keputusan
Pengklasifikasi penting lainnya adalah pengklasifikasi pohon keputusan. Di sini untuk melatihnyaDecisionTreeClassifierkelas akan membuat struktur pohon. Dalam struktur pohon ini setiap node berhubungan dengan nama fitur dan cabang sesuai dengan nilai fitur. Dan di bawah cabang kita akan sampai ke daun pohon yaitu label klasifikasi.
Untuk melatih pengklasifikasi pohon keputusan, kita akan menggunakan fitur pelatihan dan pengujian yang sama, yaitu train_feats dan test_feats, variabel tempat kita membuat movie_reviews korpus.
Contoh
Untuk melatih pengklasifikasi ini, kami akan memanggil DecisionTreeClassifier.train() metode kelas sebagai berikut -
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)
Keluaran
0.725
Pengklasifikasi Entropi Maksimum
Pengklasifikasi penting lainnya adalah MaxentClassifier yang juga dikenal sebagai a conditional exponential classifier atau logistic regression classifier. Di sini untuk melatihnya,MaxentClassifier kelas akan mengonversi set fitur berlabel ke vektor menggunakan pengkodean.
Untuk melatih pengklasifikasi pohon keputusan, kita akan menggunakan fitur pelatihan dan pengujian yang sama, yaitu train_featsdan test_feats, variabel tempat kita membuat movie_reviews korpus.
Contoh
Untuk melatih pengklasifikasi ini, kami akan memanggil MaxentClassifier.train() metode kelas sebagai berikut -
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)
Keluaran
0.786
Scikit-learn Classifier
Salah satu library machine learning (ML) terbaik adalah Scikit-learn. Ini sebenarnya berisi semua jenis algoritma ML untuk berbagai tujuan, tetapi semuanya memiliki pola desain yang sama seperti berikut -
- Menyesuaikan model dengan data
- Dan gunakan model itu untuk membuat prediksi
Daripada mengakses model scikit-learn secara langsung, di sini kita akan menggunakan NLTK SklearnClassifierkelas. Kelas ini adalah kelas pembungkus di sekitar model scikit-learn agar sesuai dengan antarmuka Pengklasifikasi NLTK.
Kami akan mengikuti langkah-langkah berikut untuk melatih a SklearnClassifier kelas -
Step 1 - Pertama kita akan membuat fitur pelatihan seperti yang kita lakukan di resep sebelumnya.
Step 2 - Sekarang, pilih dan impor algoritma Scikit-learn.
Step 3 - Selanjutnya, kita perlu membangun a SklearnClassifier kelas dengan algoritma yang dipilih.
Step 4 - Terakhir, kami akan berlatih SklearnClassifier kelas dengan fitur pelatihan kami.
Mari kita terapkan langkah-langkah ini dalam resep Python di bawah ini -
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)
Keluaran
0.885
Mengukur presisi dan perolehan
Saat melatih berbagai pengklasifikasi, kami juga telah mengukur akurasinya. Namun selain akurasi, ada sejumlah metrik lain yang digunakan untuk mengevaluasi pengklasifikasi. Dua dari metrik ini adalahprecision dan recall.
Contoh
Dalam contoh ini, kita akan menghitung presisi dan perolehan dari kelas NaiveBayesClassifier yang kita latih sebelumnya. Untuk mencapai ini kita akan membuat fungsi bernama metrics_PR () yang akan mengambil dua argumen, satu adalah pengklasifikasi terlatih dan lainnya adalah fitur pengujian berlabel. Kedua argumen tersebut sama seperti yang kami berikan saat menghitung keakuratan pengklasifikasi -
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
Mari kita panggil fungsi ini untuk menemukan presisi dan perolehan -
from metrics_classification import metrics_PR
nb_precisions, nb_recalls = metrics_PR(nb_classifier,test_feats)
nb_precisions['pos']
Keluaran
0.6713532466435213
Contoh
nb_precisions['neg']
Keluaran
0.9676271186440678
Contoh
nb_recalls['pos']
Keluaran
0.96
Contoh
nb_recalls['neg']
Keluaran
0.478
Kombinasi pengklasifikasi dan pemungutan suara
Menggabungkan pengklasifikasi adalah salah satu cara terbaik untuk meningkatkan kinerja klasifikasi. Dan pemungutan suara adalah salah satu cara terbaik untuk menggabungkan beberapa pengklasifikasi. Untuk pemungutan suara kita perlu memiliki jumlah pengklasifikasi ganjil. Dalam resep Python berikut ini kita akan menggabungkan tiga pengklasifikasi yaitu kelas NaiveBayesClassifier, kelas DecisionTreeClassifier dan kelas MaxentClassifier.
Untuk mencapai ini kita akan mendefinisikan fungsi bernama voting_classifiers () sebagai berikut.
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()
Mari kita panggil fungsi ini untuk menggabungkan tiga pengklasifikasi dan menemukan akurasi -
from vote_classification import Voting_classifiers
combined_classifier = Voting_classifiers(NBC, decisiont_classifier, maxent_classifier)
combined_classifier.labels()
Keluaran
['neg', 'pos']
Contoh
accuracy(combined_classifier, test_feats)
Keluaran
0.948
Dari keluaran di atas, kita dapat melihat bahwa pengklasifikasi gabungan mendapatkan akurasi tertinggi daripada pengklasifikasi individu.