Part 2 Natural Language Processing : Bersih-bersih Data Crawling
Setelah sekian lama saya berada di masa malas untuk menulis. Akhirnya datanglah niat dan waktu untuk melanjutkan tulisan saya yang sebelumnya. Tulisan ini merupakan lanjutan dari tulisan sebelumnya “Crawling Tweet dengan GetOldTweet3”. Pada tulisan sebelumnya telah dilakukan crawling tweet soal peraturan celana cingkrang pada ASN(Aparatur Sipil Negara).
Bersih-bersih ~ Preprocessing
Preprocessing pada suatu data dapat dianialogikan dengan bersih-bersih halaman. Kenapa seperti itu ???. Anggaplah kamu menmpunyai halaman rumah yang cukup luas. Kamu dan teman-teman kamu ingin menggunakan nya untuk bermain bola. Namun, tenyata halamannya sedang berantakan karena banyak sampah berceceran, terbawa dari banjir kemaren. Tentu saja bermain bola dengan halaman yang penuh sampah tidak akan menyenangkan. Permainan bola kamu dan teman-teman dapat terganggu. Nah, data-data yang didapatkan hasil crawling itu sangat-sangat kotor bayangkan halaman dengan sampah berceceran. Sedangkan kamu ingin melakukan klasisifikasi dengan machine learning pada data tersebut atau analoginya bermain bola. Untuk mendapatkan hasil klasifikasi yang baik tentu kamu perlu membersihkan data-data tersebut.
Dirty Data Everywhere, Need to Clean
Berdasarkan artikel dari forbes membersihkan data membutuhkan waktu paling banyak dan merupakan pekerjaan paling tidak menyenangkan pada Data Science(Mungkin ini juga yang membuat tulisan ini lama dibuat hehehe). Para Data Scientist menghabiskan 60% pekerjaan hanya untuk melakukan bersih-bersih pada data, wow!.
Oiya, sebelum melakukan preprocessing data tersebut dilabeli dulu secara manual menggunakan excel cukup dengan dua label positif dan negatif(untuk kata-kata netral saya masukan ke positif agar lebih mudah saat klasifikasinya nanti). Memang ini bukan best pratice sih… Karena datanya dilabeli dengan perasaan saya codong positif atau negatif dan saya bukanlah annotator(Seorang yang melabeli data) professional. Cara lainnya untuk melabeli data adalah pembuat tweet mengkategorikan datanya. Tapi itu tidak mungkin karena merepotkan untuk menanyakannya.
Pada kasus ini data yang kita dapatkan tersebut akan dilakukan preprocessing yaitu :
- Case Folding : Proses yang dilakukan untuk menormalisasi(make lower case, delete link, delete number, delete punctuation)
- Filtering : Menghapus kata-kata yang tidak diingikan seperti stop words atau kata yang biasa digunakan(‘yang’, ‘untuk’, ‘pada’, ‘ke’, ‘para’, ‘namun’, ‘menurut’, ‘antara’, ‘dia’,)
- Stemming : Menghilangkan pada kata imbuhan dan membuat kata tersebut kembali ke kata dasar
- Remove Duplicate : Menghilangkan duplikasi data
Sebenarnya masih banyak lagi hal yang bisa dilakukan untuk melakukan preprocessing. Namun, untuk data ini menurut saya sudah cukup.
Yuk Mulai Coding!!!
Jadi kita akan melakukan processing terhadap tweet yang didapatkan pada tulisan sebelumnya.
Untuk mengikuti sesi ini silahkan buka Google Colab pada link ini. Untuk data tweet yang sudah dilabeli ada disini.
from google.colab import files
import pandas as pd
import io# Read file by upload
upload_files = files.upload()
for filename in upload_files.keys():
df = pd.read_csv(io.StringIO(upload_files[filename].decode('latin-1')), header=None)
Seletah code tersebut dijalankan click ‘browse’ dan pilih data tweet yang sudah dilabeli(crawling_tweet.csv).
# Checking
print(df.head().to_markdown())
Check data tersebut apakah benar atau tidak. Hasilnya meruapakan 5 data pertama.
# Remove column
df = df.drop(df.columns[[0]], axis=1)# Give column name
df.columns = ["Label", "Tweet"]print(df.head().to_markdown())
Karena data tersebut terdiri dari 3 kolom dan kolom pertama yang berisi waktu tweet itu dibuat tidak digunakan. Kolom pertama dibuat dan kolom lainya diberi nama ‘Label’ dan ‘Tweet’.
# Check colums Type
print('Column Value have df type \t:', df['Label'].dtypes)
print('Column Tweet have df type \t:', df['Tweet'].dtypes)# Check null
print('Column Value have null value \t:', df['Label'].isnull().values.any())
print('Column Tweet have null value \t:', df['Tweet'].isnull().values.any())# Check number of row
print('Column Value have row \t:', df['Label'].count())
print('Column Tweer have row \t:', df['Tweet'].count())
Check type, apakah ada yang kosong, dan jumlah row dari masing-masing kolom.
# Change label's column
df['Label'] = df['Label'].replace("negatif", 0)
df['Label'] = df['Label'].replace("positif", 1)print(df.head().to_markdown())
Ganti label ‘negatif’ dengan ‘0’ dan ‘positif’ dengan ‘1’.
import re
import string# Case Folding
# a. Make lower case
df['Tweet'] = df['Tweet'].apply(lambda x: x.lower())
# b. Delete link
for idx in df.index:
df['Tweet'][idx] = re.sub(r"http\S+", "", df['Tweet'][idx])
# c. Delete number
df['Tweet']= df['Tweet'].apply(lambda x:''.join([i for i in x if i not in string.digits]))
# d. Delete punctuation
df['Tweet'] = df['Tweet'].str.replace('[^\w\s]',' ')print(df.head().to_markdown())
Melakukan case folding terhadap data.
!pip install Sastrawi
from Sastrawi.StopWordRemover.StopWordRemoverFactory import StopWordRemoverFactory, StopWordRemover, ArrayDictionary
Menginstal Library Sastrawi. Sastrawi merupakan Library untuk melakukan stemming dan pemprosesan kata lainya pada bahasa Indonesia. Untuk dokumentasinya dapat dilihat disini.
stop_factory = StopWordRemoverFactory().get_stop_words()
more_stopword = ['di', 'kan', 'yg', 'dg', 'ha'] # To add more stopword
data = stop_factory + more_stopword
dictionary = ArrayDictionary(data)
stopwords = StopWordRemover(dictionary)print(data)
Membuat list dari stopword atau kata-kata yang biasa yang akan di filter.
# Filtering
for idx in df.index:
df['Tweet'][idx] = stopwords.remove(df['Tweet'][idx])
print(df['Tweet'].head().to_markdown())
Melakukan filtering.
from Sastrawi.Stemmer.StemmerFactory import StemmerFactory
factory = StemmerFactory()
stemmer = factory.create_stemmer()
Mempersiapkan stemmer.
# Stemming
for idx in df.index:
df['Tweet'][idx] = stemmer.stem(df['Tweet'][idx])
print(df['Tweet'].head().to_markdown())
Melakukan stemming(proses berikut memang cukup lama).
# Remove duplicate
df = df.drop_duplicates(subset='Tweet', keep='first')print(df.head().to_markdown())
Membuat data tweet yang duplikat.
# Check number of row
print('Column Value have row \t:', df['Label'].count())
print('Column Tweer have row \t:', df['Tweet'].count())
Mengecheck jumlah row.
# Download
df.to_csv('clean_tweet.csv')
files.download('clean_tweet.csv')
Mendownload data yang sudah dibersihkan dengan nama ‘clean_tweet.csv’
Let’s Play a Little with the Data
Dengan menggunakan library dari nltk data yang dididapatkan dapat dilihat representasinya seperti apa.
- Plot Frekuensi
Dapat terlihat karena kita mencari kata “cingkrang” dan “asn” tentu kata ini akan menjadi yang paling banyak frekuensinya. Kata selanjutnya yang sering muncur adalah “cadar” memang saat itu aturan cadar dan cingkrang di asn sangatlah dekat. Kemudian kata “larang”, “pakai”, dan seterusnya.
2. Cloudword
Ini merupakan representasi yang saya suka karena terlihat keren aja gitu wkwkwk. Kata yang paling sering muncul akan terlihat paling besar. Bentuk dari cloudwordnya juga bisa dibentuk macam-macam.
Sampai ketemu kembali
Horeeee… kita sudah berhasil membersihkan data tweet. Python notebook dan hasil crawling saya simpan disini. Selanjutnya dari data tersebut akan dibuat model menggunakan TensorFlow yang dapat mengklasifikasikan data tweet baru secara otomatis. Sampai jumpa di artikel berikutnya yaitu Rekognisi Setimen Menggunakan Embedding.