Long Text Abstractive Summarization

This tutorial is available as an IPython notebook at Malaya/example/long-text-abstractive.

This module only trained on standard language structure, so it is not save to use it for local language structure.

This module trained heavily on news structure.

[1]:
%%time
import malaya
from pprint import pprint
CPU times: user 4.98 s, sys: 937 ms, total: 5.92 s
Wall time: 6.32 s
[2]:
import re

# minimum cleaning, just simply to remove newlines.
def cleaning(string):
    string = string.replace('\n', ' ')
    string = re.sub(r'[ ]+', ' ', string).strip()
    return string

List available Transformer models

[3]:
malaya.summarization.abstractive.available_transformer()
INFO:root:tested on 5k CNN test set.
[3]:
Size (MB) Quantized Size (MB) ROUGE-1 ROUGE-2 ROUGE-L Suggested length
t2t 832.0 279.0 0.33209 0.13622 0.23348 768.0
small-t2t 379.0 120.0 0.33000 0.13417 0.23059 768.0
t5 1250.0 481.0 0.34103 0.14994 0.23655 1024.0
small-t5 355.6 195.0 0.33854 0.14588 0.23528 1024.0
bigbird 910.0 230.0 0.32580 0.13534 0.22280 2048.0
small-bigbird 303.0 77.3 0.32190 0.13380 0.21980 2048.0

If you look at Suggested length, bigbird 2x longer than T5 models.

We are going to compare t5 models with small-bigbird and bigbird models.

Below is an example I combined 3 news become 1 string.

[31]:
# https://www.astroawani.com/berita-malaysia/lagipun-kalau-isu-yang-berlaku-198788-najib-boleh-ingat-dia-nak-mandikan-keris-dengan-darah-tun-m-282301
# https://www.bharian.com.my/berita/nasional/2021/02/785400/kabinet-tidak-pernah-bangkitkan-isu-konflik-kepentingan-najib
# https://www.astroawani.com/berita-malaysia/laporan-audit-1mdb-najib-gagal-gugurkan-sri-ram-daripada-pasukan-pendakwaan-283003
# https://www.astroawani.com/berita-politik/tun-m-menyesal-lantik-tommy-thomas-sebagai-peguam-negara-281460
# https://www.astroawani.com/berita-malaysia/tun-mahathir-mahu-saya-letak-jawatan-kerana-tentangan-orang-melayu-tommy-thomas-280066

string = """
Perseteruan antara dua bekas Perdana Menteri, Tun Dr Mahathir Mohamad dan Datuk Seri Najib Tun Razak belum ada penghujungnya dengan masing-masing berbalas kenyataan di media sosial.
Selepas Najib menyanggah kenyataan tidak campur tangan dalam badan kehakiman negara dan mentertawakannya, Dr Mahathir membalasnya dengan meminta Ahli Parlimen Pekan itu memberi perhatian kepada kes 1Malaysia Development Berhad (1MDB).
Dr Mahathir juga secara sinis berkata, jika Najib boleh mengingati isu yang berlaku pada 1987 dan 1988 - isu pemilihan UMNO dan pengharaman parti itu, Najib juga boleh mengingati peristiwa dia ingin mandikan keris dengan darah.
"Saya rasa Najib tak payah campur tangan dengan tuduhan terhadap saya. Dia harus fokus kes curi duit rakyat berbilion-bilion dalam 1MDB.
"Dia juga perlu bagi perhatian saman Tommy Thomas yang kait dia dengan pembunuhan Altantuya. Lagipun, kalau isu yang berlaku 1987/88, Najib boleh ingat (peristiwa) yang dia 'hunus' keris," kata Dr Mahathir.
Sebelum ini, Najib menyanggah dakwaan Dr Mahathir yang mendakwa pembatalan pendaftaran UMNO pada 1998 sebagai bukti tidak campur tangan dalam badan kehakiman negara.
Menyokong hujahnya, Najib berkongsi apa yang berlaku pada tahun tersebut hingga menyebabkan UMNO diharamkan dan tertubuhnya UMNO baharu.

Mahkamah Tinggi di sini, hari ini, diberitahu Kabinet tidak pernah membangkitkan isu mengenai konflik kepentingan Datuk Seri Najib Razak dalam 1Malaysia Development Berhad (1MDB).

Menurut Kod Etika Bagi Anggota Pentadbiran dan Ahli Parlimen adalah menjadi amalan ahli Kabinet untuk mengisytiharkan konflik kepentingan sekiranya mempunyai pembabitan di dalam hal yang dibincangkan dalam Mesyuarat Jemaah Menteri.

Perkara itu dimaklumkan bekas Timbalan Ketua Setiausaha (Kabinet) Bahagian Kabinet Perlembagaan dan Perhubungan Jabatan Perdana Menteri (JPM), Tan Sri Mazidah Abdul Majid, dalam keterangannya pada perbicaraan kes 1MDB yang dihadapi Najib.

Kod etika itu antara lain turut menyatakan bahawa ahli Kabinet yang mempunyai kepentingan peribadi dan bercanggah dengan kepentingan kerajaan, atau membabitkan ahli keluarga, perlu meninggalkan mesyuarat dan merekodkan ketidakhadiran mereka.

Di dalam 1MDB, Najib memegang tiga jawatan iaitu Perdana Menteri, Menteri Kewangan dan Pengerusi Pengerusi Badan Penasihat 1MDB

Menjawab soalan peguam Tan Sri Muhammad Shafee Abdullah, sama ada terdapat ahli Kabinet yang membangkitkan isu bahawa Menteri Kewangan tidak seharusnya membabitkan diri dalam perbincangan itu kerana konflik kepentingan, Maziah menjawab: "Tiada."

Muhammad Shafee: Ada sesiapa yang membangkitkan perkara berhubung hal 1MBD dengan Najib?

Maziah: Tidak

Muhammad Shafee: Timbalan Perdana Menteri (ketika itu) adalah Tan Sri Muhyiddin Yassin, manakala Datuk Seri Ahmad Husni Hanadzlah adalah bekas Menteri Kewangan II. Mereka juga tidak pernah membangkitkan hal konflik kepentingan?

Mazidah: Ya, tidak pernah.

Sementara itu, menjawab soalan Timbalan Pendakwa Raya, Ahmad Akram Gharib sama ada beliau mengetahui bahawa Najib mempunyai kepentingan peribadi dalam 1MDB, Mazidah berkata: "Tidak"

Ahmad Akram: Adakah anda mengetahui bahawa Najib secara peribadi menerima duit daripada 1MDB?

Maziah: Tidak

Ahmad Akram: Sekiranya Najib secara peribadi menerima wang daripada 1MDB adakah itu konflik kepentingan dan melanggar Kod Etika Bagi Anggota Pentadbiran dan Ahli Parlimen.

Maziah: Menurut pandangan peribadi saya, ya, namun kerana ia membabitkan menteri dan perdana menteri, saya cadangkan untuk dapatkan pandangan Peguam Negara.

Terdahulu, di awal prosiding, Maziah turut memberitahu mahkamah bahawa Najib tidak pernah menyebut nama ahli perniagaan dalam buruan, Low Taek Jho atau Jho Low pada mesyuarat Kabinet sebagai individu yang membantu beliau mendapatkan sumbangan daripada kerabat diraja Arab Saudi.

"Sekiranya perkara itu dimaklumkan kepada Kabinet, maka, ia akan dicatat dalam minit mesyuarat," katanya.

Tambah Maziah, beliau hanya mendengar dan mengetahui mengenai nama Jho Low selepas timbul isu membabitkan 1MDB.

Najib, 68, menghadapi empat pertuduhan menggunakan kedudukannya untuk memperoleh suapan berjumlah RM2.3 bilion daripada dana 1MDB dan 21 pertuduhan pengubahan wang haram membabitkan jumlah wang yang sama.

Perbicaraan di hadapan Hakim Collin Lawrence Sequerah bersambung Isnin ini.

Datuk Seri Najib Tun Razak hari ini gagal dalam satu lagi cubaannya untuk menggugurkan bekas Hakim Mahkamah Persekutuan Datuk Seri Gopal Sri Ram daripada mengetuai pasukan pendakwaan dalam kes meminda laporan audit 1Malaysia Development Berhad (1MDB) melibatkan bekas perdana menteri itu.
Ini merupakan cubaan kali ketiga Najib untuk menggugurkan Sri Ram sebagai pendakwa dalam kes jenayah berkaitan 1MDB itu. Sebelum ini, satu permohonan difailkan dalam satu lagi kes 1MDB di hadapan hakim berbeza dan cubaan kedua menerusi prosiding sivil.
Ketika menolak permohonan Ahli Parlimen Pekan itu, Hakim Mahkamah Tinggi Mohamed Zaini Mazlan berkata dakwaan Najib bahawa Sri Ram terlibat dalam siasatan terhadapnya sebagai tidak ada merit.
“Tidak ada bukti kukuh untuk menyokong dakwaan pemohon dan kekal sebagai hipotesis semata-mata. Isu ini telah disiasat oleh pihak pendakwaan selaku responden semasa permohonan pemohon (Najib) yang terdahulu.
“Isu ini sudah dibincangkan dan diputuskan. Keputusan oleh mahkamah lain sebelum ini kekal dan tidak boleh diterbalikkan,” kata hakim.
Mohamed Zaini ketika memberi alasan penolakan berkata pemohon, antara lain, menjadikan komunikasi di antara bekas Peguam Negara Tan Sri Mohamed Apandi Ali dan Sri Ram sebagai bukti berat sebelah Sri Ram terhadap pemohon dan kebimbangan pemohon berhubung perkara itu adalah tidak berasas.
“Seperti juga individu lain, Sri Ram berhak mempunyai pandangan peribadi. Itu sahaja. Namun, pertimbangan berbeza akan dibuat jika beliau menunjukkan sikap berat sebelah semasa melaksanakan tugas sebagai pendakwa raya kanan. Pandangan peribadi beliau tidak boleh dianggap akan menghalang tanggungjawab beliau sebagai pendakwa raya kanan.
“Tambahan pula, kejadian itu, seperti yang dikemukakan oleh responden, berlaku ketika sebelum pelantikan Sri Ram sebagai pendakwa raya kanan. Turut penting ialah pemohon tidak membuat sebarang aduan mengenai tindak-tanduk Sri Ram ketika menjalankan perbicaraan melibatkan pemohon. Ini mengukuhkan hujah responden bahawa Sri Ram bersikap terbuka semasa menjalankan tugas sebagai pendakwa raya kanan,” kata hakim.
Mohamed Zaini seterusnya berkata pada akhirnya, mahkamah bertanggungjawab memastikan sesebuah perbicaraan dilaksanakan secara adil demi mendapatkan keadilan.
“Mahkamah akan membantu mana-mana pihak yang dilayan secara tidak adil, jika perkara tersebut berlaku. Sehubunggan itu, permohonan pemohon ditolak,” katanya.
Perbicaraan kes laporan audit 1MDB itu akan bersambung pada 22 Feb ini.
Pada prosiding hari ini, Timbalan Pendakwa Raya Ahmad Akram Gharib bertindak bagi pihak pendakwaan, manakala Najib diwakili peguam Nur Syahirah Hanapiah.
Najib, 67, dan bekas Ketua Pegawai Eksekutif 1MDB Arul Kanda Kandasamy, 45, dibicarakan atas tuduhan meminda laporan audit 1MDB.
Ahli Parlimen Pekan itu dituduh menggunakan kedudukannya untuk mengarahkan pindaan ke atas laporan audit akhir 1MDB sebelum dibentangkan kepada Jawatankuasa Kira-Kira Wang Negara bagi mengelakkan sebarang tindakan diambil terhadapnya, sementara Arul Kanda didakwa bersubahat dengan Najib dalam membuat pindaan ke atas laporan tersebut bagi melindungi Najib daripada dikenakan tindakan.
"""

string = cleaning(string)
[32]:
len(string.split())
[32]:
1020

Load Transformer models

def transformer(model: str = 't2t', quantized: bool = False, **kwargs):

    """
    Load Malaya transformer encoder-decoder model to generate a summary given a string.

    Parameters
    ----------
    model : str, optional (default='base')
        Model architecture supported. Allowed values:

        * ``'t2t'`` - Malaya Transformer BASE parameters.
        * ``'small-t2t'`` - Malaya Transformer SMALL parameters.
        * ``'t5'`` - T5 BASE parameters.
        * ``'small-t5'`` - T5 SMALL parameters.
        * ``'bigbird'`` - BigBird + Pegasus BASE parameters.
        * ``'small-bigbird'`` - BigBird + Pegasus SMALL parameters.

    quantized : bool, optional (default=False)
        if True, will load 8-bit quantized model.
        Quantized model not necessary faster, totally depends on the machine.

    Returns
    -------
    result: model
        List of model classes:

        * if `t2t` in model, will return `malaya.model.tf.Summarization`.
        * if `t5` in model, will return `malaya.model.t5.Summarization`.
        * if `bigbird` in model, will return `malaya.model.bigbird.Summarization`.
    """
[6]:
t5 = malaya.summarization.abstractive.transformer(model = 't5', quantized = True)
WARNING:root:Load quantized model will cause accuracy drop.
[7]:
bigbird = malaya.summarization.abstractive.transformer(model = 'bigbird', quantized = True)
bigbird_small = malaya.summarization.abstractive.transformer(model = 'small-bigbird', quantized = True)
WARNING:root:Load quantized model will cause accuracy drop.
WARNING:root:Load quantized model will cause accuracy drop.

Predict using greedy decoder

def greedy_decoder(
    self,
    strings: List[str],
    mode: str = 'ringkasan',
    postprocess: bool = True,
    **kwargs,
):
    """
    Summarize strings using greedy decoder.

    Parameters
    ----------
    strings: List[str]
    mode: str
        mode for summarization. Allowed values:

        * ``'ringkasan'`` - summarization for long sentence, eg, news summarization.
        * ``'tajuk'`` - title summarization for long sentence, eg, news title.
    postprocess: bool, optional (default=True)
        If True, will filter sentence generated using ROUGE score and removed international news publisher.

    Returns
    -------
    result: List[str]
    """

For T5, we only provided ``greedy_decoder`` method to predict.

[33]:
pprint(t5.greedy_decoder([string], mode = 'tajuk'))
['Najib tak pernah bangkitkan isu 1MDB, kata Mahathir']
[34]:
pprint(bigbird.greedy_decoder([string], mode = 'tajuk'))
['Najib belum berbalas kenyataan']
[35]:
pprint(bigbird_small.greedy_decoder([string], mode = 'tajuk'))
['Kes 1MDB dan 1MDB apa saja yang berlaku']
[36]:
pprint(t5.greedy_decoder([string], mode = 'ringkasan'))
['Perdana Menteri, Dr Mahathir membalas dengan meminta Najib untuk memberi '
 'perhatian kepada kes 1MDB. Mahkamah Tinggi diberitahu Kabinet tidak pernah '
 'membangkitkan isu konflik kepentingan Najib. Hakim menolak permintaan Najib '
 'untuk menggugurkan Hakim Mahkamah Persekutuan Gopal Sri Ram. Ini adalah '
 'percubaan ketiga Najib untuk menggugurkan Sri Ram sebagai pendakwa dalam kes '
 '1MDB.']
[37]:
pprint(bigbird.greedy_decoder([string], mode = 'ringkasan'))
['Najib belum berbalas kenyataan.']
[39]:
pprint(bigbird_small.greedy_decoder([string], mode = 'ringkasan'))
['Dakwaan PM mengenai pembatalan pendaftaran UMNO, yang didakwa digagalkan '
 'oleh tuduhan. "Tidak ada bukti kukuh untuk menyokong dakwaan," kata hakim. '
 '"Tidak ada bukti kukuh untuk menyokong dakwaan" mengenai kes 1MDB, kata '
 'hakim.']

Predict using nucleus decoder

def nucleus_decoder(
    self,
    strings: List[str],
    mode: str = 'ringkasan',
    top_p: float = 0.7,
    temperature: float = 1.0,
    postprocess: bool = True,
    **kwargs,
):
    """
    Summarize strings using nucleus decoder.

    Parameters
    ----------
    strings: List[str]
    mode: str
        mode for summarization. Allowed values:

        * ``'ringkasan'`` - summarization for long sentence, eg, news summarization.
        * ``'tajuk'`` - title summarization for long sentence, eg, news title.
    top_p: float, (default=0.7)
        cumulative distribution and cut off as soon as the CDF exceeds `top_p`.
    temperature: float, (default=1.0)
        logits * -log(random.uniform) * temperature.
    postprocess: bool, optional (default=True)
        If True, will filter sentence generated using ROUGE score and removed international news publisher.

    Returns
    -------
    result: List[str]
    """

For T5, we only provided ``greedy_decoder`` method to predict.

[40]:
pprint(bigbird.nucleus_decoder([string], mode = 'tajuk', temperature = 0.5))
['Najib belum berbalas kenyataan']
[41]:
pprint(bigbird_small.nucleus_decoder([string], mode = 'tajuk', temperature = 0.5))
['Kes 1MDB berbalas-garis']
[42]:
pprint(bigbird.nucleus_decoder([string], mode = 'ringkasan', temperature = 0.5))
['Najib belum berbalas kenyataan.']
[43]:
pprint(bigbird_small.nucleus_decoder([string], mode = 'ringkasan', temperature = 0.5))
['"Tidak ada penghujungnya... Saya tidak payah campur tangan dengan tuduhan '
 'terhadap saya". Perbicaraan berkaitan 1MDB hari ini akan bersambung dengan '
 'kes Maziah.']