Membuat Ringkasan Berita Google News MenggunakanVertex PALM API dan Langchain

Choirul Amri
Google Cloud Indonesia
6 min readOct 1, 2023

Google News merupakan agregator berbagai kanal berita yang tersedia dalam banyak bahasa. Membaca ringkasan berita tentu saja sangat menghemat waktu daripada membaca artikel lengkap satu per satu.

Dalam tulisan ini, kita akan membuat ringkasan berita dari konten di Google News dengan menggunakan komponen-komponen berikut:

  • GNews API: untuk mengumpulkan judul berita & metadata dari Google News
  • Langchain’s UnstructuredURLLoader: untuk penarikan konten berita
  • Google Cloud’s Vertex PALM API: model LLM untuk membuat ringkasan berita

Google News tidak menyediakan API resmi, jadi kita akan menggunakan GNews, library open source pihak ketiga yang dibuat oleh ranahaani.

Vertex PALM API merupakan Large Language Model (LLM) yang dapat digunakan untuk berbagai tugas, salah satunya adalah membuat ringkasan dari suatu teks atau artikel.

Dalam tutorial ini, kita akan menggunakan model text-bison@001 dari PALM API untuk meringkas konten berita.

Kredit dan referensi:

Jika Anda ingin langsung mencoba di notebook, source code lengkap tersedia di github:

Diagram Konseptual

Diagram dibawah menjelaskan konsep untuk membuat sebuah ringkasan berita.

diagram konseptual peringkasan berita (by author)

Pertama, kita menggunakan GNews API untuk mendapatkan metadata berita. Atribut terpenting adalah URL berita, yang akan menjadi tautan untuk mendapatkan artikel lengkap.

Kedua, kita menggunakan Langchain’s UnstructuredURLLoader untuk mendapatkan artikel lengkap.

Ketiga, konten berita dimasukkan sebagai input ke PALM API, untuk kemudian diproses menjadi ringkasan dari artikel berita.

Instalasi dan persiapan

Solusi peringkasan berita memerlukan instalasi beberapa paket berikut:

#install all required package
!pip -q install langchain
!pip install google-cloud-aiplatform
!pip install gnews
!pip install unstructured

Setelah instalasi selesai, lakukan import komponen berikut:

# import required packages
from langchain.llms import VertexAI
from langchain.chains.summarize import load_summarize_chain
from langchain.prompts import PromptTemplate
from langchain.document_loaders import UnstructuredURLLoader

Penarikan Metadata Berita menggunakan GNews API

GNews API merupakan pustaka Python open source untuk mengakses Google News. Pencarian berita dapat dilakukan menggunakan kata kunci, topik, lokasi, atau rentang tanggal.

Function get_news() berfungsi mengambil metadata berita dari Google News. Berikut ini contoh kode untuk mengambil berita berdasarkan kata kunci “MRT Jakarta” :

#get by keyword
google_news = GNews()
news_by_keyword = google_news.get_news('MRT Jakarta')

Kita juga dapat memasukkan beberapa parameter tambahan untuk menyaring berita yang ditarik dari Google News. Beberapa parameter antara lain: max_result, country, langauage, dan periode waktu.

from gnews import GNews
google_news = GNews()
google_news.period = '1d' # News from last 1 day
google_news.max_results = 5 # number of responses across a keyword
google_news.country = 'ID' # News from a specific country = Indonesia
google_news.language = 'id' # News in a specific language = Bahasa Indonesia
google_news.exclude_websites = ['yahoo.com', 'cnn.com', 'msn.con'] # Exclude news from specific website i.e Yahoo.com and CNN.com

#use date range if required
#google_news.start_date = (2023, 1, 1) # Search from 1st Jan 2023
#google_news.end_date = (2023, 4, 1) # Search until 1st April 2023

news_by_keyword = google_news.get_news('MRT Jakarta')

Berikut beberapa contoh periode waktu yang dapat digunakan:

  • h = hours (eg: 12h)
  • d = days (eg: 7d)
  • m = months (eg: 6m)
  • y = years (eg: 1y)

Contoh penggunakan periode waktu adalah sebagai berikut:

google_news.period = '3d' # News from last 3 days

Penarikan Top News dari Goole News

GNews API menyediakan fungsi get_top_news() untuk mendapatkan artikel berita terpopuler dari Google News. Kita dapat menambahkan argumen saat menginisialisasi objek google_news yang baru.

Berikut contoh kode untuk mendapatkan 10 artikel berita terpopuler dari Google News dalam bahasa Indonesia, dalam rentang 7 hari terakhir:

# get top news from the last 7 days
google_news = GNews(language='id', country='ID', period='7d',
start_date=None, end_date=None, max_results=10)
top_news = google_news.get_top_news()

# check collected news metadata
top_news

Penarikan News berdasarkan Topik

Kita juga dapat melakukan penarikan metadataberita berdasarkan topik tertentu menggunakan fungsi get_news_by_topic(). Berikut adalah beberapa topik yang tersedia di Google News.

  • WORLD
  • NATION
  • BUSINESS
  • TECHNOLOGY
  • ENTERTAINMENT
  • SPORTS
  • SCIENCE
  • HEALTH

Berikut contoh kode untuk mendapatkan 5 berita untuk topik “NASIONAL” dalam bahasa Indonesia dalam rentang 7 hari terakhir. Opsi exclude_websites dapat ditambahkan untuk memasukkan sumber berita yang akan dikecualikan dari penarikan.

#collect metadata by news topic
google_news = GNews(language='id', country='ID',
period='7d', start_date=None, end_date=None,
max_results=5, exclude_websites = ['yahoo.com', 'msn'] )
news_by_topic = google_news.get_news_by_topic('NATION')

#check collected news
news_by_topic

Penarikan konten berita dari url

Langkah selanjutnya adalah mendapatkan konten berita lengkap dari setiap URL. GNews API memberikan informasi dasar tentang sebuah artikel berita, seperti judul, tanggal publikasi, dan URL.

Untuk mendapatkan konten berita secara lengkap, kita akan menggunakan pustaka UnstructuredURLLoader dari Langchain. Library ini sebenarnya merupakan wrapper dari partisi bricks.html yang bersumber dari pustaka Unstructured.

Berikut adalah cuplikan kode untuk mendapatkan konten berita dengan menggunakan URL sebagai parameter input untuk UnstructuredURLLoader:

#test to extract content from url inside news_by_topic
urls = [news_by_topic[0]['url'],
news_by_topic[1]['url'],
]
loader = UnstructuredURLLoader(urls=urls)
content = loader.load()
#check news content
content

Peringkasan berita menggunakan Vertex PALM API

Langkah terakhir adalah menggunakan model text-bison@001 untuk menghasilkan ringkasan berita. Kita perlu memberikan prompt untuk memberi tahu model tentang prosedur meringkas teks.

Prompting

Prompting yang benar sangat penting untuk mendapatkan hasil yang akurat dari LLM. Obyek prompt_template dari pustaka Langchain digunakan untuk menyimpan teks dari prompt yang diberikan. Untuk konsistensi, prompting diberikan dalam bahasa Inggris dengan instruksi berupa langkah — langkah berikut:

Generate summary for the following text, using the following steps:

Summary consists of maximum 100 words

If the text cannot be found or error, return: “Content empty”

Use only materials from the text supplied

Create summary in Bahasa Indonesia

Berikut adalah implementasi prompting ke dalam prompt_template:

#prompting to perform news summary
prompt_template = """Generate summary for the following text, using the following steps:
1. summary consists of maximum 100 words
2. If the text cannot be found or error, return: "Content empty"
3. Use only materials from the text supplied
4. Create summary in Bahasa Indonesia

"{text}"
SUMMARY:"""

prompt = PromptTemplate.from_template(prompt_template)

#declare LLM model
llm = VertexAI(temperature=0.1,
model='text-bison@001',
top_k=40,
top_p=0.8,
max_output_token=512)

Membuat Fungsi generate_summary

Proses peringkasan berita dibungkus dalam sebuah fungsi dengan nama generate_summary. Fungsi ini berisi rutin untuk melakukan langkah — langkah berikut:

  • Penarikan konten berita dari setiap url
  • Membuat ringkasan dari setiap konten berita
  • Cetak output untuk ditampilkan
# create function to generate news summary based on list of news urls
# Load URL , get news content and summarize
def generate_summary(docnews):
for item in docnews:
#extract news content
loader = UnstructuredURLLoader(urls=[item['url']])
data = loader.load()

#summarize using stuff for easy processing
chain = load_summarize_chain(llm,
chain_type="stuff",
prompt=prompt)
summary = chain.run(data)
#show summary for each news headlines
print(item['title'])
print(item['publisher']['title'], item['published date'])
print(summary, '\n')

Selanjutknya kita menjalankan generate_summary function dengan memasukkan news_by_keyword sebagai parameter input. Eksekusi ini akan menghasilkan ringkasan berita sesuai dengan kata kunci pencarian.

#call the function and generate summary for news by keyword
generate_summary(news_by_keyword)

Berikut adalah contoh keluaran dari perintah diatas:

Tarif Kereta Cepat Jakarta-Kota Bandung Rp 350 Ribu, Mahal? - CNBC Indonesia
CNBC Indonesia Sat, 30 Sep 2023 09:45:00 GMT
Kereta Cepat Jakarta-Bandung akan diresmikan pada 2 Oktober 2023. Tarifnya diperkirakan sekitar Rp300.000-Rp350.000 untuk kelas ekonomi. Setelah uji coba gratis, tiket akan dikenakan biaya. Presiden Jokowi ingin harga tiket terjangkau dan bisa didiskon untuk menarik minat masyarakat.
Kemenparekraf dikatakan Dessy senantiasa mendorong pelaku industri agar mulai membuat paket-paket perjalanan wisata dengan memasukkan kereta cepat sebagai salah satu daya tarik ataupun transportasi pilihan.

Kereta Cepat Diharapkan Bantu Geliatkan Kunjungan Wisatawan … - Republika Online
Republika Online Sat, 30 Sep 2023 14:40:05 GMT
Kereta cepat Jakarta-Bandung akan resmi beroperasi mulai 2 Oktober 2023. Kereta cepat ini diharapkan dapat memberi dampak pada peningkatan kualitas sektor pariwisata dan ekonomi kreatif di Tanah Air.
Khususnya, aksesibilitas wisatawan menuju berbagai destinasi dan sentra ekonomi kreatif di Jawa Barat.
Deputi Bidang Kebijakan Strategis Kemenparekraf, Dessy Ruhati meyakini kehadiran Whoosh dapat memperkuat capaian target wisatawan baik nusantara maupun mancanegara di tahun 2023

Kita juga dapat menghasilkan ringkasan berita berdasarkan topik tertentu dengan memasukkan news_by_topic sebagai input:

#call the function and generate summary for news by topics
generate_summary(news_by_topic)

Source code tersedia di github:

Anda juga dapat langsung menjalankan kode di Google Colab sebagai berikut:

--

--

Choirul Amri
Google Cloud Indonesia

Cloud Customer Engineer @Google. Data Enthusiast. Stories are my own opinion