Assalamualaikum Sahabat Whitecyber Indonesia …
Pada minggu yang cerah pagi ini saya akan berbagi cerita lagi tentang pengerjaan Project Whitecyber. Kali ini kita akan mengulas tentang BIG DATA yang lebih khusus tentang Tema Pengiriman Pesan di Twitter, kali ini kita kasih tema : Project Preprocessing Case Folding, Tokenizing, Filtering & Stemming NLTK Pandas Sastrawi Pada Twitter – Python.
Dikesempatan kali ini kita akan coba bahas topik tentang Natural Language Processing (NLP). Pada bidang NLP, informasi yang akan diolah perlu dilakukan preprocessing data untuk menghasilkan data yang lebih terstruktur. Hal ini bertujuan agar saat proses pengolahan NLP dapat berjalan dengan baik. Preprocessing pada NPL disebut dengan test preprocessing, dalam tahap ini akan dilakukan beberapa teknik diataranya, Case Folding, Tokenizing, Filtering & Stemming.
Text preprocessing meggunakan Library NLTK (Natural Language Tool Kit). NLTK merupakan python library yang sangat powerfull untuk digunakan dalam pemrosessan human language data. Memberikan kemudahan interfacing ke lebih dari 50 corpora dan lexial resources.
Prerequisites
Laptop terinstal Anaconda + Jupyter Notebook.
Text Preprocessing
Sekarang kita akan coba implementasikan NLTK untuk text preprocessing. Proses preprocessing ini meliputi (1) case folding, (2) tokenizing, (3) filtering, dan (4) stemming.
Case Folding
Case Folding adalah tahap untuk konversi text menjadi suatu bentuk yang standar. Pada tahap ini biasanya dipilih lowercase untuk membuat huruf kapital menjadi lowercase [3]. Contoh sederhana,
Text input :
.
import nltk
.
Pemerintah menerapkan PSBB untuk menangani Virus Corona.
.
hasil Case Folding akan menjadi :
.
pemerintah menerapkan psbb untuk menangani virus corona.
.
implementasinya pada python tidak perlu menggunakan library NLTK, cukup menggunakan fungsi .lower() ,
.
sentence = "Pemerintah mnerapkan PSBB untuk menangani Virus Corona." # gunakan fungsi .lower() lowercase_sentence = sentence.lower() print(lowercase_sentence)
.
Tokenizing
Pada tahap ini, text yang telah melewati tahap Case Folding akan dilakukan proses pemecahan perkata menggunakan fungsi .word_tokenize() pada library NLTK. Selain itu pada tahap inijuga akan dilakukan proses removing number, whitespace dan puctuation (tanda baca).
- Removing number, akan menggunakan fungsi re.sub(pattern, replace_string, string) untuk replace angka dengan “” ada library re (regex) menggunakan pattern \d+ . Dimana \d untuk matching digit (0–9) dan + sebagai quantifier untuk menemukan 1 atau lebih matching \d . Sehingga penggunaanya akan seperti berikut, re.sub(r”\d+”, “”, “H3llo”) yang akan menghasilkan Hllo .
- Removing punctuation, akan menggunakan fungsi .translate() yang akan memetakan teks kedalam character yang sesuai pada mapping table .maketrans() . untuk mengganti sting.punctuation berupa (!”#$%&\’()*+,-./:;<=>?@[\\]^_`{|}~) dengan “” .
- Removing whitespace, akan menggunakan fungsi .strip() untuk menghapus whitespace leading dan trailing, dan menggunakan fungsi regex substraction re.sub(pattern, replace_string, string) dengan pattern \s+ untuk matching whitespace dengan quantifier matching 1 atau lebih whitespace.Berikut adalah implementasinya pada python,
.
import string import re #regex library # import word_tokenize from NLTK from nltk.tokenize import word_tokenize # sentence input sentence = "Sebelumnya, \n kasus positif virus Corona pada 24 April sebanyak 8.211 orang. \n Jumlah pasien sembuh Corona di RI ada 1.002 orang dan meninggal 689 orang." # ------ Case Folding -------- # gunakan fungsi .lower() lowercase_sentence = sentence.lower() print('Case Folding Result : \n') print(lowercase_sentence) print('\n\n\n') # ------ Tokenizing --------- #remove angka lowercase_sentence = re.sub(r"\d+", "", lowercase_sentence) #remove punctuation lowercase_sentence = lowercase_sentence.translate(str.maketrans("","",string.punctuation)) #remove whitespace leading & trailing lowercase_sentence = lowercase_sentence.strip() #remove multiple whitespace into single whitespace lowercase_sentence = re.sub('\s+',' ',lowercase_sentence) tokens = nltk.tokenize.word_tokenize(lowercase_sentence) print('Tokenizing Result : \n') print(tokens)
.
selanjutnya kita bisa menghitung jumlah kemunculan tiap kata pada text yang kita proses menggunakan fungsi .freqDist() pada library NLTK, dan melihat hasilnya dengan menggunakan method .most_common() , sehingga implementasinya pada python menjadi seperti berikut,
result pada jupyter notebook,
.
Case Folding Result : sebelumnya, kasus positif virus corona pada 24 april sebanyak 8.211 orang. jumlah pasien sembuh corona di ri ada 1.002 orang dan meninggal 689 orang. Tokenizing Result : ['sebelumnya', 'kasus', 'positif', 'virus', 'corona', 'pada', 'april', 'sebanyak', 'orang', 'jumlah', 'pasien', 'sembuh', 'corona', 'di', 'ri', 'ada', 'orang', 'dan', 'meninggal', 'orang']
.
Kita akan memvisualisasikan freq_tokens menggunakan library Pandas. Terlebih dahulu kita convert freq_tokens dictionary ke Pandas Dataframe dengan menggunakan fungsi pd.DataFrame.from_dict() dengan parameter orient=’index’ akan menjadikan key pada dictionary menjadi row Dataframe. Setelah itu gunakan fungsi .plot() dengan kind=’bar’ untuk plot dataframe kedalam bar plot,
.
import pandas as pd df_freq_tokens = pd.DataFrame.from_dict(freq_tokens, orient='index') df_freq_tokens.columns = ['Frequency'] df_freq_tokens.index.name = 'Key' df_freq_tokens.plot(kind='bar')
.
resut pada jupyter notebook,
.
.
grafik dataframe frequency tokens dengan key sebagai row
.
from nltk.corpus import stopwords # tokenize text freq_tokens # get Indonesian stopword list_stopwords = set(stopwords.words('indonesian')) #remove stopword pada list token tokens_without_stopword = [word for word in freq_tokens if not word in list_stopwords] print(tokens_without_stopword)
from nltk.stem import PorterStemmer stemmer = PorterStemmer() plurals = ['caresses', 'flies', 'dies', 'mules', 'denied', 'died', 'agreed', 'owned', 'humbled', 'sized', 'meeting', 'stating', 'siezing', 'itemization', 'sensational', 'traditional', 'reference', 'colonizer', 'plotted'] singles = [(plural + " : " + stemmer.stem(plural)) for plural in plurals] singles
['caresses : caress', 'flies : fli', 'dies : die', 'mules : mule', 'denied : deni', 'died : die', 'agreed : agre', 'owned : own', 'humbled : humbl', 'sized : size', 'meeting : meet', 'stating : state', 'siezing : siez', 'itemization : item', 'sensational : sensat', 'traditional : tradit', 'reference : refer', 'colonizer : colon', 'plotted : plot']
pip install Sastrawi
# import Sastrawi package from Sastrawi.Stemmer.StemmerFactory import StemmerFactory # create stemmer factory = StemmerFactory() stemmer = factory.create_stemmer() # token without stopword list_tokens = tokens_without_stopword # stem output = [(token + " : " + stemmer.stem(token)) for token in list_tokens] output
['orang : orang', 'corona : corona', 'positif : positif', 'virus : virus', 'april : april', 'pasien : pasien', 'sembuh : sembuh', 'ri : ri', 'meninggal : tinggal']
dari hasil Stemming menggunakan library Sastrawi, kita dapat melihat bahwa kata meninggal dikembalikan kebentuk dasarnya menjadi tinggal .
Sampai tahap ini kita sudah melakukan text preprocessing menggunakan library NLTK mulai dari Case Folding, Tokenizing, Filtering sampai Stemming menggunakan library Sastrawi. Selanjutnya akan coba dilakukan contoh realcase text preprocessing untuk data hasil crawling twitter API, penerapanya tentusaja akan menggunakan Pandas, NLTK dan Sastrawi.
Sekian untuk tulisan kali ini,
Terima Kasih.
Sumber :
https://medium.com/@ksnugroho/dasar-text-preprocessing-dengan-python-a4fa52608ffe
https://www.nltk.org/ (Bird, Steven, Edward Loper and Ewan Klein (2009), Natural Language Processing with Python. O’Reilly Media Inc.)
https://informatikalogi.com/text-preprocessing/
https://pypi.org/project/Sastrawi/
https://www.nltk.org/howto/stem.html
https://devtrik.com/python/text-preprocessing-dengan-python-nltk/