Ekplorasi Data Sederhana Menggunakan metode NLP — Analisis N-Gram

Ray Efraim
Blibli.com Tech Blog
7 min readMay 4, 2023

Apa Itu N-Gram?

N-gram adalah metode analisis teks yang menggunakan perhitungan jumlah kemunculan n yang bersebelahan dalam sebuah korpus bahasa. Dalam analisis n-gram, “n” adalah jumlah kata dalam urutan yang sedang dianalisis.

Contoh N-Gram

N-gram sendiri dapat dibagi tipenya berdasarkan dari nilai n itu sendiri.

N-gram dengan nilai n = 1 bisa disebut sebagai unigram, n=2 disebut sebagai bigram, n=3 disebut sebagai trigram, dan seterusnya (4-gram, 5-gram,…..).

Contoh, jika kita ingin melakukan analisis n-gram pada kalimat “Saya senang pergi liburan ke Bali”, kita dapat memecah kalimat tersebut ke beberapa tipe n-gram:

- Unigram (n=1)

[‘saya’,’senang’,’pergi’,’liburan’,’ke’,’bali’]

- Bigram (n=2)

[‘saya senang’, ‘senang pergi’, ‘pergi liburan’, ‘liburan ke’, ‘ke bali’]

- Trigram (n=3)

[‘saya senang pergi’, ‘senang pergi liburan’, ‘pergi liburan ke’, ‘liburan ke bali’]

Pada unigram, hanya terdapat 1 kata karena n = 1 tidak menghitung kata urutan setelahnya, sedangkan bigram adalah gabungan 2 kata berurutan dan trigram adalah 3 kata berurutan.

Kapan N-Gram digunakan?

Analisis n-gram memiliki berbagai aplikasi dalam bidang pemrosesan bahasa atau Natural Language Processing (NLP), seperti:

Pemodelan bahasa: N-gram dapat digunakan untuk memodelkan distribusi probabilitas dari urutan kata dalam sebuah korpus bahasa. Model n-gram ini dapat digunakan dalam aplikasi yang berkaitan dengan penerjemahan bahasa, penentuan kategori teks, prediksi teks dan model-model bahasa lainnya.

Deteksi plagiarisme: Analisis n-gram dapat digunakan untuk mendeteksi plagiarisme pada sebuah dokumen dengan membandingkan urutan n-gram dari dokumen tersebut dengan dokumen yang sudah ada sebelumnya.

Analisis sentimen: N-gram dapat digunakan untuk mengekstrak kata-kata yang sering muncul dalam teks yang mengindikasikan sentimen tertentu, seperti positif atau negatif. Contohnya seperti analisis sentimen dari topik vaksin COVID-19 dari sebuah cuitan di twitter.

Contoh-contoh aplikasi N-gram di atas masih membutuhkan kombinasi dengan proses pemodelan lainnya, menyesuaikan dengan masalah yang ingin dipecahkan untuk mendapatkan output yang diharapkan.

Penggunaan N-Gram untuk Eksplorasi Data

Penggunaan analisis n-gram dalam eksplorasi data dapat digunakan untuk mengidentifikasi pola dalam data teks. Berikut beberapa contoh penggunaan analisis n-gram dalam eksplorasi data:

Analisis Frekuensi Kata

Dengan menggunakan analisis n-gram, kita dapat mengetahui kata-kata yang paling sering muncul dalam sebuah korpus bahasa. Misalnya, kita dapat menghitung urutan unigram untuk mengidentifikasi kata yang sering muncul dalam sebuah dokumen atau korpus bahasa. Hal ini dapat membantu kita untuk memahami topik atau tema yang sedang dibicarakan dalam sebuah korpus.

Analisis Frekuensi N-Gram

Selain analisis frekuensi kata, analisis n-gram juga dapat digunakan untuk menghitung frekuensi kemunculan dari urutan n kata (bigram, trigram, dst) yang bersebelahan dalam sebuah korpus bahasa. Hal ini dapat membantu kita untuk mengidentifikasi frasa atau klausa yang sering muncul. Dengan analisis n-gram, kita dapat lebih memahami analisis pada konteks kata dengan mengetahui kata urutan selanjutnya yang sering muncul.

Analisis N-Gram yang Paling Signifikan

Analisis n-gram juga dapat digunakan untuk mengidentifikasi urutan n kata yang paling signifikan dalam korpus bahasa tertentu. Hal ini dapat membantu kita untuk memahami konsep atau topik yang sedang dibahas.

Contoh penggunaan N-Gram di Python

Dengan menggunakan data yang diambil dari kaggle tentang hate speech, berikut adalah contoh untuk melakukan analisis frekuensi kata dan n-gram sederhana dari dataset abusive and hate speech twitter text menggunakan python.

Tujuan dari analisis ini adalah untuk mengetahui kata dan frasa dalam bahasa Indonesia terbanyak yang sering muncul di twitter dan frekuensi kata dan frasa tersebut berdasarkan contoh dataset yang dimiliki.

Dataset : Indonesian Abusive and Hate Speech Twitter Text | Kaggle

Disclaimer: Dataset yang digunakan adalah data untuk contoh metode analisis, penulis tidak mengetahui validitas dari isi sebagian atau keseluruhan dataset tersebut. Silahkan cek reference pada situs dataset tersebut untuk lebih memahami sumber data yang dikumpulakan untuk dataset tersebut.

import pandas as pd
import re
from nltk.util import ngrams
from sklearn.feature_extraction.text import CountVectorizer

Lakukan import untuk library-library yang dibutuhkan

df = pd.read_csv("data.csv", encoding='latin-1')
df.head()
Sample dataframe

Dari dataframe diatas, korpus bahasa berada di kolom Tweet dan sisanya adalah labelling untuk HS(hate speech), abusive, dan jenis-jenis hate speech yang sudah diberi label. Untuk mempermudah, kita hanya akan mengambil data yang dikategorikan sebagai hate speech saja, yaitu kolom HS dengan nilai 1.

df = df[df["HS"] == 0][["Tweet","HS"]]
df.info()
Info for df

Didapatkan 7.608 baris data untuk digunakan pada analisis frekuensi n-gram ini.

Sebelum data tweet tersebut diolah menggunakan metode n-gram, korpus pada kolom tweet perlu dilakukan pre-processing untuk menghilangkan teks atau karakter yang tidak relevan pada korpus yang umumnya.

#menghapus stopwords (jika dibutuhkan)
from nltk.corpus import stopwords
def removeStopword(str):
stop_words = set(stopwords.words('indonesian'))
stop_words.add('user')
word_tokens = word_tokenize(str)
filtered_sentence = [w for w in word_tokens if not w in stop_words]
return ' '.join(filtered_sentence)

#menghapus kalimat yang hanya memiliki 1 kata saja
def removeSentence(str):
word = str.split()
wordCount = len(word)
if(wordCount<=1):
str = ''

return str

def cleaning(str):
#menghapus karakter non-ascii
str = unicodedata.normalize('NFKD', str).encode('ascii', 'ignore').decode('utf-8', 'ignore')
#menghapus URLs
str = re.sub(r'(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))', '', str)
#menghapus tanda baca
str = re.sub(r'[^\w]|_',' ',str)
#menghapus digit dari string
str = re.sub("\S*\d\S*", "", str).strip()
#menghapus digit atau angka
str = re.sub(r"\b\d+\b", " ", str)
#lowercase teks
str = str.lower()
#menghapus white spaces berlebih
str = re.sub('[\s]+', ' ', str)

return str

def preprocessing(str):
str = removeSentence(str)
str = cleaning(str)
str = removeStopword(str)

return str
df["Tweet"] = df['Tweet'].map(lambda x : preprocessing(x))

Pre-processing dilakukan dengan menghapus karakter tidak relevan seperti angka, white spaces, url, merubah bentuk teks ke lowercase dan jika diperlukan menghapus stopwords (kata umum yang bisa diabaikan, seperti saya, dia, di, ke). Penghapusan stopwords bisa disesuaikan dengan masalah yang ingin dipecahkan, jika masalah yang dipecahkan memerlukan penggunaan stopwords, maka proses penghapusan tidak perlu dilakukan (Misalnya pada masalah prediksi teks atau melihat frekuensi frasa natural yang dilakukan orang pada platform tertentu).

def get_top_ngram(corpus, n=None):
vec = CountVectorizer(ngram_range=(n, n)).fit(corpus)
bag_of_words = vec.transform(corpus)
sum_words = bag_of_words.sum(axis=0)
words_freq = [(word, sum_words[0, idx])
for word, idx in vec.vocabulary_.items()]
words_freq =sorted(words_freq, key = lambda x: x[1], reverse=True)
return words_freq[:10]

Membuat function get_top_ngram untuk mempermudah mendapatkan top 10 n-gram dari tiap tipe n-gram yang dibutuhkan.

Untuk melihat top 10 n-gram sesuai dengan n yang diinginkan dan kemudian divisualisasikan menggunakan bar chart, bisa menggunakan kode berikut

import matplotlib.pyplot as plt
import seaborn as sns

#isi nilai n dengan value yang dibutuhkan
top_bi_grams=get_top_ngram(df["Tweet"],n=1)
x,y=map(list,zip(*top_bi_grams))
fig, ax = plt.subplots(figsize=(15,10))
ax.tick_params(axis='both', which='major', labelsize=15)
plt.title("Uni-Gram", fontsize=25)
sns.barplot(x=y,y=x)

Result untuk frekuensi unigram, bigram dan trigram:

Bar chart ini menampilkan 10 unigram/kata yang memiliki frekuensi kemunculan paling banyak.

Pada dataset ini, terlihat bahwa cuitan yang diberi label hate speech atau ujaran kebencian, kebanyakan menggunakan kata “orang”, “presiden”, dan “Indonesia”. Terlebih khususnya muncul kata “agama”, “Islam”, dan “Kristen” menunjukkan bahwa banyak ujaran kebencian di twitter yang membahas agama.

Kemunculan kata “Presiden”, “Indonesia”, “orang” pada unigram, apakah lantas menunjukkan bahwa yang dimaksud presiden adalah “presiden Indonesia”? Atau orang yang muncul akan menjadi frasa “orang Indonesia”? Pertanyaan tersebut mungkin bisa terjawab dengan melakukan analisis frekuensi dengan bigram.

Setelah melihat kata yang sering muncul melalui unigram, kita bisa melihat lebih detil lagi pada bigram untuk melihat frasa baru atau frasa yang terbentuk dari kata dari unigram sebelumnya.

Adapun frasa yang terbentuk dari unigram sebelumnya adalah “Presiden Jokowi”. Kemudian terdapat frasa “Gubernur Banten”, dimana di unigram sebelumnya hanya menampilkan kata “gubernur”. Terakhir, unigram “orang” yang mengacu pada “orang-orang”.

Dari bigram yang muncul di atas, ditemukan beberapa kata yang belum muncul pada unigram, seperti “xad xad”, “anti hoax”, “kitab suci”, “pilkada damai” dan “Joko Widodo”.

Sedangkan beberapa kata yang muncul di unigram, tidak masuk lagi di kumpulan bigram teratas. Seperti “Kristen”, “gue”, “agama” dan “asing. Hal ini dapat disebabkan oleh kata di unigram yang mungkin memang tidak membentuk suatu frasa yang sering dipakai, atau kata tersebut tidak biasa dipakai menjadi frasa (berdiri sendiri).

Trigram dapat memberikan informasi yang lebih detil dan menguatkan mengenai topik-topik yang mungkin muncul di unigram dan bigram.

Selain munculnya frasa “presiden Jokowi” di bigram, di trigram muncul variasi lain yaitu “presiden Joko Widodo”. Selain itu, “gubernur Banten” yang sebelumnya muncul di bigram, diperlengkap lagi dengan adanya “gubernur Banten Wahidin” dan “Banten Wahidin Halim”.

Dari 10 frasa yang muncul di trigram di atas, dapat dilihat beberapa topik yang banyak muncul pada tweet mengenai ujaran kebencian dari dataset yang kita pakai, seperti Gubernur Banten Wahidin Halim dan Tradisi Seba Pendopo Lebak.

Analisis frekuensi kata dan n-gram adalah contoh salah satu metode sederhana yang dapat digunakan untuk mengetahui kata dan frasa yang sering muncul serta mengetahui juga kemungkinan topik dari pola-pola frasa yang muncul dari n-gram.

N-gram sering digunakan dalam berbagai model NLP seperti pemodelan topik dan analisis sentimen. Memahami konsep n-gram dan penggunaannya yang sederhana dalam analisis frekuensi dapat membantu individu menemukan pola atau melakukan analisis pada sebuah korpus tanpa perlu mengandalkan model NLP yang lebih kompleks.

Analisis Frekuensi N-gram pada Blibli.com

Blibli sebagai salah satu e-commerce terbesar di Indonesia, menyediakan beragam saluran media bagi pelanggan Blibli untuk dapat berkomunikasi dengan tim customer service, mulai dari e-mail, chat dari aplikasi atau web, telepon, dan WhatsApp.

Di Indonesia, WhatsApp merupakan aplikasi pesan instan paling populer digunakan oleh segala kalangan, dengan adanya WhatsApp, pelanggan dapat dengan mudah berkomunikasi dengan customer service menggunakan media yang sudah lebih familiar.

Ketika pelanggan berusaha terhubung dengan customer service, terdapat beragam variasi kalimat pembuka yang terkirim. Dengan menggunakan analisis frekuensi N-gram, kita dapat melihat pola dan frasa yang sering muncul ketika pelanggan mengirimkan pesan pertamanya melalui WhatsApp. Contoh 2 frasa yang sering pelanggan pakai sebagai kalimat pembuka adalah sebagai berikut:

  • Ucapan “Selamat pagi/siang/sore/malam”
  • Saya mau tanya

Dengan dilakukannya analisis frekuensi n-gram, kita dapat mengetahui pola perilaku ketika pelanggan mengirim pesan kalimat pembuka yang kemudian dapat dijadikan insights dalam melakukan copywriting atau perilaku dalam produk yang sedang dikembangkan. Selain itu, analisis tersebut dapat membantu agen customer service menyesuaikan kalimat yang lebih relevan dengan pelanggan.

--

--