Natural Language Processing (NLP) adalah ilmu yang berhubungan dengan bahasa manusia atau data teks. Salah satu aplikasi NLP adalah Topic Identification, yaitu teknik yang digunakan untuk menemukan topik di dalam dokumen teks.
Dalam panduan ini, kita akan belajar tentang dasar-dasar identifikasi topik dan pemodelan. Menggunakan pendekatan Bag-of-words dan model NLP sederhana. Kita akan belajar bagaimana mengidentifikasi topik dari teks.
Mulailah dengan mengimpor Library (perpustakaan) yang digunakan dalam panduan ini.
Impor Perpustakaan dan Modul yang Diperlukan
# library NLTK Python
import nltk
from nltk.tokenize import word_tokenize
from collections import Counter
from nltk.corpus import stopwords
import string
# library sastrawi Python
from Sastrawi.Stemmer.StemmerFactory import StemmerFactory
factory = StemmerFactory()
stemmer = factory.create_stemmer()
nltk.download('stopwords')
Pendekatan Bag-of-words
Bag-of-words adalah metode sederhana untuk mengidentifikasi topik dalam dokumen. Ini bekerja dengan asumsi bahwa semakin tinggi frekuensi istilah, semakin tinggi kepentingannya. Kita akan melihat bagaimana menerapkan ini menggunakan contoh teks yang diberikan seperti di bawah ini:
teks = """
Ayahku bernama Abu Salman. Ayah berpostur sedang, berumur sekitar 54
tahun. Rambutnya putih beruban. Di dagunya terdapat bekas cukur jenggot
putih di dagunya. Kulit ayahku kuning langsat. Wajah ayah tipikal Batak
dengan rahang yang kuat dan hidung mancung tapi agak besar. Matanya
hitam tajam dengan alis tebal. Sepintas ayahku seperti orang India.
Meskipun kelihatannya mengerikan, ayahku orang yang sabar. Wajahnya
teduh dan selalu tersenyum menghadapi masalah apa pun. Ya, ayahku
adalah orang yang paling sabar yang pernah aku kenal. Tidak pernah terlihat
marah-marah atau membentak. Beliau selalu menunjukkan perasaanya
lewat gerakan bermakna di wajahnya. Jika melihat anaknya membandel,
ayah hanya menggeleng sambil berkata lirih untuk membujuknya.
Tidak seperti orang Batak yang logatnya agak keras, ayahku sangat pendiam.
Beliau yang irit kata, lebih suka memberi contoh langsung kepada anaknya
tanpa perlu menggurui. Bagai air yang mengalir tenang, tetapi sangat
dalam. Beliau adalah teladan bagi anak-anaknya.
"""
print(teks)
Hasil
Ayahku bernama Abu Salman. Ayah berpostur sedang, berumur sekitar 54
tahun. Rambutnya putih beruban. Di dagunya terdapat bekas cukur jenggot
putih di dagunya. Kulit ayahku kuning langsat. Wajah ayah tipikal Batak
dengan rahang yang kuat dan hidung mancung tapi agak besar. Matanya
hitam tajam dengan alis tebal. Sepintas ayahku seperti orang India.
Meskipun kelihatannya mengerikan, ayahku orang yang sabar. Wajahnya
teduh dan selalu tersenyum menghadapi masalah apa pun. Ya, ayahku
adalah orang yang paling sabar yang pernah aku kenal. Tidak pernah terlihat
marah-marah atau membentak. Beliau selalu menunjukkan perasaanya
lewat gerakan bermakna di wajahnya. Jika melihat anaknya membandel,
ayah hanya menggeleng sambil berkata lirih untuk membujuknya.
Tidak seperti orang Batak yang logatnya agak keras, ayahku sangat pendiam.
Beliau yang irit kata, lebih suka memberi contoh langsung kepada anaknya
tanpa perlu menggurui. Bagai air yang mengalir tenang, tetapi sangat
dalam. Beliau adalah teladan bagi anak-anaknya.
Teks ini ada di dalam buku Bahasa Indonesia kelas 7. Selanjutnya kita akan membuat token menggunakan tokenization. Baris pertama kode di bawah ini membagi teks menjadi token. Baris kedua mengubah token menjadi huruf kecil dan baris ketiga mencetak output.
tokens = word_tokenize(teks)
lowercase_tokens = [t.lower() for t in tokens]
print(lowercase_tokens)
Hasil
['ayahku', 'bernama', 'abu', 'salman', '.', 'ayah', 'berpostur', 'sedang', ',', 'berumur', 'sekitar', '54', 'tahun', '.', 'rambutnya', 'putih', 'beruban', '.', 'di', 'dagunya', 'terdapat', 'bekas', 'cukur', 'jenggot', 'putih', 'di', 'dagunya', '.', 'kulit', 'ayahku', 'kuning', 'langsat', '.', 'wajah', 'ayah', 'tipikal', 'batak', 'dengan', 'rahang', 'yang', 'kuat', 'dan', 'hidung', 'mancung', 'tapi', 'agak', 'besar', '.', 'matanya', 'hitam', 'tajam', 'dengan', 'alis', 'tebal', '.', 'sepintas', 'ayahku', 'seperti', 'orang', 'india', '.', 'meskipun', 'kelihatannya', 'mengerikan', ',', 'ayahku', 'orang', 'yang', 'sabar', '.', 'wajahnya', 'teduh', 'dan', 'selalu', 'tersenyum', 'menghadapi', 'masalah', 'apa', 'pun', '.', 'ya', ',', 'ayahku', 'adalah', 'orang', 'yang', 'paling', 'sabar', 'yang', 'pernah', 'aku', 'kenal', '.', 'tidak', 'pernah', 'terlihat', 'marah-marah', 'atau', 'membentak', '.', 'beliau', 'selalu', 'menunjukkan', 'perasaanya', 'lewat', 'gerakan', 'bermakna', 'di', 'wajahnya', '.', 'jika', 'melihat', 'anaknya', 'membandel', ',', 'ayah', 'hanya', 'menggeleng', 'sambil', 'berkata', 'lirih', 'untuk', 'membujuknya', '.', 'tidak', 'seperti', 'orang', 'batak', 'yang', 'logatnya', 'agak', 'keras', ',', 'ayahku', 'sangat', 'pendiam', '.', 'beliau', 'yang', 'irit', 'kata', ',', 'lebih', 'suka', 'memberi', 'contoh', 'langsung', 'kepada', 'anaknya', 'tanpa', 'perlu', 'menggurui', '.', 'bagai', 'air', 'yang', 'mengalir', 'tenang', ',', 'tetapi', 'sangat', 'dalam', '.', 'beliau', 'adalah', 'teladan', 'bagi', 'anak-anaknya', '.']
Daftar token yang dihasilkan di atas dapat diteruskan sebagai argumen inisialisasi untuk kelas ‘Counter’, yang telah diimpor di awal dari modul perpustakaan ‘collections’
Baris pertama kode di bawah ini membuat objek penghitung, ‘bagofwords_1’, yang memungkinkan kita melihat setiap token dan frekuensinya. Baris kedua mencetak 10 token paling umum beserta frekuensinya.
bagofwords_1 = Counter(lowercase_tokens)
print(bagofwords_1.most_common(10))
Hasil
[('.', 18), (',', 7), ('yang', 7), ('ayahku', 6), ('orang', 4), ('ayah', 3), ('di', 3), ('beliau', 3), ('putih', 2), ('dagunya', 2)]
Text Preprocessing
Output yang dihasilkan di atas menarik tetapi tidak berguna dari tujuan identifikasi topik. Ini karena token seperti ‘yang’ dan ‘di’ tidak banyak membantu dalam mengidentifikasi topik. Untuk mengatasi hal tersebut, kita akan melakukan text preprocessing.
Baris pertama kode di bawah ini membuat daftar yang disebut ‘alfabet’ yang berulang di atas ‘lower_tokens’ dan hanya mempertahankan karakter abjad. Baris kedua dan ketiga menghapus stopwords bahasa Indonesia, dan baris keempat mencetak daftar baru yang disebut ‘stopwords_removed’.
alphabets = [t for t in lowercase_tokens if t.isalpha()]
words = stopwords.words("indonesian")
stopwords_removed = [t for t in alphabets if t not in words]
print(stopwords_removed)
Hasil
['ayahku', 'bernama', 'abu', 'salman', 'ayah', 'berpostur', 'berumur', 'rambutnya', 'putih', 'beruban', 'dagunya', 'bekas', 'cukur', 'jenggot', 'putih', 'dagunya', 'kulit', 'ayahku', 'kuning', 'langsat', 'wajah', 'ayah', 'tipikal', 'batak', 'rahang', 'kuat', 'hidung', 'mancung', 'matanya', 'hitam', 'tajam', 'alis', 'tebal', 'sepintas', 'ayahku', 'orang', 'india', 'mengerikan', 'ayahku', 'orang', 'sabar', 'wajahnya', 'teduh', 'tersenyum', 'menghadapi', 'ya', 'ayahku', 'orang', 'sabar', 'kenal', 'membentak', 'beliau', 'perasaanya', 'gerakan', 'bermakna', 'wajahnya', 'anaknya', 'membandel', 'ayah', 'menggeleng', 'lirih', 'membujuknya', 'orang', 'batak', 'logatnya', 'keras', 'ayahku', 'pendiam', 'beliau', 'irit', 'suka', 'contoh', 'langsung', 'anaknya', 'menggurui', 'air', 'mengalir', 'tenang', 'beliau', 'teladan']
Nah, langkah-langkah awal text preprocessing telah diselesaikan. Namun salah satu teknik penting yaitu stemming dengan library sastrawi untuk mengembalikan kata-kata ke dasarnya belum dilakukan.
Di bawah ini baris pertama kode menggunakan stem () untuk membuat daftar baru yang disebut “lem_tokens”. Baris kedua memanggil kelas “Counter” dan membuat “Counter” baru yang disebut bag_words. Dan baris ketiga akan mencetak enam token paling umum.
lem_tokens = [stemmer.stem(t)for t in stopwords_removed]
bag_words = Counter(lem_tokens)
print(bag_words.most_common(6))
Hasil
[('ayah', 9), ('orang', 4), ('wajah', 3), ('beliau', 3), ('putih', 2), ('dagu', 2)]
Jadi, setelah melihat fakta di atas Kita dapat dengan mudah mengidentifikasi bahwa topik pada teks tersebut adalah ayah.
Mari kita visualisasikan topik yang telah diketahui ini dengan grafik lewat library pandas dan word cloud agar semakin semakin jelas.
import pandas as pd
freq_df = pd.DataFrame.from_records(bag_words.most_common(20),
columns=['token', 'count'])
# membuat plot batang
freq_df.plot(kind='bar', x='token')
Hasil
from matplotlib import pyplot as plt
from wordcloud import WordCloud
def wordcloud(bag_words):
wc = WordCloud(width=1200, height=800,
background_color="white",
max_words=200)
wc.generate_from_frequencies(bag_words)
fig = plt.figure(figsize=(6,4))
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.tight_layout(pad=0)
plt.show()
Terakhir, panggil fungsinya
wordcloud(bag_words)
Hasil
Oke, sampai di sini dulu pembahasan ini. Terima kasih telah mampir di blog saya.
Sumber