Artikel ini merupakan lanjutan dari artikel sebelumnya tentang Crawling Data Twitter dengan Python. Akan tetapi apa yang dijelaskan di artikel ini dapat diterapkan di sembarang data text/dokumen, tidak harus data sosial media. Preprocessing text seperti stopword filtering & stemming, serta menghitung term distribution (frekuensi kata) dibahas menggunakan Python. Di tulisan selanjutnya kita akan coba melakukan analisa lanjut seperti clustering, centrality, community detection, visualisasi, dsb.
Apa yang akan dibahas di artikel ini?
- Preprocessing sederhana text data di Python: StopWords, Regular Expression “sederhana”, stemming, dsb.
- Read dan Write data ke sebuah file di Python.
- list comprehensions dan beberapa struktur data sederhana di Python (dictionary, list, & set).
- Indikator progress code di Python dengan tqdm.
Pendahuluan
- Amat disarankan untuk menjalankan terlebih dahulu program di artikel sebelumnya untuk mendapatkan data twitter anda sendiri. Berarti saya juga mengasumsikan Python, dan modul-modul di artikel tersebut telah terinstall dengan baik.
- Saya mengasumsikan pembaca tidak “Phobia”/takut/antipati terhadap bahasa pemrograman (khususnya Python). Bagi pembaca yang ingin mempelajari Python, tutorial berikut menurut saya amat baik untuk pemula.
- Di artikel ini kita akan menggunakan beberapa modul baru: json, re, nltk, collections, dan tqdm. Seperti di artikel sebelumnya, menginstall modul-modul tersebut sangatlah mudah, di terminal (shell/command prompt) cukup ketikkan perintah-perintah berikut:
- Source code, StopWords, dan contoh data artikel ini dapat diunduh disini: ~LINK~ Di file tersebut saya melampirkan contoh >22.000 data tweet “@RidwanKamil” pada tanggal 28 Nov~29 Des 2015.
- Saya menggunakan 3 macam StopWords di code yang akan kita bahas: Inggris, Indonesia, dan tambahan khusus dari user (variabel SpecialStopWords). Stopwords lain seperti bahasa daerah (e.g. bahasa sunda:{jeung, kang, oge,…}) dapat ditambahkan sendiri dengan cara seperti yang ada dalam codenya. Kalau menemukan kesulitan, silahkan komentar dibawah (jangan lupa lampirkan juga pesan error yg muncul).
Let’s get started!
First thing first, berikut adalah code seutuhnya, pembahasan/keterangan code ada dibawahnya. Silahkan buka code ini di editor Python anda (misal Spyder).
- Baris ke 1-4: import moduls
Import fungsi-fungsi (modul) yang akan kita butuhkan. Jika ada error di 4 baris ini berarti modul belum terinstall atau ‘rusak’. Jangan hawatir solusinya cukup lakukan jalankan point 3 di Pendahuluan. Perhatikan modul tqdmmemiliki perintah yang import yang unik dan berbeda dengan modul lainnya. - Baris ke 6-10: data & file names
Saya mengasumsikan data dan hasil program diatas diletakkan di folder “data” dengan nama-nama file yang telah ditetapkan di baris ke 6-10 di code ini. Backslash ditulis dua kali (\\) karena di Python “\” memiliki makna khusus.
_
Saat crawling saya menggunakan keywords ‘ridwankamil’, ‘ridwan’, dan ‘kamil’, sehingga wajar jika saya asumsikan kata-kata tersebut sebagai stopwords juga. Silahkan tambahkan/kurangi sesuai selera … :) … file “StopWords_Eng-Ind.txt” berisi gabungan stopwords bahasa Indonesia & Inggris. - Baris 12-18: Fungsi wordCountFungsi memliki input sebuah text (dTxt) yang akan dihitung kata-katanya serta 3 buah variable (dictionary) yang akan digunakan untuk menyimpan hasil perhitungan kata: wID,fD,fT.
_
Dictionarynya memiliki kunci string (terms/kata) dan nilai/value berupa integer. wID akan sangat bermanfaat kelak saat kita akan melakukan analisa lebih lanjut seperti clustering, karena kita memerlukan VSM (vector space model) sebagai data representation textnya (let’s not worry about that for now).
_
Contoh wID[‘walikota’]=33 artinya adalah kata ‘walikota’ memiliki kata ID 33. fD[‘walikota’] menyimpan jumlah tweet yang memuat kata ‘walikota’, dan fT[‘walikota’] menyimpan total jumlah kata walikota di corpus (dataset). Perhatikan fD╪fT karena sebuah tweet bisa memuat kata yang sama berkali-kali. fD dan fT kelak juga akan bermanfaat ketika akan melakukan analisis statistik tingkat lanjut data teks kita. - Baris 20-25: Fungsi WriteWordStat
Fungsi akan menyimpan term distribusi hasil perhitungannya. - Baris 27-35: Load StopWords & inisialisasi
Baris 33-35 me-load stopwords dan menggabungkannya. Penting untuk merubah list stopwordsnya ke tipe data “set” di python untuk mempercepat performa dan menghindari duplikasi. - Baris 36-49: Proses Inti
Baris 36 adalah reguler expression untuk mendapatkan hanya huruf dan angka saja dari data kita (alphanumeric). Reguler expression (regex) amat-amat-amat penting bagi mereka yang berkecimpung dengan data teks. Silahkan baca lebih lanjut disini jika ingin mendalaminya lebih jauh.
_
Baris 38 membuka (menyiapkan) file untuk menyimpan hasil preprocessing.
Baris 40 me-load semua data tweet kita ke memory.
_
Baris 42 menggunakan modul tqdm untuk membuat progress bar (indikator).
Baris 43 meyakinkan agar kalau ada data yang ‘corrupt’ prosesnya tidak perlu berhenti, namun cukup mengabaikan saja data tweet tersebut.
Baris 44 merubah data tweet kita yang berbentuk string kembali ke bentuk json seperti data yang dikirimkan dari web twitter.
Baris 45 merubah data tweet menjadi lowercase.
Baris 46 menghapus semua URL (alamat internet) dari tweet menggunakan Regex, karena akan mengganggu analisa.
Baris 47 merubah tweet menjadi bentuk alphanumeriknya, sehingga semua simbol akan hilang.
Baris 50 menggabungkan kata-kata yang ada kembali menjadi kalimat utuh.
Baris 51 menyimpannya ke file.
Baris ke 52 menghitung term statistics/distribution. - Baris 51-56: Wrap Up
Baris-baris ini adalah perintah yang digunakan untuk mengurutkan term statisticnya. Distribusi kata diurutkan berdasarkan frekuensi kemunculan pada tweet yang paling banyak (fD).
Done!!!… seperti biasa, programnya dapat dijalankan dengan menekan tombol “F5” di Spyder atau jalankan melalui command prompt (shell/terminal) dengan perintah berikut:
Silahkan lihat hasilnya di folder “data”.
Stemming
wait a minute,… mana stemmingnya? …. sengaja saya tidak tuliskan di code diatas. Karena stemming biasanya optional dan computationally expensive. Untuk menambahkan proses stemming, tambahkan code berikut:
“CoPas” baris satu ke baris 11 di code diatas dan baris ke dua diantara baris 48 dan 49. Notes, bahwa terdapat berbagai macam stemming di NLTK. Silahkan baca lebih lanjut disini. Stemming bahasa Indonesia dan bahasa daerah juga bisa ditambahkan dengan cara yang kurang lebih sama.
Batasan/Limitations:
- Kalau anda melihat hasil preprocess-nya akan terlihat beberapa tweet duplicate. Hal tersebut kemungkinan besar akibat user yang melakukan retweet. Saya sengaja tidak menghilangkan duplikasinya untuk menghindari kompleksitas artikel dan membuat tweet tertentu memiliki ‘bobot’ yang berbeda. Menghilangkan duplikasi tersebut di Python amat sederhana dan cukup cepat. Cukup dengan menyimpan variabel “cleanTweet” ke dalam struktur data “set” di python.
- Bergantung dari data twitter seperti apa yang anda crawl, mungkin stopwords tambahan juga diperlukan, misal StopWords bahasa Sunda atau bahasa alay/gaul
- Begitu juga dengan proses stemmingnya: stemming bahasa Indonesia, Sunda, dan bahasa gaul/alay.
- Codenya bisa lebih cepat dengan membuat variabel-variabel Terms Statistics menjadi “global” di fungsi “wordCount”. Sengaja saya tidak lakukan untuk menekankan bahwa artikel ini untuk pemula. Untuk data ‘hanya’ beberapa gigabyte tidak perlu hawatir, code diatas cukup cepat (thanks to Python).
- Bukan untuk Big Data: Jangan gunakan code diatas untuk data yang besar. Untuk big data processing biasanya data dan proses di streaming (incremental) dari NoSQL dan tidak di-load semuanya ke memory seperti code diatas.
- Tidak cocok untuk diparalelkan. Programmer HPC berpengalaman pasti ngehbahwa coding untuk program serial dan parallel seringnya memiliki struktur/teknik yang berbeda. Namun hal tersebut diluar jangkauan artikel pendahuluan ini.
Penutup
Mudah sekali kan ya? … iya kan? .. ya? … #maksa … :) … Seperti biasa jika ada pertanyaan atau perintah yang tidak dimengerti? Lagi-lagi silahkan komentar dibawah. Semoga bermanfaat dan best of luck … ;)
< / TES >® ~ BNE 01/08/2016,22:35:06