Text Preprocessing pake Python
Text preprocessing adalah tahapan awal sebelum data teks dipakai buat analisis NLP (Natural Language Processing) kayak sentiment analysis, topic modeling, atau text classification.
Di artikel ini ogut bakal bikin 1 program dari Python buat load data dari csv sampe N-Grams.
Get Dicki Haris Sujadi’s stories in your inbox
Join Medium for free to get updates from this writer.
Apa itu N-Grams?
N-Grams adalah urutan n item yang berdekatan dalam sebuah teks, yang bisa berupa kata, karakter, atau simbol. Tujuannya buat nangkep konteks kata.
- Unigram → 1 kata
- Bigram → 2 kata (misal: “not good”)
- Trigram → 3 kata
Gambaran besar program text preprocessing kita nanti kaya gini:
- Data masuk → di-lowercase → dibersihkan dari stopword & tanda baca (punctuation).
- Setelah bersih → ditokenisasi.
- Hasil token bisa lewat dua jalur: Stemming, Lemmatization
- Akhirnya hasil bersih dipakai buat bikin N-Grams.
Download dulu file csv-nya disini. Setelah ke-download, tempatin file-nya jadi satu tempat di program file Python klean ya.
# import modul-modul yang dibutuhin
# nltk : NLP toolkit
# word_tokenize: Pisah teks jadi kata
# PorterStemmer: Ubah kata ke bentuk dasar kasar
# WordNetLemmatizer: Ubah kata ke bentuk dasar yang valid
# stopwords: List kata umum yang dihapus, contoh: "the", "is", "at"
# re: Regex buat bersihin teks
# pandas: Olah teks dalam tabel, hasilnya bakal disimpan ke DataFrame
import nltk
from nltk.tokenize import word_tokenize
from nltk.stem import PorterStemmer, WordNetLemmatizer
from nltk.corpus import stopwords
nltk.download('stopwords')
nltk.download('punkt')
nltk.download('punkt_tab')
nltk.download('wordnet')
import re
import pandas as pd
# load data
data = pd.read_csv("restaurant_reviews.csv")
# lihat info data
data.info()
# lihat isi data
data.head()
# lihat data di kolom 'Review', baris pertama `[0]`
data["Review"][0]
# convert ke lowercase
data['review_lowercase'] = data['Review'].str.lower()
data.head()
# refer ke stopwords list (yang bakal di-remove)
en_stopwords = stopwords.words('english')
en_stopwords.remove('not')
# remove stopwords dari text based on en_stopwords
data['review_no_stopwords'] = data['review_lowercase'].apply(lambda x: ' '.join([word for word in x.split() if word not in (en_stopwords)]))
# remove punctuation (tanda baca)
data['review_no_stopwords_no_punct'] = data.apply(lambda x: re.sub(r'[*]', 'star', x['review_no_stopwords']), axis=1)
data['review_no_stopwords_no_punct'] = data.apply(lambda x: re.sub(r'([^\w\s])', '', x['review_no_stopwords_no_punct']), axis = 1)
# cek hasil removal
data.head()
# tokenize => pecah text per kata(token).
# hasilnya bakal disimpan ke list
# `axis = 1` => operasinya dilakuin satu persatu
data['tokenized'] = data.apply(lambda x: word_tokenize(x['review_no_stopwords_no_punct']), axis = 1)
# cek hasil, satu aja gausah banyak2 🙂
data['tokenized'][0]
# PorterStemmer ini buat stemming, contoh: `eating` jadi `eat`
ps = PorterStemmer()
data['stemmed'] = data['tokenized'].apply(lambda tokens: [ps.stem(token) for token in tokens])
# cek hasil
data.head()
# WordNetLemmatizer : buat Lemmatized, contoh `better` jadi `good`
lemmatizer = WordNetLemmatizer()
data['lemmatized'] = data['tokenized'].apply(lambda tokens: [lemmatizer.lemmatize(token) for token in tokens])
# cek hasil, satu aja gausah banyak2 🙂
data['lemmatized'][0]
# nge-gabung-in semua list token menjadi satu list besar
tokens_clean = sum(data['lemmatized'], [])
# operasi N-Grams
unigrams = pd.Series(nltk.ngrams(tokens_clean, 1)).value_counts()
unigrams
bigrams = pd.Series(nltk.ngrams(tokens_clean, 2)).value_counts()
bigrams
trigrams = pd.Series(nltk.ngrams(tokens_clean, 3)).value_counts()
trigrams
ngrams_4 = pd.Series(nltk.ngrams(tokens_clean, 4)).value_counts()
ngrams_4





