Klasifikasi Berita Malawi -Proyek NLP – Menuju AI — Teknologi, Sains, dan Teknik Terbaik

Pengarang: Abid Ali Awan

Pemrosesan Bahasa Alami

Menggunakan pengklasifikasi teks untuk memprediksi berbagai kategori dalam artikel Berita Malawi menggunakan SMOTE dan SGDClassifier.

Foto oleh Obi Onyeador di Unsplash

pengantar

Klasifikasi teks adalah umum di antara aplikasi yang kita gunakan sehari-hari. Misalnya, penyedia email menggunakan klasifikasi teks untuk menyaring email spam dari kotak masuk Anda. Penggunaan klasifikasi teks lainnya yang paling umum adalah dalam layanan pelanggan di mana mereka menggunakan analisis sentimental untuk membedakan ulasan buruk dari ulasan bagus. ADDI AI 2050. Penggunaan modern klasifikasi teks telah melampaui bentuk klasifikasi yang lebih maju yang mencakup klasifikasi multibahasa dan multilabel.

Contoh klasifikasi teks filter spam | ADDI AI 2050

Dalam beberapa tahun terakhir, bahasa Inggris telah berkembang pesat, tetapi model klasifikasi pelatihan pada bahasa sumber daya rendah dan panjang yang bervariasi masih menimbulkan kesulitan. Dalam kompetisi Zindi ini, kami diberikan artikel berita yang ditulis dalam bahasa Chichewa dan melatih model kami pada klasifikasi multi-label karena ada 19 kategori Berita. Teks terdiri dari artikel berita dengan panjang yang bervariasi sehingga mencari tahu model yang lebih baik akan menjadi tugas yang menantang. -Zindi.

Kompetisi Zindi | Tantangan Klasifikasi Berita AI4D Malawi

Kode proyek sederhana dan efektif atas dasar persaingan. Saya telah bereksperimen dengan Vectorizer, Porter stemmer untuk preprocessing tes. Saya juga telah menggunakan beberapa metode untuk membersihkan teks saya untuk meningkatkan kinerja model secara keseluruhan. Pada akhirnya, saya telah menggunakan pengklasifikasi SKlearn Stochastic Gradient Decent (SGD) untuk memprediksi kategori Berita. Saya juga telah bereksperimen dengan berbagai jaringan saraf dan model peningkatan gradien, tetapi semuanya gagal karena regresi logistik sederhana dengan penyetelan hyperparameter minimum bekerja dengan cukup baik pada data ini.

Kode

Lingkungan deepnote digunakan untuk melatih model klasifikasi.

Impor Perpustakaan

dari sklearn.feature_extraction.text impor TfidfVectorizer
dari sklearn.metrics mengimpor akurasi_score, klasifikasi_laporan, confusion_matrix
dari sklearn.model_selection impor train_test_split
dari sklearn.linear_model impor SGDClassifier
dari sklearn.preprocessing impor LabelEncoder
dari nltk.stem impor WordNetLemmatizer
dari imblearn.over_sampling impor SMOTE
impor matplotlib.pyplot sebagai plt
impor seaborn sebagai sns
impor panda sebagai pd
impor numpy sebagai np
impor ulang
peringatan impor
warnings.filterwarnings(“abaikan”)

Baca Kumpulan Data Kereta/Uji

Data dikumpulkan dari berbagai perusahaan penerbitan berita di Malawi. tNyasa Ltd Data Science Lab telah menggunakan tiga penyiar utama: surat kabar Nation Online, Radio Maria, dan Malawi Broadcasting Corporation — Zindi.
Data Pelatihan berisi tiga kolom:

ID: Unique Identifier Text: artikel berita Label: klasifikasi artikel berita.

Tugasnya adalah mengklasifikasikan artikel berita ke dalam salah satu dari 19 kategori.

Seperti yang Anda lihat, data kereta memiliki 1436 sampel sedangkan set data uji memiliki 620 sampel.

train_data = pd.read_csv(“../input/malawi-news-classification-challenge/Train.csv”)
test_data = pd.read_csv(“../input/malawi-news-classification-challenge/Test.csv”)
cetak(train_data.shape)
print(test_data.shape) >> (1436, 3)
>> (620, 2)

Mari kita lihat dua kolom teratas

kereta_data.head(2)

Mari kita lihat dua kolom bawah

train_data.tail(2)

Mari kita lihat distribusi label Train Dataset

Jelas bahwa kami memiliki distribusi kelas yang tidak seimbang yang dapat menyebabkan masalah selama pelatihan model pembelajaran mesin. Kategori POLITIK memimpin dalam kumpulan data kereta kami.

train_data.Label.value_counts().plot(kind=’bar’);
Gambar oleh Penulis | Gambar 1

Membersihkan Teks

Menghapus karakter khusus. Menurunkan teks. Lemmatisasi kata-kata. wn = WordNetLemmatizer()
def text_preprocessing(ulasan):
ulasan = re.sub(‘[^a-zA-Z]’, ‘ ‘, tinjauan)
ulasan = ulasan.lower()
ulasan = ulasan.split()
ulasan = [wn.lemmatize(word) for word in review if not word in chichewa]
ulasan = ‘ ‘.join(ulasan)
ulasan kembali

Menerapkan pra-pemrosesan teks

Cukup dengan menerapkan fungsi di atas pada set data uji dan latih.

kereta_data[‘Text’] = kereta_data[‘Text’].apply(text_preprocessing)
data_tes[‘Text’] = data_tes[‘Text’].apply(text_preprocessing)
cetak(train_data.head())
cetak(test_data.head())

Lihat Keluaran

Seperti yang Anda lihat, kami memiliki banyak teks yang lebih bersih, yang siap untuk dilatih pada model kami.

Vektorisasi Teks

Term Frequency Inverse Document Frequency (TFIDF). Algoritma mengubah data teks menjadi representasi bermakna dari angka Medium. Transformasi diperlukan karena model pembelajaran mesin tidak memahami data teks, jadi kami perlu mengubah data ke dalam format numerik. Kami akan mengonversi data teks kami menjadi vektor menggunakan transformasi SKlearn TFIDF dan bentuk data akhir kami akan memiliki 49480 kolom/fitur.

vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(train_data[‘Text’]).toarray()
pelatihan = pd.DataFrame(X, kolom=vectorizer.get_feature_names())
print(pelatihan.bentuk)
X_test_final = vectorizer.transform(test_data[‘Text’]).toarray()
test_new = pd.DataFrame(X_test_final, kolom=vectorizer.get_feature_names())
print(test_new.shape) >> (1436, 49480)
>> (620, 49480)

Mempersiapkan Data untuk Pelatihan

Menggunakan data kereta kami untuk mendapatkan X (fitur pelatihan) dan y (Target). Kami akan menggunakan pengkodean Label untuk mengubah label string menjadi label numerik seperti: [1,2,3….]

X = pelatihan
y = kereta_data[‘Label’]

Pengkodean Label

label_encoder = LabelEncoder()
y_label = label_encoder.fit_transform(y)

Data kami cukup tidak seimbang seperti terlihat pada Gambar 1. Kategori politik memiliki jumlah sampel terbanyak, setelah sosial dan agama. Ketidakseimbangan data ini akan menyebabkan model kami berkinerja buruk, jadi untuk meningkatkan kinerja model, kami harus menyeimbangkan data kami dengan menghapus sampel tambahan atau menggunakan Synthetic Minority Over-sampling Technique (SMOTE). SMOTE adalah teknik oversampling di mana sampel sintetis dihasilkan untuk kelas minoritas (analyticsvidhya.com).

Dalam kasus kami, semua kelas minoritas akan disintesis untuk mencocokkan Politik kelas mayoritas. Seperti yang Anda lihat, semua kelas memiliki jumlah sampel yang sama, yang sangat seimbang.

smote = SMOTE()
X, y_label = smote.fit_resample(X,y_label) np.bincount(y_label) >> array([279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279])

Model Pelatihan

Saya telah menggunakan:

tapi semuanya gagal dibandingkan dengan SGD. Singkatnya, menggunakan klasifikasi SGD dengan penyetelan hyperparameter sederhana akan memberi Anda hasil terbaik. Estimator ini mengimplementasikan model linear terreguler dengan pembelajaran sklearn.linear_model.SGDClassifier.

Membagi menjadi Train dan Test: 10% Dataset pengujian Menggunakan SGDClassifier: Gunakan fungsi loss sebagai engsel dengan alpha=0,0004, max_iter=20 X_train, X_test, y_train, y_test = train_test_split(X, y_label, test_size=0.1, random_state=0)
model = SGDClassifier(loss=’engsel’,
alfa=4e-4,
max_iter=20,
verbose=Salah)
model.fit(X_train, y_train) >> SGDClassifier(alpha=0,0004, max_iter=20, verbose=False)

Evaluasi

Model kami tampil cukup baik dengan teknik oversampling.

Model pelatihan tanpa SMOTE mendapatkan akurasi tertinggi sebesar 55%.

pred = model.predict(X_test)
print(“Skor Akurasi Kereta:”,round(model.score(X_train, y_train),2))
print(“Skor Akurasi Tes:”,round(accuracy_score(y_test, pred),2)) Skor Akurasi Latihan: 0,99 Skor Akurasi Tes: 0,95

Laporan Klasifikasi

Laporan klasifikasi untuk setiap kelas juga luar biasa karena mayoritas skor f1 adalah antara 90 hingga 100 persentase.

print(classification_report(y_test, pred)) presisi recall f1-score support 0 1.00 1.00 1.00 30
1 1.00 1.00 1.00 25
2 0,96 0,83 0,89 29
3 0,92 1,00 0,96 22
4 0,97 1,00 0,98 29
5 1.00 1.00 1.00 29
6 0.87 0.90 0.89 30
7 0,90 0,93 0,92 30
8 0,95 1,00 0,98 20
9 1,00 1,00 1,00 37
10 1.00 1.00 1.00 25
11 0,90 0,75 0,82 24
12 1.00 1.00 1.00 31
13 0,79 0,92 0,85 25
14 0,82 0,62 0,71 29
15 0,95 0,95 0,95 19
16 1,00 1,00 1,00 30
17 0.94 1.00 0.97 32
18 0,91 1,00 0,95 30
19 1,00 1,00 1,00 32 akurasi 0,95 558
rata-rata makro 0,94 0,94 0,94 558
rata-rata tertimbang 0,95 0,95 0,94 558

Matriks Kebingungan

Kami memiliki matriks kebingungan yang hampir sempurna pada dataset uji seperti yang Anda lihat pada Gambar 2.

test_pred = label_encoder.inverse_transform(pred)
test_label = label_encoder.inverse_transform(y_test)
cf_matrix = confusion_matrix(test_pred, test_label)
sns.heatmap(cf_matrix, annot=Benar;
Matriks Kebingungan oleh Penulis | Gambar 2

Penyerahan

Saatnya untuk memprediksi pada database pengujian dan membuat file CVS kita. File ini akan diunggah ke server Zindi untuk skor akhir pada dataset tes tersembunyi.

sub_pred = model.predict(test_new)
pengiriman = pd.DataFrame()
pengajuan[‘ID’] = data_tes[‘ID’]
pengajuan[‘Label’] = label_encoder.inverse_transform(sub_pred)
submit.to_csv(‘submission.csv’, index=False)
Gambar oleh Penulis

Kesimpulan

Kami mendapat skor yang cukup buruk pada dataset pengujian. Sepertinya model saya terlalu pas di kereta dan validasi. Ini adalah skor terbaik yang saya dapatkan dengan oversampling, meskipun model saya overfitting, saya mendapatkan hasil terbaik dengan menggunakan SMOTE dan SGDClassifier.

Saya bersenang-senang bereksperimen dengan berbagai model pembelajaran mesin dari jaringan Neural hingga Automl, tetapi set datanya cukup kecil dan tidak seimbang untuk mendapatkan skor yang lebih baik.

Solusi yang menang mendapat skor 0,7.

Berfokus pada data harus menjadi prioritas untuk mendapatkan hasil yang lebih baik. Artikel ini cukup sederhana dan ramah pemula sehingga siapa pun bisa mendapatkan 50 teratas menggunakan kode saya.

Anda dapat mengikuti saya di LinkedIn dan Polywork tempat saya memposting artikel luar biasa tentang ilmu data dan pembelajaran mesin.

Media yang ditampilkan dalam artikel ini tidak dimiliki oleh Analytics Vidhya dan digunakan atas kebijaksanaan Penulis.

Terkait

Awalnya diterbitkan di https://www.analyticsvidhya.com pada 11 Agustus 2021.

Klasifikasi Berita Malawi -Proyek NLP awalnya diterbitkan di Towards AI on Medium, di mana orang-orang melanjutkan percakapan dengan menyoroti dan menanggapi cerita ini.

Diterbitkan melalui Menuju AI