IndoT5 Sumarisasi Ulasan/Review Produk

Model ini merupakan hasil pretraining dan fine-tuning dari wikidepia/indot5-base, yang dikembangkan khusus untuk tugas sumarisasi review produk berdasarkan kelas sentimen yang samaβ€”misalnya, meringkas kumpulan review positif atau negatif.

Sebelum dilakukan fine-tuning, model terlebih dahulu melalui proses pretraining menggunakan 65.849 baris ulasan produk. Tujuannya adalah agar model lebih memahami gaya bahasa informal yang umum digunakan dalam review, seperti singkatan "banget" menjadi "bgt", "enggak" menjadi "gk", dan sebagainya.

Setelah itu, model di-finetune menggunakan 1.850 baris data hasil penggabungan review sintesis dengan LLM dan review asli. data di group per 20 review berdasarkan sentimen dan produk yang sama. Sumber data kaggle berasal dari Tokopedia dan Shopee.

⚠️ coution usage

Model ini masih bisa menghasilkan ringkasan yang kurang akurat jika menemui kosakata tidak baku yang belum dipelajari. Disarankan untuk tetap melakukan pre-processing seperti normalisasi emotikon, URL, dan teks noise. Model juga berpotensi halusinasi karena keterbatasan dataset dan akan lebih baik jika hasil ringkasan ditinjau ulang.


🎯 Tujuan

Membuat ringkasan yang bersifat abstractive dari tumpukan review/ulasan pelanggan dalam satu produk dan sentimen yang sama. idealnya model dapat meringkas hingga 30-50% dari teks input


🧠 Base Model


βš™οΈ Training Arguments

Pretraining (Domain-Adaptive Pretraining)

Berikut adalah konfigurasi pre-train training (TrainingArguments) yang digunakan saat pelatihan:

from transformers import TrainingArguments

training_args = TrainingArguments(
    output_dir="./indot5-dapt",
    overwrite_output_dir=True,
    num_train_epochs=3,
    per_device_train_batch_size=8,
    eval_strategy="epoch",
    save_steps=1000,
    logging_steps=100,
    save_total_limit=2,
    prediction_loss_only=True,
    push_to_hub=False,
    report_to=[]  
)

Finetune Training Arguments (Summarization Review)

Berikut adalah konfigurasi finetune training (TrainingArguments) yang digunakan saat pelatihan:

from transformers import TrainingArguments

training_args = TrainingArguments(
    output_dir=OUT_DIR,
    num_train_epochs=EPOCHS,
    per_device_train_batch_size=BATCH_SIZE,
    per_device_eval_batch_size=BATCH_SIZE,
    gradient_accumulation_steps=gradient_accumulation_steps,
    warmup_steps=warmup_steps,
    weight_decay=0.01,
    logging_dir=OUT_DIR,
    label_smoothing_factor=0.05,
    logging_steps=10,
    eval_strategy="epoch",
    save_strategy="epoch",
    save_total_limit=2,
    report_to="tensorboard",
    dataloader_num_workers=2,
    load_best_model_at_end=True,
    metric_for_best_model="rougeL",
    greater_is_better=True,
)

πŸ“Š Evaluasi Hasil

Hasil Pre-Train model wikidepia/indoT5-base

Model dievaluasi selama 3 epoch menggunakan metrik training dan validation loss. Berikut adalah performa model pada setiap epoch:

Epoch Training Loss Validation Loss
1 0.002800 0.000261
2 0.000100 0.000091
3 0.000100 0.000058

Pretraining dilakukan selama 3 epoch menggunakan dataset ulasan produk (tanpa label) untuk memperkuat pemahaman model terhadap bahasa domain e-commerce.


Hasil Evaluasi Finetuning Model yang Sudah di Pretrain

Model dievaluasi selama 12,20, dan 50 epoch menggunakan metrik R1,R2, dan RL Berikut adalah performa model pada setiap epoch:

πŸ“Š Training Metrics

Epoch Training Loss Validation Loss ROUGE-1 ROUGE-2 ROUGE-L
12 2.278 2.192 0.595 0.303 0.507
20 2.016 2.067 0.616 0.330 0.530
50 1.509 2.085 0.612 0.352 0.545

Model terbaik diambil dari epoch ke-50 berdasarkan nilai RougeL tertinggi.


πŸ‘¨β€πŸ’» Cara Inferensi

❗Gunakan GPU untuk hasil yang lebih optimal dan efesien ❗

# Load model directly
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

tokenizer = AutoTokenizer.from_pretrained("siRendy/indoT5-sumarisasi-review-produk-p3")
model = AutoModelForSeq2SeqLM.from_pretrained("siRendy/indoT5-sumarisasi-review-produk-p3")

import torch
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)

def summarize_text(text, model, tokenizer, num_beams=25, no_repeat_ngram_size=2):
    inputs = tokenizer.encode(
        f"ringkaslah: {text}", return_tensors="pt", max_length=1500, truncation=True
    ).to(device)

    summary_ids = model.generate(
        inputs,
        max_length=280,
        min_length=50,
        num_beams=num_beams,
        no_repeat_ngram_size=no_repeat_ngram_size,
        repetition_penalty=2.0,
        length_penalty=2.0,
        early_stopping=True
    )
    return tokenizer.decode(summary_ids[0], skip_special_tokens=True)

import pprint # Import the pprint module
pp = pprint.PrettyPrinter()

# Contoh penggunaan
contoh_text = """
    "Keripiknya garing bgt, cocok buat ngemil saat lagi santai. Rasanya juga pas, ga terlalu asin atau gurih.",
    "Packingnya rapih, keripiknya tetep crispy meski udah sampai di rumah. Harga sesuai sama kualitas.",
    "Rasa bumbunya mantap, gurih dan ada sedikit pedasnya, bikin ketagihan. Gak bosen dimakan terus.",
    "Minyaknya juga gak berlebihan, keripiknya masih kering dan enak, bener-bener fresh.",
    "Keripiknya gede-gede dan gak ada yang remuk, bener-bener full isi, enak banget pas digigit.",
    "Porsinya pas, nggak kurang dan nggak berlebihan. Cocok buat ngemil rame-rame atau nonton film.",
    "Bumbunya nempel merata, jadi setiap gigitan keripiknya rasa banget, enak dan gurih.",
    "Rasanya juga seimbang, ada manis sedikit, gurih, dan pedas. Pas banget di lidah.",
    "Kemasan kedap udara, jadi keripiknya tetap awet dan gak lembek meski udah beberapa hari dibuka.",
    "Aroma pas buka kemasan langsung wangi, bikin makin lapar. Ga ada bau aneh, fresh banget.",
    "Teksturnya garing dan crunchy, gak keras, enak banget dimakan. Bikin nagih deh.",
    "Saus tomatnya pas, ada rasa manisnya, tapi nggak berlebihan. Balance sama keripiknya.",
    "Porsinya cukup banyak, bisa buat share ke temen-temen. Rasanya juga pas di semua lidah.",
    "Keripiknya gak terlalu tipis, jadi pas digigit ada tekstur yang enak, nggak gampang remuk.",
    "Bumbunya pas banget, ada rasa pedas dan sedikit asin, bikin makan jadi lebih nikmat.",
    "Kemasan praktis, gak ribet dibuka, dan keripiknya tetep crispy sampe habis.",
    "Keripiknya enak, garing, dan gurih banget. Kualitasnya gak kalah sama yang premium.",
    "Setelah dibuka, keripiknya tetap crunchy, gak lembek kayak produk lain. Enak banget.",
    "Bungkusnya kuat, nggak ada yang rusak. Pas sampai, keripiknya masih utuh dan fresh.",
    "Bumbunya enak banget, meresap ke dalam keripiknya, jadi setiap gigitan kerasa banget rasanya.",
    "Rasa pedasnya cocok buat yang suka makanan sedikit pedas, gak nyiksa, tapi enak banget.",
    "Harga sebanding sama kualitas, keripiknya gede dan penuh bumbunya. Bener-bener worth it.",
    "Makan keripik ini ngerasa kayak lagi nyemil makanan premium, gurihnya bener-bener pas.",
    "Tebelnya pas, nggak keras, dan nggak lembek. Pas banget dimakan sambil ngobrol sama temen.",
    "Bumbunya ringan tapi berasa, gak bikin eneg meski makan banyak. Pas banget buat ngemil.",
    "Keripiknya seger banget, bahkan di hari kedua setelah dibuka, masih garing.",
    "Ada variasi rasa yang bisa dicoba, jadi nggak bosen. Setiap rasa punya karakter sendiri.",
    "Cocok banget buat ngemil sambil nonton film, keripiknya nggak berasa berminyak.",
    "Keripiknya crispy dan lezat, gak ada yang gosong. Bumbunya juga pas, gak terlalu pedas.",
    "Keripiknya nggak nyisa minyak, garing dan tetep enak meski udah beberapa jam setelah buka.",
    "Gak ada bagian keripik yang keras banget atau gosong, semua terasa fresh dan enak.",
    "Bungkusnya kecil, praktis dibawa kemana-mana, cocok buat ngemil pas lagi jalan-jalan.",
    "Keripiknya gak cuma garing, tapi juga ada rasa manis gurih yang bikin ketagihan.",
    "Keripiknya tebal-tebal, jadi rasa keripiknya lebih berasa dibanding keripik tipis biasa.",
    "Rasa pedasnya ringan, cocok banget buat yang suka makanan nggak terlalu pedas tapi tetap enak.",
    "Harga oke banget, kualitas keripiknya juga premium, worth it banget buat dibeli lagi."

"""
hasil_summary = summarize_text(contoh_text, model, tokenizer)
pp.pprint(hasil_summary)
print('-' * 75)
Downloads last month
7
Safetensors
Model size
248M params
Tensor type
F32
Β·
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Model tree for siRendy/IndoT5-Sumarization-Review-Produk-datathon2025

Finetuned
(9)
this model

Dataset used to train siRendy/IndoT5-Sumarization-Review-Produk-datathon2025