Marangkum data teks berita denngan Python |
Merangkum atau yang biasa disebut meringkas merupakan salah satu aktivitas memendekkan sejumlah teks mengenai sebuah topik, cerita, berita, opini, atau sejenisnya dengan mengambil intisarinya. Merangkum dalam beberapa referensi sama halnya dengan sinopsis yang intinya menyajikan suatu topik secara ringkas. Namun, sebagian referensi menyebutkan meringkat berbeda dengan sinopsis. Meringkas itu adalah meringkas untuk teks yang bersifat non-fiksi. Sedangkan sinopsis adalah ringkasan untuk teks-teks yang bersifat fiksi.
Terlepas dari perbedaan pendapat mengenai definisinya, kali ini kita akan berlajar bersama bagaimana meringkas suatu teks dengan topik tertentu menjadi lebih pendek, sederhana, dan mencakup informasi penting.
Adapun data teks yang akan kita ringkas menggunakan Python kita peroleh dengan cara web scraping situs detik.com tentang hasil pertandingan sepak bola antara PSIS dan PSM Makassar yang berakhir skor 4 - 0. Berita aslinya dapat dicek pada tautan berikut.
Berita kemenangan PSIS atas PSM Makassar di detik.com |
Inti dari meringkas dengan Python dalam praktikum kali ini adalah memberikan pembobot skor pada setiap kata dalam kalimat dan pembobotan kalimat terhadap seluruh teks. Kata dan kalimat dengan pembobot skor tertinggi inilah menjadi ukuran kelayakan menjadi kalimat rangkuman dari suatu teks.
Pada proses meringkas teks, Python menyediakan sejumlah package, namun tidak banyak yang mencakup teks berbahasa Indonesia. Oleh karena itu, dalam praktik ini, kita akan menggunakan package spacy. Untuk menegakomodir teks bahasa Indonesia, yang utama dilakukan adalah mengaktifkan tool bahasa Indonesia dan sentencizer.
Langkah demi langkah merangkum teks hasil web scraping berita dengan topik sepak bola selanjutnya dapat diberikan sebagai berikut:
#Aktivasi package spacy dan aktivasi bahasa Indonesia
import spacy
nlp = spacy.blank('id')
#Preprocessing data teks bahasa Indonesia
#Case folding lowercase dan memerhatikan tanda baca atau punctuation
import string
from spacy.lang.id.stop_words import STOP_WORDS
def preprocess(text):
text = text.translate(str.maketrans('', '', string.punctuation))
text = " ".join([word for word in text.lower().split() if word not in STOP_WORDS])
return text
#Import beberapa pacakge dalam spacy dan heapq
from spacy.lang.id import Indonesian
from spacy.lang.id.stop_words import STOP_WORDS
from heapq import nlargest
#Membuat fungsi merangkum data teks
def summarize(text, num_sentences=3):
#Aktivasi model bahasa Indonesia dengan menambah komponen sentencizer
nlp = Indonesian()
nlp.add_pipe('sentencizer')
#Membuat fungsi proprocessing data teks
def preprocess(text):
return ' '.join([word for word in text.lower().split()
if word not in STOP_WORDS])
#Menerapkan fungsi preprocessing data teks
text = preprocess(text)
#Membuat dokumen spacy
doc = nlp(text)
#Menghitung skor kalimat berdasarkan frekuensinya
word_frequencies = {}
for word in doc:
if word.text not in STOP_WORDS:
if word.text not in word_frequencies:
word_frequencies[word.text] = 1
else:
word_frequencies[word.text] += 1
#Menghitung kata-kata yang memiliki frekuensi terbanyak dalam teks
max_frequency = max(word_frequencies.values())
for word in word_frequencies.keys():
word_frequencies[word] = (word_frequencies[word]/max_frequency)
#Menghitung skor kata-kata berdasarkan jumlah dari frekuensi dalam teks
sentence_scores = {}
for sent in doc.sents:
for word in sent:
if word.text in word_frequencies.keys():
if sent not in sentence_scores.keys():
sentence_scores[sent] = word_frequencies[word.text]
else:
sentence_scores[sent] += word_frequencies[word.text]
#Memperoleh sebanyak N kalimat dengan skor tertinggi
#Berdasarkan skor kata dan kalimatnya
summary_sentences = nlargest(num_sentences, sentence_scores,
key=sentence_scores.get)
#Menggabungkan kalimat dengan skor tertinggi dalam 1 string
summary = ' '.join([sent.text for sent in summary_sentences])
return summary
#Import dan aktivasi package
import pandas as pd
import requests
from scrapy.http import TextResponse
#Deklarasi alamat situs detik.com
url = "https://www.detik.com/sulsel/sepakbola/d-6660187/psis-vs-psm-makassar-hingga-menit-81-pluim-dimainkan-juku-eja-dibantai-4-0"
res = requests.get(url)
respon = TextResponse(res.url, body = res.text, encoding = "utf-8")
#Melihat hasil web scraping global
sb = respon.css(".detail__body")
sb
[<Selector xpath="descendant-or-self::*[@class and contains(concat(' ', normalize-space(@class), ' '), ' detail__body ')]" data='<div class="detail__body itp_bodycont...'>]
#Melakukan scrape judul berita
judul = respon.css(".detail__title::text").getall()[0]
#Menghapus spasi berlebih atau whitespace
judul = judul.strip()
judul
'PSIS Vs PSM Makassar hingga Menit 81: Pluim Dimainkan Juku Eja Dibantai 4-0'
#Melakukan scrape isi berita dan membersihkan sejumlah karakter yang tidak perlu
isi = respon.css("strong:nth-child(1)::text , p+ p::text , strong+ p::text").getall()
''.join(isi).strip()
isi2 = [x.replace("\r\n","") for x in isi]
isi3 = ''.join(isi2).strip()
isiberita = isi3.strip()
text = isiberita
text
"Semarang masih unggul 4-0 atas dalam laga pekan ke-33 Liga 1 musim 2022/2023. Kedua tim tampak menurunkan tempo permainan di awal babak kedua dan bermain lebih sabar dengan untuk mencari celah dari lawan.PSIS memimpin berkat gol Septian David Maulana menit ke-29, Bayu Fiqri menit ke-42, serta dua gol dari Hari Nur menit ke-60 dan 81' dalam duel yang berlangsung di Stadion Jatidiri, Semarang, Kamis (6/4/2023).PSM coba meningkatkan intensitas serangan dengan memasukkan Wiljan Pluim menit ke-60. Sementara Kenzo Nambu ditarik keluar.Baca juga: Peluang-peluang yang tercipta dari kedua tim masih belum merubah skor. Alhasil, skor 3-0 untuk PSIS pun masih bertahan hingga menit ke-75.PSIS justru menambah keunggulan pada menit ke-81. Hari Nur Yulianto kembali mencatatkan namanya di papan skor setelah menerima umpan dari Vitinho.Sebelumnya di babak pertama, PSIS dan PSM bermain agresif dengan permainan terbuka. Namun PSIS unggul lebih dulu melalui gol yang dicetak Septian David Maulana (29') dan Bayu Fiqri (42').Baca juga: PSIS Semarang (4-3-3)Pelatih: Gilbert AgiusPSM Makassar (3-5-2)Ardiansyah (Harlan Suardi 46'); Erwin gutawa, Akbar Tanjung, Agung Mannan; Dzaky Asraf (Yakob Sayuri 46'), M Arfan, Ananda Raehan, Kenzo Nambu (Wiljan Pluim 61'), Yance Sayuri; Ramadhan Sananta, Everton NascimentoPelatih: Bernardo Tavares"
#Merangkum data teks, misalkan dalam 1 kalimat
summary = summarize(text, num_sentences=1)
print(summary)
psis unggul gol dicetak septian david maulana (29') bayu fiqri (42').baca juga: psis semarang (4-3-3)pelatih: gilbert agiuspsm makassar (3-5-2)ardiansyah (harlan suardi 46'); erwin gutawa, akbar tanjung, agung mannan; dzaky asraf (yakob sayuri 46'), m arfan, ananda raehan, kenzo nambu (wiljan pluim 61'), yance sayuri; ramadhan sananta, everton nascimentopelatih: bernardo tavares
Hasil rangkuman di atas cukup baik, dengan memunculkan hasil akhir bahwa PSIS unggul (menang) atas PSM Makassar diikuti dengan urutan pemain yang berhasil mencetak gol serta waktu mencetak gol.
Demikian sedikit sharing kita kali ini. Semoga sedikit ini dapat bermanfaat. Nantikan terus unggahan menarik, unik, dan seru dalam blog sederhana ini. Selamat memahami dan mempraktikkan!