Anda di halaman 1dari 14

Tutorial 1 - Analitika Media Sosial

Sistem Informasi Semester Genap 2018/2019


Klasifikasi Data Media Sosial

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

retweet_count numerik jumlah tweet yang diretweet oleh pengguna

sidebar_color kategorikal warna sidebar pada profil pengguna,


dituliskan dalam hex code

tweet_count numerik jumlah tweet yang ditulis oleh pengguna


user_timezone kategorikal jenis zona waktu pengguna

Langkah-langkah untuk mengklasifikasikan gender dari dataset tersebut adalah sebagai


berikut:

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()

3. Transformasi data kategorikal ke numerik


Atribut kategorikal perlu ditransformasi ke bentuk numerik untuk bisa digunakan
sebagai fitur dalam klasifikasi. Proses encoding dari data kategorikal ke data numerik
dapat dilakukan dengan fungsi cat.codes.

#Code 3a
Menampilkan tipe data sebelum transformasi

# tipe data column sebelum transformasi


print("Column Data Type before transformation \n",
raw_data.dtypes)

#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'))

print("Column Data Type After Transformation \n",


data.dtypes)
#Code 3c
melakukan encoding data kategorikal ke numerik dengan cat.codes

raw_data[raw_data.select_dtypes(['category']).columns] =
raw_data.select_dtypes(['category']).apply(lambda
x:x.cat.codes)

print("Column Data Type after Transformation \n",


raw_data.dtypes)

raw_data.head()

4. Mendefinisikan fitur dan label


Pada percobaan ini, fitur yang akan digunakan meliputi fav_number, link_color,
retweet_count, sidebar_color, tweet_count, user_timezone. Sementara itu, kolom
gender akan digunakan sebagai label.

#Code 4
#mendefinisikan fitur dan label

feat_column = ['fav_number', 'link_color',


'retweet_count', 'sidebar_color', 'tweet_count',
'user_timezone']
feat = raw_data[feat_column]
label = raw_data['gender']

5. Pembagian Data, Training dan Testing


Hal yang pertama dilakukan sebelum melakukan pembagian data dan training-testing
adalah melakukan import library sklearn berupa classifier (Multinomial Naïve Bayes)
dan model selection berupa train_test_split. Pada percobaan ini, dilakukan pembagian
proporsi 90:10 dimana 90% dibagi menjadi data training dan 10% menjadi data testing.
Multinomial Naïve Bayes digunakan untuk membentuk model yang belajar dari data
training. Selanjutnya, model yang dibangun digunakan untuk memprediksi data testing
yang tidak berlabel.

#Code 5a - import classifier dan model selection


#import classifier
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
#Code 5 b – Pembagian data dengan proporsi 90:10
# Pembagian data dengan proporsi 90:10

train_feat, test_feat, train_labels, test_labels =


train_test_split(feat,label,test_size=0.1,random_state=15
0)

print(train_feat.shape)
print(test_feat.shape)

#Code 5 c – Training dan testing


# inisiasi jenis classifier
NB = MultinomialNB()

# Training classifier
model = NB.fit(train, train_labels)

# prediksi data testing


pred = model.predict(test)

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("Akurasi = ", accuracy_score(test_labels, pred))


print("Precision = ", precision_score(test_labels,pred))
print("Recall = ", recall_score(test_labels,pred))

print(confusion_matrix(test_labels,pred))

7. Visualisasi Confusion Matrix


Visualisasi digunakan untuk memudahkan pembacaan confusion matrix. Source code
visualisasi confusion matrix ini didapatkan dari halaman resmi scikit-learn3.

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.

B. Klasifikasi Emosi pada Tweet Bahasa Indonesia


Pada percobaan ini, kita akan mengklasifikan tweet Bahasa Indonesia ke dalam lima kelas
emosi yaitu senang, cinta, marah, sedih, takut. Dataset yang digunakan dalam percobaan
ini didapatkan dari paper berikut:

Mei Silvana Saputri, Rahmad Mahendra, and Mirna Adriani, Emotion


Classification on Indonesian Twitter Dataset. International Conference on Asian
Language Processing (IALP) 2018. Bandung. 2018.
Dataset terdiri dari 4.403 tweet yang sudah dilakukan pre-processing dengan ketentuan
sebagai berikut:
- Username dan mention (ditandai dengan @) diganti dengan kata [USERNAME]
- URL/hyperlink (http:// atau https://..) diganti dengan kata [URL]
- Nomor sensitif, misalnya nomor telepon, nomor invoice, no pelacakan jasa
pengiriman diganti dengan kata [SENSITIVE-NO]

Dataset ini memuat tweet beremosi eksplisit dan implisit. Tabel 2 menunjukkan contoh
tweet beremosi eksplisit dan implisit.

Tabel 2. Contoh data emosi eksplisit dan emosi implisit


Emosi eksplisit Emosi implisit
hari ini libur, rencananya mau nonton Ini aja membuktikan anda sudah TIDAK
Jurassic BENAR....!!! MASA NAPI KORUPTOR
World, tapi kayanya gajadi deh mengingat BISA PUNYA HP DI PENJARA ITU
kondisi yg gak fit bgt ini sebel. Rusak SDH
rencana MELANGGAR ATURAN.... DAN ANDA
sebelanga.. sebel akutu DG ENAKNYA MELANGGAR
(marah) ATURAN...!!
INI MENANDAKAN BAHWA ITULAH
KARAKTER ANDA (marah)

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.

Dalam percobaan ini, dilakukan pra-pemrosesan berupa:


a. Normalisasi tweet
Normalisasi tweet terdiri dari pengubahan ke huruf kecil, pembuangan spasi yang
berlebihan, trimming, pembuangan tanda baca, penghilangan huruf berulang
(misalnya haiiii → hai). Fungsi normalisasi (tweet) menerima input berupa satu
buah tweet mentah bertipe string.
#Code 3a
def normalisasi(tweet):
normal_tw = tweet.lower() #lowercase
normal_tw = re.sub('\s+', ' ', normal_tw) # remove extra
space
normal_tw = normal_tw.strip() #trim depan belakang
normal_tw = re.sub(r'[^\w\s]','',normal_tw) #buang
punctuation
normal_regex = re.compile(r"(.)\1{1,}", re.IGNORECASE)
#regex huruf yang berulang kaya haiiii (untuk fitur unigram)
normal_tw = normal_regex.sub(r"\1\1", normal_tw) #buang
huruf yang berulang
return normal_tw

b. Pembuangan stopwords dan istilah spesial (username, hyperlink, sensitive-no).


List stopwords didapatkan dari penelitian Tala.

Tala, F. Z. (2003). A Study of Stemming Effects on Information Retrieval in


Bahasa Indonesia. M.S. thesis. M.Sc. Thesis. Master of Logic Project. Institute
for Logic, Language and Computation. Universiteti van Amsterdam The
Netherlands.

Fungsi remove_stopwords(tweet) menerima input berupa tweet yang sudah


dinormalisasi yang bertipe string.

#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)

str_clean = ' '.join(token_afterremoval)


return str_clean

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)

stem_kalimat_str = ' '.join(stem_kalimat)

d. Pra-pemrosesan tweet secara keseluruhan


Pada tahap ini, akan dilakukan pemanggilan fungsi normalisasi dan
remove_stopwords yang sudah didefinisikan sebelumnya. Setelah itu akan
ditampilkan sampel tiga tweet pertama yang sudah dilakukan pra-pemrosesan.

#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

unigram_feat, feat_name = EkstraksiBoW(clean_tweet)


print(unigram_feat[:3])
print(feat_name[:10])

5. Ekstraksi Leksikon (Kamus Sentimen)


Orientasi sentimen dapat digunakan sebagai fitur untuk klasifikasi. Pada tutorial ini,
akan digunakan leksikon sentiment dari penelitian berikut ini:

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])

6. Ekstraksi Fitur Part-Of-Speech Tag


Part-of-speech (POS) merupakan kelas kata yang dapat digunakan untuk mengenali
emosi pada tweet. Pada percobaan ini, akan dihitung kemunculan kata sifat (JJ) dan
kata negasi (NEG) berdasarkan pre-trained POS Tag dari penelitian Dinakarami et. al.
yang sudah dikonversi ke bentuk CRF.Tagger agar bisa dibaca dari NLTK.

Arawinda Dinakaramani, Fam Rashel, Andry Luthfi, and Ruli Manurung.


Designing an Indonesian Part of speech Tagset and Manually Tagged
Indonesian Corpus. International Conference on Asian Language
Processing (IALP 2014). Kuching, 20-22 October 2014.

Raw data pre-trained POS Tag yang belum ditransformasi ke bentuk CRF.Tagger bisa
didapatkan di Fam Rashel’s Github4.

#Code 6a – Definisi Fungsi EkstraksiPOS


def EkstraksiPOS(list_tweet):
ct = CRFTagger()

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

#Code 6b- Memanggil Fungsi EkstraksiPOS dan Menampilkan Sampel


postag_feat = EkstraksiPOS(clean_tweet)
print(postag_feat[:3])

7. Ekstraksi Fitur Ortografi


Pada percobaan ini, fitur ortografi yang digunakan sebagai fitur untuk mengenali
emosi pada tweet yaitu jumlah huruf kapital, jumlah tanda seru, jumlah huruf dan
panjang karakter. Oleh karena itu, dataset yang digunakan untuk menghasilkan fitur
ortografi merupakan dataset awal yang belum mengalami pra-pemrosesan.

#Code 7a – Definisi Fungsi


def EkstraksiOrtografi(raw_tweet):
all_orto_feat = []
for tw in raw_tweet:
capital_count = sum(1 for c in tw if c.isupper())
exclamation_count = sum((1 for c in tw if c == "!"))
word_len = len(nltk.word_tokenize(tw))
char_len = len(tw)
orto_feat = [capital_count, exclamation_count,
word_len, char_len]
all_orto_feat.append(orto_feat)
return all_orto_feat

#Code 7b – Pemanggilan Fungsi


orto_feat = EkstraksiOrtografi(raw_tweet)
orto_feat[:3]

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)

Fajri Koto, and Gemala Y. Rahmaningtyas "InSet Lexicon: Evaluation of a Word


List for Indonesian Sentiment Analysis in Microblogs". IEEE in the 21st
International Conference on Asian Language Processing (IALP), Singapore, 2017.
Leksikon tersebut terdiri dari dua buah file: positive_koto.tsv dan negative_koto.tsv.
Buatlah fitur leksikon dari daftar sentimen tersebut. Perlu diperhatikan bahwa leksikon
ini memuat score positif dan score negatif yang bisa digunakan sebagai fitur.
Tampilkan 10 sampel fitur teratas.
4. Lakukan klasifikasi emosi dari fitur-fitur yang sudah diekstraksi (termasuk fitur dari
hasil ekstraksi nomor 3) dengan algoritma klasifikasi yang lain yaitu Logistic
Regression dan Decision Tree. Gunakan F1-Score sebagai metrik evaluasi. Tampilkan
hasil percobaan pada tabel sebagai berikut:

Nama Fitur Logistic Regression Decision Tree


……
……

Lakukan analisis dari hasil yang didapatkan.


PR untuk Tutorial 2

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

Anda mungkin juga menyukai