Pada tutorial ini, akan dilakukan proses klasifikasi data dari media sosial. Terdapat dua jenis
data yang digunakan dalam tutorial yaitu:
a. Data terstruktur: Klasifikasi gender dari profil pengguna Twitter
b. Data tidak terstruktur (natural text): Klasifikasi emosi dari tweet berbahasa Indonesia
Persiapan
Untuk dapat mengikuti tutorial ini, pastikan Anda sudah menginstall program sebagai berikut:
1. Installasi Python
Pada tutorial ini, akan digunakan Python versi 3.6. Untuk memudahkan, bisa gunakan
installasi Python dari Anaconda1
2. Installasi Python Library
Python Library yang digunakan dalam tutorial ini antara lain:
- Numpy
- Pandas
- Scikit-Learn
- NLTK
- python-crfsuite
- Matplotlib
- Sastrawi
- Jupyter Notebook
Pada tutorial ini, akan digunakan Jupyter Notebook sebagai IDE. Namun, Anda dibebaskan
menggunakan IDE lain sesuai preferensi masing-masing.
1
https://www.anaconda.com/
A. Klasifikasi gender dari profil user Twitter
Pada percobaan ini, akan digunakan dataset dari Kaggle 2 yang telah dimodifikasi untuk
mengklasifikasikan gender pengguna Twitter. Dataset ini memuat informasi pengguna Twitter
dan juga sampel tweet. Tabel 1 merangkum informasi atribut pada dataset yang digunakan pada
tutorial ini (data_gender.csv).
Tabel 1. Informasi Atribut pada Dataset data_gender.csv
Nama Atribut Jenis Data Keterangan
gender kategorikal gender penggunan Twitter, akan digunakan
sebagai label
fav_number numerik jumlah tweet yang difavoritkan oleh pengguna
link_color kategorikal warna link pada profil pengguna, dituliskan
dalam hex code
1. Membaca data
Library pandas digunakan untuk membaca dataset. Tipe data yang terbentuk setelah
pembacaan csv menggunakan fungsi read_csv dari pandas adalah dataframe. Untuk
mengetahui dimensi dari data frame yang terbentuk, dapat digunakan fungsi shape.
Sementara itu, data.head() digunakan untuk menampilkan sampel data.
#Code 1
#Membaca data menggunakan pandas
import pandas as pd
data = pd.read_csv('dataset/gender-data.csv',
delimiter=',')
print(data.shape)
data.head()
2
https://www.kaggle.com/efeergun96/classification-by-tweets-nlp
2. Fungsi describe()
Fungsi describe() digunakan untuk menampilkan gambaran statistik singkat dari
keseluruhan data atau kolom/fitur tertentu dari data.
#Code 2
data.describe()
Fungsi describe() akan menampilkan statistik standar (mean, std, min, max) untuk
kolom/atribut bertipe kuantitatif (numerik) sedangkan untuk kolom bertipe kualitatif
(kategorikal) maka informasi yan akan ditampilkan berupa:
count: Jumlah filled in/ row yang terisi
unique: Berapa banyak nilai unik/level
top: Nama item yang paling banyak muncul dalam data
Freq: Seberapa sering top item umum muncul dalam data
contoh:
raw_data['sidebar_color'].value_counts()
#Code 3a
Menampilkan tipe data sebelum transformasi
#Code 3b
Mengubah semua kolom dengan tipe “object” ke bentuk “category”
data[data.select_dtypes(['object']).columns] =
data.select_dtypes(['object']).apply(lambda
x:x.astype('category'))
raw_data[raw_data.select_dtypes(['category']).columns] =
raw_data.select_dtypes(['category']).apply(lambda
x:x.cat.codes)
raw_data.head()
#Code 4
#mendefinisikan fitur dan label
print(train_feat.shape)
print(test_feat.shape)
# Training classifier
model = NB.fit(train, train_labels)
6. Evaluasi
Secara umum, evaluasi pada klasifikasi diukur dengan menggunakan akurasi.
Akurasi dihitung berdasarkan jumlah data yang diprediksi benar dibagi dengan total
data yang diuji secara keseluruhan. Namun ada pula beberapa ukuran evaluasi yang
lain misalnya precision, recall dan F1-Score.
#Code 6
from sklearn.metrics import
accuracy_score,confusion_matrix, precision_score,
recall_score
print(confusion_matrix(test_labels,pred))
3
https://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html
Tugas Tutorial A
1. Buatlah visualisasi confusion matrix yang dinormalisasi dari hasil prediksi pada testing
data. Buatlah interpretasi dari confusion matrix tersebut.
2. Lakukan percobaan klasifikasi data gender tersebut dengan model klasifiksi yang lain yaitu
Logistic Regression, Decision Tree dan K-Nearest Neighbor dengan jumlah k=5. Lakukan
evaluasi dengan parameter akurasi, precision dan recall. Berikan analisis dari hasil yang
didapatkan.
Dataset ini memuat tweet beremosi eksplisit dan implisit. Tabel 2 menunjukkan contoh
tweet beremosi eksplisit dan implisit.
Untuk mengklasifikan tweet menjadi lima kelas emosi, akan dilakukan ekstraksi fitur
sebagai berikut:
- Fitur Bag-of-words (unigram)
- Fitur Sentimen Lexicon
- Fitur POS Tag
- Fitur Ortografi
Langkah-langkah untuk melakukan klasifikasi emosi pada dataset tweet emosi tersebut
adalah sebagai berikut:
1. Import library
Library yang digunakan dalam percobaan ini antara lain pandas, numpy, nltk dan
sklearn.
#Code 1
#import library
import pandas as pd
import numpy as np
import nltk
import Sastrawi
import re
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import cross_validate
from sklearn.metrics import confusion_matrix
from sklearn.naive_bayes import MultinomialNB
from nltk.tag import CRFTagger
from collections import Counter
import warnings
warnings.filterwarnings("ignore")
2. Membaca data
Data dibaca dengan library pandas.
#Code 2
#membaca data
raw_data = pd.read_csv("dataset/Twitter_Emotion_Dataset.csv",
delimiter=",", encoding="Latin-1")
raw_data.head()
3. Pra-pemrosesan data
Data Twitter bersifat unstructured dan memiliki format penulisan bebas (tidak sesuai
kaidah penulisan yang benar). Oleh karena itu, dilakukan pra-pemrosesan data untuk
melakukan normalisasi isi tweet.
#Code 3b
def remove_stopwords(tweet):
stopwords = pd.read_csv("dataset/stopwords.csv")
special_list = ['username', 'url', 'sensitive-no']
token = nltk.word_tokenize(tweet)
token_afterremoval = []
for k in token:
if k not in stopwords and k not in special_list:
token_afterremoval.append(k)
c. Untuk percobaan diluar tutorial, Anda bisa mencoba opsi stemming pada tahap
pra-pemrosesan. Pendefinisian fungsi stemming akan dijalankan pada tutorial ini,
namun tidak dijalankan untuk stemming keseluruhan data. Fungsi stemming(tweet)
menerima input berupa satu buah tweet bertipe string.
#Code 3c
def Stemming(tweet):
token = nltk.word_tokenize(tweet)
stem_kalimat = []
for k in token:
factory = StemmerFactory()
stemmer = factory.create_stemmer()
stem_kata = stemmer.stem(clean_tw)
stem_kalimat.append(stem_kata)
#Code 4d
def pra_pemrosesan(list_tweet):
tweet_clean = []
for tw in list_tweet:
normal_tweet = normalisasi(tw)
nosw_tweet = remove_stopwords(normal_tweet)
#stem_tweet = Stemming(nosw_tweet)
tweet_clean.append(nosw_tweet)
return tweet_clean
raw_tweet = raw_data['tweet']
label = raw_data['label'].tolist()
clean_tweet = pra_pemrosesan(raw_tweet)
clean_tweet[:3]
4. Ekstraksi Bag-of-Words
Fitur Bag-of-Words atau unigram memuat informasi mengenai frekuensi kemunculan
suatu kata di dokumen. Fitur unigram dibentuk menggunakan library CountVectorizer
dari Scikit-learn. Jumlah kata unik (vocabulary) yang terbentuk bergantung dari data
yang digunakan. Akan tetapi, dalam percobaan ini akan digunakan parameter
max_features=2000 dimana akan diambil 2.000 kata unik yang memiliki frekuensi
kemunculan tertinggi.
#Code 4
def EkstraksiBoW(tweet):
unigram = CountVectorizer(ngram_range=(1,1),
max_features=2000)
unigram_matrix =
unigram.fit_transform(np.array(tweet)).todense()
nama_fitur = unigram.get_feature_names()
return unigram_matrix, nama_fitur
Clara Vania, Moh. Ibrahim, and Mirna Adriani. Sentiment Lexicon Generation
for an Under-Resourced Language. CICLING 2014 (IJCLA)
Daftar kata bersentimen positif terdapat pada positif_vania.txt dan daftar kata
bersentimen negative terdapat pada negatif_vania.txt.
#Code 5a
Code ini digunakan untuk mendefinisikan fungsi Ekstraksi Sentimen yang menerima
input berupa list tweet.
def EkstraksiSentimen(list_tweet):
pos = pd.read_csv("dataset/positif_vania.txt",
header=None, names=['pos'])
list_pos = pos['pos'].tolist()
neg = pd.read_csv("dataset/negative_vania.txt",
header=None, names=['neg'])
list_neg = neg['neg'].tolist()
fitur_sentimen_all = []
for tweet in list_tweet:
##inisiasi value
emosi = ["positif", "negatif"]
value = [0,0]
emosi_value = {}
for i in range(len(emosi)):
emosi_value[emosi[i]] = value[i]
list_kata = tweet.split()
for k in list_kata:
if k in list_pos:
emosi_value["positif"] += 1
if k in list_neg:
emosi_value["negatif"] += 1
fitur_sentimen_perkalimat = list(emosi_value.values())
fitur_sentimen_all.append(fitur_sentimen_perkalimat)
return fitur_sentimen_all
#Code 5b
Code ini digunakan untuk memanggil fungsi EkstraksiSentimen dan menampilkan
sampel hasil ekstraksi.
sentlex_feat = EkstraksiSentimen(clean_tweet)
print(sentlex_feat[:10])
Raw data pre-trained POS Tag yang belum ditransformasi ke bentuk CRF.Tagger bisa
didapatkan di Fam Rashel’s Github4.
ct.set_model_file("dataset/all_indo_man_tag_corpus_model.crf.t
agger")
pos_feat_list = []
count_tag = []
for tweet in list_tweet:
4
https://github.com/famrashel/idn-tagged-corpus
token = nltk.word_tokenize(tweet)
tag = ct.tag_sents([token])
flat_tag = [item for sublist in tag for item in
sublist]
pos_count = Counter([j for i,j in flat_tag])
pos_feat = (pos_count['JJ'], pos_count['NEG'])
pos_feat_list.append(pos_feat)
return pos_feat_list
8. Klasifikasi
Pada percobaan ini, klasifikasi dilakukan dengan menggunakan algoritma Multinomial
Naïve Bayes. Pembagian data training dan testing digunakan menggunakan model k-
fold Cross Validation dengan nilai k = 10. Dengan model Cross-Validation, proses
training dan testing akan dilakukan sebanyak k kali dengan pembagian data yang
berbeda.
#Code 8
feat_list = [unigram_feat, sentlex_feat, postag_feat,
orto_feat]
feat_name = ["Unigram", "Sentimen", "POS", "Ortografi"]
for f, n in zip(feat_list, feat_name):
X = f
y = label
scoring = ['accuracy', 'f1_macro']
nb = MultinomialNB()
scores = cross_validate(nb, X, y, cv=10, scoring=scoring)
acc = np.mean(scores['test_accuracy'])
f1 = np.mean(scores['test_f1_macro'])
print("Jenis Fitur : ", n)
print("Akurasi :", acc)
print("F1-Score :", f1)
print("---------------")
Tugas Tutorial B
1. Lakukan analisis terhadap hasil percobaan diatas.
2. Menurut pemahaman Anda, apa yang dimaksud dengan fitur ortografi?
3. Terdapat leksikon lain yang disertakan dalam tutorial ini yaitu leksikon sentimen dari
penelitian Koto and Rahmaningtyas (Inset Lexicon)
Tutorial 2 akan dilaksanakan pada Selasa, 2 April 2019. Tutorial ini akan membahas
cara melakukan data collection dari Twitter. Oleh karena itu, sebelum Tutorial 2
dimulai, peserta kelas Analitika Media Sosial diharapkan melakukan request token
Twitter API di Twitter Developer website5. Dalam mengajukan request, Anda
diharapkan mengisi form dengan jawaban yang baik karena jawaban akan direview oleh
Twitter. Perlu diperhatikan bahwa request access token Twitter API membutuhkan
waktu persetujuan setelah request. Oleh karena itu, diharapkan peserta tutorial
mengajukan request token sesegera mungkin agar saat tutorial access token sudah
tersedia.
5
https://developer.twitter.com/en/docs/basics/developer-portal/overview