Semua orang pasti pernah membaca berita. Dahulu kita dapat menemukan berita di televisi, surat kabar, majalah, Internet dll. Dalam sehari muncul ribuan berita baru dari penyedia berita, bahkan jumlahnya bisa saja lebih dari itu. Kita mungkin pernah menemukan suatu berita yang judulnya cukup menarik perhatian, namun kita terlalu malas untuk membacanya.
Jika anda mengenal Machine Learning, khususnya Natural Language Processing (NLP), anda mungkin pernah mendengar istilah summarization (peringkasan). Summarization adalah suatu cara untuk meringkas suatu dokumen ke dalam bentuk yang lebih sederhana dengan mengambil poin-poin penting dalam dokumen tersebut.
Disini, kita akan mencoba membuat summarizer sederhana dari suatu berita. Jika anda mengikuti perkembangan dunia NLP, anda mungkin pernah mendengar metode seperti Bart untuk melakukan peringkasan. Metode tersebut memang sudah terbukti sangat baik. Namun permasalahannya adalah resource yang dibutuhkan cukup besar, dan tidak ada pre-trained model yang tersedia untuk Bahasa Indonesia. Walaupun begitu, anda tetap dapat membuat model sendiri dengan bahasa yang baru. Namun dataset untuk Bahasa Indonesia sangat terbatas, kecuali jika anda cukup rajin untuk membuatnya sendiri.
Sebelum memulai, kita akan sedikit berbicara mengenai pendekatan dalam news summarization.
Secara umum, pendekatan news summarization dibagi menjadi dua, yaitu extractive dan abstractive. Extractive summarization berarti mengidentifikasi bagian-bagian penting dari teks dan membuat kalimat dari kata-kata tersebut. Sementara abstractive summarization mereproduksi materi penting dengan cara baru setelah melakukan interpretasi dan memeriksa teks menggunakan NLP untuk membuat kalimat baru yang berasal dari dokumen aslinya.
Karena tujuan awal kita adalah membuat summarizer sederhana, di sini kita akan menggunakan pendekatan extractive summarization. Mari kita mulai, jika Anda ingin melihat kode lengkap dari artikel ini, silakan kunjungi Github saya.
Perlu diketahui bahwa artikel ini merupakan terjemahan dari artikel saya yang lain, sehingga beberapa kata mungkin akan sedikit membingungkan. Jika anda tertarik untuk membaca artikel aslinya, anda dapat mengunjungi tautan berikut.
How to Create Simple News Summarization from Scratch using Python
Pertama, import package yang akan digunakan
import numpy as np
import nltk
import re
Di sini kita menggunakan library NumPy, nltk, dan re. NumPy adalah library untuk perhitungan numerik, nltk adalah library yang banyak digunakan untuk NLP, dan re adalah library untuk regular expression.
Setelah itu, kita buat fungsi untuk melakukan preprocessing. Ini bertujuan untuk membersihkan kata-kata dan menghilangkan karakter yang tidak diperlukan. Di sini ada 3 tahap preprocessing yang dilakukan, yaitu:
- Case folding: mengubah semua huruf menjadi huruf kecil
- Cleaning: menghapus semua tanda baca dan angka, hanya menyisakan karakter alfabet
- Tokenisasi: mengubah kalimat menjadi token kata
- Stopword removal: menghilankan kata-kata yang termasuk ke dalam stopword
Berikut adalah kode untuk proses preprocessing.
def casefolding(sentence):
return sentence.lower()def cleaning(sentence):
return re.sub(r'[^a-z]', ' ', re.sub("’", '', sentence))def tokenization(sentence):
return sentence.split()def stopword_removal(token):
temp = []
for i in range(len(token)):
if token[i] not in stopwords:
temp.append(token[i])
return temp
Selanjutnya, kita juga membutuhkan fungsi untuk mengubah keseluruhan dokumen menjadi kumpulan kalimat.
def sentence_split(paragraph):
return nltk.sent_tokenize(paragraph)
Selanjutnya kita akan mendefinisikan fungsi untuk menghitung jumlah setiap kata dalam dokumen. Proses ini dilakukan untuk memberi bobot pada kata-kata yang bertujuan untuk menentukan apakah kata tersebut penting atau tidak.
def word_freq(data):
w = []
for sentence in data:
for words in sentence:
w.append(words)
bag = list(set(w))
res = {}
for word in bag:
res[word] = w.count(word)
return res
Kemudian, kita akan membuat fungsi untuk menghitung bobot setiap kalimat. Proses ini dilakukan untuk menentukan kalimat mana yang dianggap paling mewakili keseluruhan dokumen.
def sentence_weight(data):
weights = []
for words in data:
temp = 0
for word in words:
temp += wordfreq[word]
weights.append(temp)
return weights
Sekarang, semua fungsi yang akan kita gunakan telah dibuat. Mari kita ambil contoh kasus. Sebagai contoh, saya akan menggunakan artikel dari detik.com berjudul “Liverpool Juara Liga Inggris, Para Mantan Ucapkan Selamat“.
Kita akan mulai dengan memasukkan berita di situs ke dalam variabel dengan melakukan copy-paste secara manual. Jika Anda tidak ingin melakukan copy-paste dan tertarik pada web scraping, Anda dapat membaca artikel saya sebelumnya yang berjudul “Web Scraping Berita dengan 4 Baris Kode menggunakan Python”.
Web Scraping Berita dengan 4 Baris Kode menggunakan Python
news = """
Liverpool kembali menjadi juara Liga Inggris setelah 30 tahun lamanya. Para mantan pemain The Reds pun ikut mengucapkan selamat atas prestasi tersebut.Sejak terakhir menjadi juara di musim 1989-90, upaya meraih kembali gelar Liga Inggris terus dilakukan Liverpool. Namun selama ini usaha tersebut selalu kandas.Berbagai pelatih kondang dan deretan pemain bintang datang silih berganti, namun gelar yang dinanti tak kunjung didapat.Akibatnya, banyak pemain yang pergi dari Anfield tanpa tahu rasanya juara Liga Inggris. Atau mereka harus menyeberang ke tim rival untuk mendapatkannya, seperti Michael Owen bersama Manchester United (2011) dan Raheem Sterling bersama Manchester City (2018, 2019).Oleh karena itu, ketika Liverpool sukses merengkuh gelar Premier League musim ini, tak heran barisan para mantan ini juga berbahagia. Rasa penasaran mereka pun ikut tuntas.Ucapan selamat pun bertebaran dari para eks Liverpool, khususnya di media sosial. Steven Gerrard dan Jamie Carragher sebagai scouser asli sudah tentu berselebrasi, seperti halnya Owen yang dulunya jebolan akademi Liverpool.Nama-nama seperti Fernando Torres, Dirk Kuyt, Jose Enrique, dan Javier Mascherano pun tak ketinggalan. Begitu juga dengan Luis Garcia, Harry Kewell, Vladimir Smicer, hingga nama selawas Robbie Fowler.
"""
Setelah itu, kita akan memproses berita dengan memotongnya menjadi bentuk kalimat, kemudian untuk setiap kalimat dilakukan preprocessing menggunakan fungsi yang telah kita definisikan di atas.
sentence_list = sentence_split(news)
data = []
for sentence in sentence_list:
data.append(tokenization(cleaning(casefolding(sentence))))
data = (list(filter(None, data)))
Setelah itu, kita akan menghitung jumlah setiap kata dalam dokumen dari fungsi yang telah kita tentukan.
wordfreq = word_freq(data)
Kemudian, dari hasil perhitungan kata, kita hanya perlu menghitung bobot setiap kalimat.
rank = sentence_rank(data)
Setelah itu, kita tentukan berapa banyak kalimat utama yang ingin kita tampilkan sebagai representasi berita. Sebagai contoh, saya akan menampilkan 2 kalimat, jadi di sini saya mengisi n dengan 2. Kemudian sistem akan mengambil 2 kalimat teratas yang memiliki bobot tertinggi.
n = 2
result = ''
sort_list = np.argsort(ranking)[::-1][:n]
for i in range(n):
result += '{} '.format(sentence_list[sort_list[i]])
Untuk menampilkan hasilnya, gunakan kode berikut.
print(result)
Dan inilah hasilnya.
Sejak terakhir menjadi juara di musim 1989-90, upaya meraih kembali gelar Liga Inggris terus dilakukan Liverpool. Oleh karena itu, ketika Liverpool sukses merengkuh gelar Premier League musim ini, tak heran barisan para mantan ini juga berbahagia.
Tidak buruk bukan? Meskipun mungkin tidak sebagus jika kita menggunakan metode yang lebih advance, kita dapat cukup memahami esensi dari berita singkat kita. Dan tips dari saya, dengan menggunakan metode ini, Anda dapat menghasilkan dataset Anda sendiri, meskipun masih memiliki keterbatasan karena hasil yang diperoleh tidak selalu seperti yang Anda inginkan.
Jika anda tertarik mencoba tanpa harus mengimplementasikannya terlebih dahulu, anda dapat menggunakan MilooBot. MilooBot merupakan aplikasi chatbot yang dibuat oleh Miloo Project. Adapun untuk cara penggunaannya, anda dapat mengunjungi tautan di bawah ini.
Fitur MilooBot: Meringkas Berita dan Update Data Corona




