Text Preprocessing menggunakan Pandas, NLTK dan Sastrawi untuk Large Dataset
Case Folding, Tokenizing, Filtering (Stopword Removal) dan Stemming Menggunakan NLTK dan Sastrawi pada Dataframe Pandas untuk memproses Large Dataset
Hi semuanya, setelah sebelumnya kita bahas dasar-dasar text processing menggunakan NLTK dan Sastrawi disini,
Sekarang kita akan lanjutkan dengan penerapan pada kasus yang real. Kita akan mengolah data tweet yang didapatkan melalui proses crawling API Twitter. Prosesnya masih sama berkaitan dengan Text Preprocessing, mulai dari Case Folding, Tokenizing, Filtering dan Stemming. Perbedaanya kita akan load data tweet tersebut kedalam Dataframe Pandas. Kenapa harus di-load kedalam Dataframe Pandas? nah, hal ini berkenaan dengan flexibility, speed dan performance komputasi. Tujuan akhirnya adalah untuk mempercepat proses komputasi agar dapat mengelola dataset yang besar dengan lebih cepat.
Prepare Dataset
Pertama kita harus melakukan crawling data tweet melalui API Twitter. Untuk kemudahan, kita bisa gunakan script berikut,
dan kita terlebih dahulu harus terdaftar dulu di Apps Twitter : https://apps.twitter.com/, sehingga bisa mendapatkan 4 buah token/key (costumer key, costumer secret, access token, access token secret ) yang akan kita setup ke github diatas. Detailnya bisa kita temukan pada github diatas.
Load Dataset
Setelah dataset kita dapatkan, kita akan masuk ke tahap text preprocessing. Pertama kita akan load dataset kedalam Dataframe menggunakan Pandas,
Pada Jupyter Notebook kita bisa lihat resultnya,
Case Folding
Setelah itu kita akan melakukan proses Case Folding pada Dataframe tweet diatas menggunakan fungsi lower()
pada class Series.str
library Pandas. Penggunakan Fungsi internal pandas ini jauh lebih cepat dibandingkan jika kita melakukan iterasi untuk semua row pada dataframe dan melakukan Case Folding row by row menggunakan .lower()
biasa.
Berikut resultnya pada Jupyter Notebook,
Tokenizing
Ditahap ini akan dilakukan proses number removal, whitecase removal, puntuation removal dan word_tokenize()
untuk memecah string kedalam tokens. Pandas Dataframe atau Series mampu menjalankan function external untuk di terapkan pada kolom atau baris dengan menggunakan fungsi .apply()
.
hasil fungsi word_tokenize()
disimpan pada kolom terpisah dengan nama ['tweet_tokens']
. Berikut resultnya pada Jupyter Notebook,
kita juga dapat menghitung frekuensi distribusi token pada tiap row data pada Dataframe dengan menggunakan fungsi .freqDist()
kedalam fungsi .apply()
.
Resutl pada Jupyter Notebook,
Filtering (Stopword Removal)
Pada tahap ini kita akan menggunakan stopword bahasa indonesia yang didapatkan dari library NLTK untuk filtering terhadap Dataframe. Kita juga dapat menambahkan list stopword dengan menggunakan fungsi .extend()
terhadap list_stopword
, penggunaan fungsi .set()
bermanfaat untuk membuat iterable list menjadi sequence iterable element. Hasilnya kita dapat mempercepat proses pengecekan apakan sebuah token terdapat pada list_stopword
atau tidak (if token not in list_stopword:
).
Result pada Jupyter Notebook,
Normalization
Normalization digunakan untuk menyeragamkan term yang memiliki makna sama namun penulisanya berbeda, bisa diakibatkan kesalahan penulisan, penyingkatan kata, ataupun “bahasa gaul”.
Contohnya :
knapa : kenapa
knp : kenapa
smpai : sampai
sampe : sampai
nyampe : sampai
Pertama kita harus menyiapkan dataset untuk mapping term yang akan diseragamkan, contohnya sebagai berikut,
Implementasinya pada python,
Result pada jupyter notebook,
Stemmer
Ditahap ini kita akan .apply()
function stemmer dari library Sastrawi untuk mengembalikan kata kebentuk dasarnya. Karena fungsi stemmer.stem()
pada library Sastrawi lambat, kita dapat menggunakan library swifter untuk mempercepat froses stemming pada Dataframe dengan menjalankan task secara parallel. Kecepatan pemrosesan bisa dua kali bahkan lebih cepat jika tanpa menggunakan swifter. Hal ini bergantung pada jumlah core yang dimiliki oleh komputer yang kita gunakan, defaultnya akan digunakan npartitions = cpu_count()*2
.
Install library swifter,
conda install -c conda-forge swifter
untuk implementasinya kita tinggal import dan tambahkan .swifter
sebelum fungsi .apply()
, setelah itu kita apply fungsi stemmer()
untuk tiap data pada Dataframe,
Tunggu sampai proses Stemming selesai, pada kasus yang saya alami dengan menggunakan Dataframe sebanyak 23.225 row data akan memakan waktu 2–2.5 jam.
Result pada Jupyer Notebook,
Save Preprocessing Data
Proses ini dilakukan agar dikemudian hari kita tidak perlu melakukan preprocessing data lagi, apalagi jika data yang digunakan sangat besar.
Save ke CSV, untuk save ke CSV, gunakan cara berikut,
TWEET_DATA.to_csv("Text_Preprocessing.csv")
Save ke Excel, untuk save ke Excel, gunakan cara berikut,
TWEET_DATA.to_excel("Text_Preprocessing.xlsx")
Save ke Binary HDF5, untuk save ke Binary HDF5, gunakan cara berikut,
TWEET_DATA.to_hdf("Text_Preprocessing.h5")
Kita dapat melihat file yang berhasil di save di home screen Jupyter Notebook,
Kalian bisa mendapatkan full code diatas dari github saya,
Sekian untuk bahasan kali ini, selanjutnya akan dibahas Document Vectoring menggunakan TF-IDF (Term Frequency — Inverse Document Frequency) untuk data diatas.
Terima kasih..