Extractive

This tutorial is available as an IPython notebook at Malaya/example/extractive-summarization.

[1]:
%%time
import malaya
from pprint import pprint
CPU times: user 4.74 s, sys: 636 ms, total: 5.37 s
Wall time: 4.35 s

List available skip-thought models

[2]:
malaya.summarization.extractive.available_skipthought()
[2]:
Size (MB)
lstm 55.4
residual-network 99.7
  • 'lstm' - LSTM skip-thought deep learning model trained on news dataset.

  • 'residual-network' - CNN residual network with Bahdanau Attention skip-thought deep learning model trained on wikipedia dataset.

Algorithm

We use TextRank from networkx for scoring algorithm.

[3]:
isu_kerajaan = [
    'Kenyataan kontroversi Setiausaha Agung Barisan Nasional (BN), Datuk Seri Mohamed Nazri Aziz berhubung sekolah vernakular merupakan pandangan peribadi beliau',
    'Timbalan Presiden UMNO, Datuk Seri Mohamad Hasan berkata, kenyataan tersebut tidak mewakili pendirian serta pandangan UMNO \n\nkerana parti itu menghormati serta memahami keperluan sekolah vernakular dalam negara',
    '"Saya ingin menegaskan dua perkara penting',
    'Pertama pendirian beliau tersebut adalah pandangan peribadi yang tidak mewakili pendirian dan pandangan UMNO',
    '"Kedua UMNO sebagai sebuah parti sangat menghormati dan memahami keperluan sekolah vernakular di Malaysia',
    'UMNO berpendirian sekolah jenis ini perlu terus wujud di negara kita," katanya dalam satu kenyataan akhbar malam ini',
    'Mohamed Nazri semalam menjelaskan, kenyataannya mengenai sekolah jenis kebangsaan Cina dan Tamil baru-baru ini disalah petik pihak media',
    'Kata Nazri dalam kenyataannya itu, beliau menekankan bahawa semua pihak perlu menghormati hak orang Melayu dan bumiputera',
    'Mohamad yang menjalankan tugas-tugas Presiden UMNO berkata, UMNO konsisten dengan pendirian itu dalam mengiktiraf kepelbagaian bangsa dan etnik termasuk hak untuk beragama serta mendapat pendidikan',
    'Menurut beliau, persefahaman dan keupayaan meraikan kepelbagaian itu menjadi kelebihan dan kekuatan UMNO dan BN selama ini',
    'Kata beliau, komitmen UMNO dan BN berhubung perkara itu dapat dilihat dengan jelas dalam bentuk sokongan infrastruktur, pengiktirafan dan pemberian peruntukan yang diperlukan',
    '"Saya berharap isu ini tidak dipolitikkan secara tidak bertanggungjawab oleh mana-mana pihak terutama dengan cara yang tidak menggambarkan pendirian sebenar UMNO dan BN," katanya',
    'Beliau turut menegaskan Mohamed Nazri telah mengambil pertanggungjawaban dengan membuat penjelasan maksud sebenarnya ucapanny di Semenyih, Selangor tersebut',
]
[4]:
isu_string = '\n\n\n\nDUA legenda hebat dan ‘The living legend’ ini sudah memartabatkan bidang muzik sejak lebih tiga dekad lalu. Jika Datuk Zainal Abidin, 59, dikenali sebagai penyanyi yang memperjuangkan konsep ‘world music’, Datuk Sheila Majid, 55, pula lebih dikenali dengan irama jazz dan R&B.\n\nNamun, ada satu persamaan yang mengeratkan hubungan mereka kerana sama-sama mencintai bidang muzik sejak dulu.\n\nKetika ditemui dalam sesi fotografi yang diatur di Balai Berita, baru-baru ini, Zainal berkata, dia lebih ‘senior’ daripada Sheila kerana bermula dengan kumpulan Headwind sebelum menempa nama sebagai penyanyi solo.\n\n“Saya mula berkawan rapat dengan Sheila ketika sama-sama bernaung di bawah pengurusan Roslan Aziz Productions (RAP) selepas membina karier sebagai artis solo.\n\n“Namun, selepas tidak lagi bernaung di bawah RAP, kami juga membawa haluan karier seni masing-masing selepas itu,” katanya.\n\nJusteru katanya, dia memang menanti peluang berganding dengan Sheila dalam satu konsert.\n\nPenyanyi yang popular dengan lagu Hijau dan Ikhlas Tapi Jauh itu mengakui mereka memang ada keserasian ketika bergandingan kerana membesar pada era muzik yang sama.\n\n“Kami memang meminati bidang muzik dan saling memahami antara satu sama lain. Mungkin kerana kami berdua sudah berada pada tahap di puncak karier muzik masing-masing.\n\n“Saya bersama Sheila serta Datuk Afdlin Shauki akan terbabit dalam satu segmen yang ditetapkan.\n\n“Selain persembahan solo, saya juga berduet dengan Sheila dan Afdlin dalam segmen interaktif ini. Setiap penyanyi akan menyampaikan enam hingga tujuh lagu setiap seorang sepanjang konsert yang berlangsung tiga hari ini,” katanya.\n\nBagi Sheila pula, dia memang ada terbabit dengan beberapa persembahan bersama Zainal cuma tiada publisiti ketika itu.\n\n“Kami pernah terbabit dengan showcase dan majlis korporat sebelum ini. Selain itu, Zainal juga terbabit dengan Konsert Legenda yang membabitkan jelajah empat lokasi sebelum ini.\n\n“Sebab itu, saya sukar menolak untuk bekerjasama dengannya dalam Festival KL Jamm yang dianjurkan buat julung kali dan berkongsi pentas dalam satu konsert bertaraf antarabangsa,” katanya.\n\n\n\nFESTIVAL KL Jamm bakal menggabungkan pelbagai genre muzik seperti rock, hip hop, jazz dan pop dengan lebih 100 persembahan, 20 ‘showcase’ dan pameran.\n\nKonsert berbayar\n\n\n\nMewakili golongan anak seni, Sheila menaruh harapan semoga Festival KL Jamm akan menjadi platform buat artis yang sudah ada nama dan artis muda untuk membuat persembahan, sekali gus sama-sama memartabatkan industri muzik tempatan.\n\nMenurut Sheila, dia juga mencadangkan lebih banyak tempat diwujudkan untuk menggalakkan artis muda membuat persembahan, sekali gus menggilap bakat mereka.\n\n“Berbanding pada zaman saya dulu, artis muda sekarang tidak banyak tempat khusus untuk mereka menyanyi dan menonjolkan bakat di tempat awam.\n\n“Rata-rata hanya sekadar menyanyi di laman Instagram dan cuma dikenali menerusi satu lagu. Justeru, bagaimana mereka mahu buat showcase kalau hanya dikenali dengan satu lagu?” katanya.\n\nPada masa sama, Sheila juga merayu peminat tempatan untuk sama-sama memberi sokongan pada penganjuran festival KL Jamm sekali gus mencapai objektifnya.\n\n“Peminat perlu ubah persepsi negatif mereka dengan menganggap persembahan artis tempatan tidak bagus.\n\n“Kemasukan artis luar juga perlu dilihat dari sudut yang positif kerana kita perlu belajar bagaimana untuk menjadi bagus seperti mereka,” katanya.\n\nSementara itu, Zainal pula berharap festival itu akan mendidik orang ramai untuk menonton konsert berbayar serta memberi sokongan pada artis tempatan.\n\n“Ramai yang hanya meminati artis tempatan tetapi tidak mahu mengeluarkan sedikit wang untuk membeli tiket konsert mereka.\n\n“Sedangkan artis juga menyanyi untuk kerjaya dan ia juga punca pendapatan bagi menyara hidup,” katanya.\n\nFestival KL Jamm bakal menghimpunkan barisan artis tempatan baru dan nama besar dalam konsert iaitu Datuk Ramli Sarip, Datuk Afdlin Shauki, Zamani, Amelina, Radhi OAG, Dr Burn, Santesh, Rabbit Mac, Sheezy, kumpulan Bunkface, Ruffedge, Pot Innuendo, artis dari Kartel (Joe Flizzow, Sona One, Ila Damia, Yung Raja, Faris Jabba dan Abu Bakarxli) dan Malaysia Pasangge (artis India tempatan).\n\nManakala, artis antarabangsa pula membabitkan J Arie (Hong Kong), NCT Dream (Korea Selatan) dan DJ Sura (Korea Selatan).\n\nKL Jamm dianjurkan Music Unlimited International Sdn Bhd dan bakal menggabungkan pelbagai genre muzik seperti rock, hip hop, jazz dan pop dengan lebih 100 persembahan, 20 ‘showcase’, pameran dan perdagangan berkaitan.\n\nFestival tiga hari itu bakal berlangsung di Pusat Pameran dan Perdagangan Antarabangsa Malaysia (MITEC), Kuala Lumpur pada 26 hingga 28 April ini.\n\nMaklumat mengenai pembelian tiket dan keterangan lanjut boleh melayari www.kljamm.com.'

Load SKLearn Interface

Load decomposition and text vectorizer module from sklearn,

def sklearn(model, vectorizer):
    """
    sklearn interface for summarization.

    Parameters
    ----------
    model : object
        Should have `fit_transform` method. Commonly:

        * ``sklearn.decomposition.TruncatedSVD`` - LSA algorithm.
        * ``sklearn.decomposition.LatentDirichletAllocation`` - LDA algorithm.
    vectorizer : object
        Should have `fit_transform` method. Commonly:

        * ``sklearn.feature_extraction.text.TfidfVectorizer`` - TFIDF algorithm.
        * ``sklearn.feature_extraction.text.CountVectorizer`` - Bag-of-Word algorithm.
        * ``malaya.text.vectorizer.SkipGramCountVectorizer`` - Skip Gram Bag-of-Word algorithm.
        * ``malaya.text.vectorizer.SkipGramTfidfVectorizer`` - Skip Gram TFIDF algorithm.

    Returns
    -------
    result: malaya.model.extractive_summarization.SKLearn
    """
[5]:
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
from malaya.text.vectorizer import SkipGramCountVectorizer, SkipGramTfidfVectorizer
from sklearn.decomposition import TruncatedSVD, LatentDirichletAllocation

stopwords = malaya.text.function.get_stopwords()
[6]:
vectorizer = SkipGramCountVectorizer(
    max_df = 0.95,
    min_df = 1,
    ngram_range = (1, 3),
    stop_words = stopwords,
    skip = 2
)
[7]:
svd = TruncatedSVD(n_components = 30)
[8]:
model = malaya.summarization.extractive.sklearn(svd, vectorizer)

Sentence level

This will predict scores for each sentences,

def sentence_level(
    self,
    corpus,
    isi_penting: str = None,
    top_k: int = 3,
    important_words: int = 10,
    **kwargs
):
    """
    Summarize list of strings / string on sentence level.

    Parameters
    ----------
    corpus: str / List[str]
    isi_penting: str, optional (default=None)
        if not None, will put priority based on `isi_penting`.
    top_k: int, (default=3)
        number of summarized strings.
    important_words: int, (default=10)
        number of important words.

    Returns
    -------
    dict: {'summary', 'top-words', 'cluster-top-words', 'score'}
    """
[9]:
r = model.sentence_level(isu_kerajaan)
r.keys()
[9]:
dict_keys(['summary', 'top-words', 'cluster-top-words', 'score'])
[10]:
pprint(r['summary'])
('"Kedua UMNO sebagai sebuah parti sangat menghormati dan memahami keperluan '
 'sekolah vernakular di Malaysia. kerana parti itu menghormati serta memahami '
 'keperluan sekolah vernakular dalam negara. Timbalan Presiden UMNO, Datuk '
 'Seri Mohamad Hasan berkata, kenyataan tersebut tidak mewakili pendirian '
 'serta pandangan UMNO .')
[11]:
r['cluster-top-words']
[11]:
['tugas presiden umno',
 'nazri',
 'vernakular',
 'menghormati',
 'tugas umno',
 'pendirian pandangan',
 'sekolah']
[12]:
r['score'][:20]
[12]:
[('Kenyataan', 0.07025715941848468),
 ('kontroversi', 0.07025715941848468),
 ('Setiausaha', 0.07025715941848468),
 ('Agung', 0.07025715941848468),
 ('Barisan', 0.07025715941848468),
 ('Nasional', 0.07025715941848468),
 ('(BN),', 0.07025715941848468),
 ('Datuk', 0.07025715941848468),
 ('Seri', 0.07025715941848468),
 ('Mohamed', 0.07025715941848468),
 ('Nazri', 0.07025715941848468),
 ('Aziz', 0.07025715941848468),
 ('berhubung', 0.07025715941848468),
 ('sekolah', 0.07025715941848468),
 ('vernakular', 0.07025715941848468),
 ('merupakan', 0.07025715941848468),
 ('pandangan', 0.07025715941848468),
 ('peribadi', 0.07025715941848468),
 ('beliau.', 0.07025715941848468),
 ('Timbalan', 0.11720420897327886)]
[13]:
r = model.sentence_level(isu_kerajaan, isi_penting = 'Mohamed Nazri')
pprint(r['summary'])
('Beliau turut menegaskan Mohamed Nazri telah mengambil pertanggungjawaban '
 'dengan membuat penjelasan maksud sebenarnya ucapanny di Semenyih, Selangor '
 'tersebut. Kata Nazri dalam kenyataannya itu, beliau menekankan bahawa semua '
 'pihak perlu menghormati hak orang Melayu dan bumiputera. Mohamed Nazri '
 'semalam menjelaskan, kenyataannya mengenai sekolah jenis kebangsaan Cina dan '
 'Tamil baru-baru ini disalah petik pihak media.')

Word level

This will predict scores for each words. This interface will not returned a summary, just score for each words.

def word_level(
    self,
    corpus,
    isi_penting: str = None,
    window_size: int = 10,
    important_words: int = 10,
    **kwargs
):
    """
    Summarize list of strings / string on word level.

    Parameters
    ----------
    corpus: str / List[str]
    isi_penting: str, optional (default=None)
        if not None, will put priority based on `isi_penting`.
    window_size: int, (default=10)
        window size for each word.
    important_words: int, (default=10)
        number of important words.

    Returns
    -------
    dict: {'top-words', 'cluster-top-words', 'score'}
    """
[14]:
r = model.word_level(isu_kerajaan, isi_penting = 'Mohamed Nazri')
r.keys()
[14]:
dict_keys(['top-words', 'cluster-top-words', 'score'])
[15]:
r['score'][:20]
[15]:
[('Kenyataan', 0.16809629126117476),
 ('kontroversi', 0.2133122956188781),
 ('Setiausaha', 0.2946152484378591),
 ('Agung', 0.3335993239450466),
 ('Barisan', 0.3779873115316621),
 ('Nasional', 0.4254942849807996),
 ('(BN),', 0.4402120384348302),
 ('Datuk', 0.4402120384348302),
 ('Seri', 0.4398985388456278),
 ('Mohamed', 0.42780575539932747),
 ('Nazri', 0.42780575539932747),
 ('Aziz', 0.41245035042151057),
 ('berhubung', 0.3879585108632802),
 ('sekolah', 0.37430313847686075),
 ('vernakular', 0.3727791362231256),
 ('merupakan', 0.3683025784505585),
 ('pandangan', 0.34671436914445564),
 ('peribadi', 0.32911022738895535),
 ('beliau.', 0.32911022738895535),
 ('Timbalan', 0.31232539921078645)]

Load Doc2Vec interface

Doc2Vec interface using WordVector Malaya.

def doc2vec(wordvector):
    """
    Doc2Vec interface for summarization.

    Parameters
    ----------
    wordvector : object
        malaya.wordvector.WordVector object.
        should have `get_vector_by_name` method.

    Returns
    -------
    result: malaya.model.extractive_summarization.Doc2Vec
    """
[16]:
vocab_news, embedded_news = malaya.wordvector.load_news()
w2v = malaya.wordvector.load(embedded_news, vocab_news)
WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/wordvector.py:120: The name tf.placeholder is deprecated. Please use tf.compat.v1.placeholder instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/wordvector.py:131: The name tf.InteractiveSession is deprecated. Please use tf.compat.v1.InteractiveSession instead.

[17]:
model = malaya.summarization.extractive.doc2vec(w2v)

Sentence level

This will predict scores for each sentences,

def sentence_level(
    self,
    corpus,
    isi_penting: str = None,
    top_k: int = 3,
    aggregation = np.mean,
    soft: bool = False,
    **kwargs
):
    """
    Summarize list of strings / string on sentence level.

    Parameters
    ----------
    corpus: str / List[str]
    isi_penting: str, optional (default=None)
        if not None, will put priority based on `isi_penting`.
    top_k: int, (default=3)
        number of summarized strings.
    aggregation: Callable, optional (default=numpy.mean)
        Aggregation method for Doc2Vec.
    soft: bool, optional (default=False)
        soft: bool, (default=True)
        if True, a word not in the dictionary will be replaced with nearest JaroWinkler ratio.
        if False, it will returned embedding full with zeros.

    Returns
    -------
    dict: {'summary', 'score'}
    """
[18]:
%%time

r = model.sentence_level(isu_kerajaan)
pprint(r['summary'])
('Mohamad yang menjalankan tugas-tugas Presiden UMNO berkata, UMNO konsisten '
 'dengan pendirian itu dalam mengiktiraf kepelbagaian bangsa dan etnik '
 'termasuk hak untuk beragama serta mendapat pendidikan. Kata Nazri dalam '
 'kenyataannya itu, beliau menekankan bahawa semua pihak perlu menghormati hak '
 'orang Melayu dan bumiputera. Kata beliau, komitmen UMNO dan BN berhubung '
 'perkara itu dapat dilihat dengan jelas dalam bentuk sokongan infrastruktur, '
 'pengiktirafan dan pemberian peruntukan yang diperlukan.')
CPU times: user 9.18 ms, sys: 1.64 ms, total: 10.8 ms
Wall time: 10.3 ms
[19]:
r['score'][:20]
[19]:
[('Kenyataan', 0.07027066163158477),
 ('kontroversi', 0.07027066163158477),
 ('Setiausaha', 0.07027066163158477),
 ('Agung', 0.07027066163158477),
 ('Barisan', 0.07027066163158477),
 ('Nasional', 0.07027066163158477),
 ('(BN),', 0.07027066163158477),
 ('Datuk', 0.07027066163158477),
 ('Seri', 0.07027066163158477),
 ('Mohamed', 0.07027066163158477),
 ('Nazri', 0.07027066163158477),
 ('Aziz', 0.07027066163158477),
 ('berhubung', 0.07027066163158477),
 ('sekolah', 0.07027066163158477),
 ('vernakular', 0.07027066163158477),
 ('merupakan', 0.07027066163158477),
 ('pandangan', 0.07027066163158477),
 ('peribadi', 0.07027066163158477),
 ('beliau.', 0.07027066163158477),
 ('Timbalan', 0.07037457887922696)]
[20]:
r = model.sentence_level(isu_kerajaan, isi_penting = 'Mohamed Nazri')
pprint(r['summary'])
('Mohamad yang menjalankan tugas-tugas Presiden UMNO berkata, UMNO konsisten '
 'dengan pendirian itu dalam mengiktiraf kepelbagaian bangsa dan etnik '
 'termasuk hak untuk beragama serta mendapat pendidikan. Kata Nazri dalam '
 'kenyataannya itu, beliau menekankan bahawa semua pihak perlu menghormati hak '
 'orang Melayu dan bumiputera. Kata beliau, komitmen UMNO dan BN berhubung '
 'perkara itu dapat dilihat dengan jelas dalam bentuk sokongan infrastruktur, '
 'pengiktirafan dan pemberian peruntukan yang diperlukan.')

Word level

This will predict scores for each words. This interface will not returned a summary, just score for each words.

def word_level(
    self,
    corpus,
    isi_penting: str = None,
    window_size: int = 10,
    aggregation = np.mean,
    soft: bool = False,
    **kwargs
):
    """
    Summarize list of strings / string on sentence level.

    Parameters
    ----------
    corpus: str / List[str]
    isi_penting: str, optional (default=None)
        if not None, will put priority based on `isi_penting`.
    window_size: int, (default=10)
        window size for each word.
    aggregation: Callable, optional (default=numpy.mean)
        Aggregation method for Doc2Vec.
    soft: bool, optional (default=False)
        soft: bool, (default=True)
        if True, a word not in the dictionary will be replaced with nearest JaroWinkler ratio.
        if False, it will returned embedding full with zeros.

    Returns
    -------
    dict: {'score'}
    """
[21]:
%%time

r = model.word_level(isu_string, window_size = 5)
r['score'][:20]
CPU times: user 71.7 ms, sys: 3.52 ms, total: 75.2 ms
Wall time: 72 ms
[21]:
[('DUA', 0.10217850225566492),
 ('legenda', 0.10256503728273535),
 ('hebat', 0.10135587890905765),
 ('dan', 0.10158261783201081),
 ("'The", 0.10185488894991031),
 ('living', 0.10207170990828254),
 ("legend'", 0.10205730536399951),
 ('ini', 0.10202961616004474),
 ('sudah', 0.10210986074917726),
 ('memartabatkan', 0.10203142215244121),
 ('bidang', 0.10433985839774515),
 ('muzik', 0.10437382317184496),
 ('sejak', 0.10437382707131633),
 ('lebih', 0.10444438297719007),
 ('tiga', 0.1044684279620556),
 ('dekad', 0.10444221573136775),
 ('lalu.', 0.10206875552003145),
 ('Jika', 0.10127214013691332),
 ('Datuk', 0.10122756975172667),
 ('Zainal', 0.10127912371730628)]

Load Encoder summarization

We leverage the power of deep encoder models like skip-thought or Transformer to do extractive summarization for us.

def encoder(vectorizer):
    """
    Encoder interface for summarization.

    Parameters
    ----------
    vectorizer : object
        encoder interface object, eg, BERT, skip-thought, XLNET, ALBERT, ALXLNET.
        should have `vectorize` method.

    Returns
    -------
    result: malaya.model.extractive_summarization.Encoder
    """
[22]:
lstm = malaya.summarization.extractive.deep_skipthought(model = 'lstm')
encoder = malaya.summarization.extractive.encoder(lstm)
WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/function/__init__.py:74: The name tf.gfile.GFile is deprecated. Please use tf.io.gfile.GFile instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/function/__init__.py:76: The name tf.GraphDef is deprecated. Please use tf.compat.v1.GraphDef instead.

WARNING:root:vectorizer model does not have `attention` method, `top-words` will not work

If we loaded an encoder model that do not have ``attention`` method, it will not returned ``top-words``.

[23]:
alxlnet = malaya.transformer.load(model = 'alxlnet')
encoder_alxlnet = malaya.summarization.extractive.encoder(alxlnet)
WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/alxlnet/xlnet.py:70: The name tf.gfile.Open is deprecated. Please use tf.io.gfile.GFile instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/alxlnet/xlnet.py:70: The name tf.gfile.Open is deprecated. Please use tf.io.gfile.GFile instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/alxlnet/xlnet.py:253: The name tf.variable_scope is deprecated. Please use tf.compat.v1.variable_scope instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/alxlnet/xlnet.py:253: The name tf.variable_scope is deprecated. Please use tf.compat.v1.variable_scope instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/alxlnet/xlnet.py:253: The name tf.AUTO_REUSE is deprecated. Please use tf.compat.v1.AUTO_REUSE instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/alxlnet/xlnet.py:253: The name tf.AUTO_REUSE is deprecated. Please use tf.compat.v1.AUTO_REUSE instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/alxlnet/modeling.py:697: The name tf.logging.info is deprecated. Please use tf.compat.v1.logging.info instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/alxlnet/modeling.py:697: The name tf.logging.info is deprecated. Please use tf.compat.v1.logging.info instead.

INFO:tensorflow:memory input None
INFO:tensorflow:memory input None
INFO:tensorflow:Use float type <dtype: 'float32'>
INFO:tensorflow:Use float type <dtype: 'float32'>
WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/alxlnet/modeling.py:704: The name tf.get_variable is deprecated. Please use tf.compat.v1.get_variable instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/alxlnet/modeling.py:704: The name tf.get_variable is deprecated. Please use tf.compat.v1.get_variable instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/alxlnet/modeling.py:809: dropout (from tensorflow.python.layers.core) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.dropout instead.
WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/alxlnet/modeling.py:809: dropout (from tensorflow.python.layers.core) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.dropout instead.
WARNING:tensorflow:From /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow_core/python/layers/core.py:271: Layer.apply (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version.
Instructions for updating:
Please use `layer.__call__` method instead.
WARNING:tensorflow:From /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow_core/python/layers/core.py:271: Layer.apply (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version.
Instructions for updating:
Please use `layer.__call__` method instead.
WARNING:tensorflow:
The TensorFlow contrib module will not be included in TensorFlow 2.0.
For more information, please see:
  * https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md
  * https://github.com/tensorflow/addons
  * https://github.com/tensorflow/io (for I/O related ops)
If you depend on functionality not listed there, please file an issue.

WARNING:tensorflow:
The TensorFlow contrib module will not be included in TensorFlow 2.0.
For more information, please see:
  * https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md
  * https://github.com/tensorflow/addons
  * https://github.com/tensorflow/io (for I/O related ops)
If you depend on functionality not listed there, please file an issue.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/alxlnet/modeling.py:109: dense (from tensorflow.python.layers.core) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.Dense instead.
WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/alxlnet/modeling.py:109: dense (from tensorflow.python.layers.core) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.Dense instead.
WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/alxlnet/__init__.py:95: The name tf.global_variables_initializer is deprecated. Please use tf.compat.v1.global_variables_initializer instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/alxlnet/__init__.py:95: The name tf.global_variables_initializer is deprecated. Please use tf.compat.v1.global_variables_initializer instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/alxlnet/__init__.py:96: The name tf.trainable_variables is deprecated. Please use tf.compat.v1.trainable_variables instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/alxlnet/__init__.py:96: The name tf.trainable_variables is deprecated. Please use tf.compat.v1.trainable_variables instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/alxlnet/__init__.py:100: The name tf.train.Saver is deprecated. Please use tf.compat.v1.train.Saver instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/alxlnet/__init__.py:100: The name tf.train.Saver is deprecated. Please use tf.compat.v1.train.Saver instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/alxlnet/__init__.py:103: The name tf.get_default_graph is deprecated. Please use tf.compat.v1.get_default_graph instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/alxlnet/__init__.py:103: The name tf.get_default_graph is deprecated. Please use tf.compat.v1.get_default_graph instead.

INFO:tensorflow:Restoring parameters from /Users/huseinzolkepli/Malaya/alxlnet-model/base/alxlnet-base/model.ckpt
INFO:tensorflow:Restoring parameters from /Users/huseinzolkepli/Malaya/alxlnet-model/base/alxlnet-base/model.ckpt

We also can load specific domain transformer, eg, sentiment, so our extractive summary more sensitive towards sentiment.

[24]:
alxlnet = malaya.sentiment.transformer(model = 'alxlnet', quantized = True)
encoder_sentiment = malaya.summarization.extractive.encoder(alxlnet)
WARNING:root:Load quantized model will cause accuracy drop.
WARNING:root:vectorizer model does not have `attention` method, `top-words` will not work

Sentence level

This will predict scores for each sentences,

def sentence_level(
    self,
    corpus,
    isi_penting: str = None,
    top_k: int = 3,
    important_words: int = 10,
    batch_size: int = 16,
    **kwargs
):
    """
    Summarize list of strings / string on sentence level.

    Parameters
    ----------
    corpus: str / List[str]
    isi_penting: str, optional (default=None)
        if not None, will put priority based on `isi_penting`.
    top_k: int, (default=3)
        number of summarized strings.
    important_words: int, (default=10)
        number of important words.
    batch_size: int, (default=16)
        for each feed-forward, we only feed N size of texts for each batch.
        This to prevent OOM.

    Returns
    -------
    dict: {'summary', 'top-words', 'cluster-top-words', 'score'}
    """
[25]:
%%time

r = encoder.sentence_level(isu_string, isi_penting = 'antarabangsa')
pprint(r['summary'])
('Bagi Sheila pula, dia memang ada terbabit dengan beberapa persembahan '
 'bersama Zainal cuma tiada publisiti ketika itu. "Sebab itu, saya sukar '
 'menolak untuk bekerjasama dengannya dalam Festival KL Jamm yang dianjurkan '
 'buat julung kali dan berkongsi pentas dalam satu konsert bertaraf '
 'antarabangsa," katanya. Mewakili golongan anak seni, Sheila menaruh harapan '
 'semoga Festival KL Jamm akan menjadi platform buat artis yang sudah ada nama '
 'dan artis muda untuk membuat persembahan, sekali gus sama-sama memartabatkan '
 'industri muzik tempatan.')
CPU times: user 400 ms, sys: 107 ms, total: 507 ms
Wall time: 347 ms
[26]:
%%time

r = encoder_alxlnet.sentence_level(isu_string, isi_penting = 'antarabangsa')
pprint(r['summary'])
('Bagi Sheila pula, dia memang ada terbabit dengan beberapa persembahan '
 'bersama Zainal cuma tiada publisiti ketika itu. "Kami pernah terbabit dengan '
 'showcase dan majlis korporat sebelum ini. Selain itu, Zainal juga terbabit '
 'dengan Konsert Legenda yang membabitkan jelajah empat lokasi sebelum ini.')
CPU times: user 45.9 s, sys: 3.49 s, total: 49.4 s
Wall time: 9.69 s
[27]:
%%time

r = encoder_sentiment.sentence_level(isu_string, isi_penting = 'antarabangsa')
pprint(r['summary'])
('"Rata-rata hanya sekadar menyanyi di laman Instagram dan cuma dikenali '
 'menerusi satu lagu. Namun, ada satu persamaan yang mengeratkan hubungan '
 'mereka kerana sama-sama mencintai bidang muzik sejak dulu. Justeru, '
 'bagaimana mereka mahu buat showcase kalau hanya dikenali dengan satu lagu"?')
CPU times: user 23.5 s, sys: 2.54 s, total: 26 s
Wall time: 6.65 s

Word level

This will predict scores for each words. This interface will not returned a summary, just score for each words.

def word_level(
    self,
    corpus,
    isi_penting: str = None,
    window_size: int = 10,
    important_words: int = 10,
    batch_size: int = 16,
    **kwargs
):
    """
    Summarize list of strings / string on word level.

    Parameters
    ----------
    corpus: str / List[str]
    isi_penting: str, optional (default=None)
        if not None, will put priority based on `isi_penting`.
    window_size: int, (default=10)
        window size for each word.
    important_words: int, (default=10)
        number of important words.
    batch_size: int, (default=16)
        for each feed-forward, we only feed N size of texts for each batch.
        This to prevent OOM.

    Returns
    -------
    dict: {'summary', 'top-words', 'cluster-top-words', 'score'}
    """
[29]:
%%time

r = encoder.word_level(isu_string)
r['score'][:20]
CPU times: user 2.21 s, sys: 125 ms, total: 2.33 s
Wall time: 540 ms
[29]:
[('DUA', 0.6887927),
 ('legenda', 0.66629106),
 ('hebat', 0.68231773),
 ('dan', 0.7088285),
 ("'The", 0.7100761),
 ('living', 0.7477336),
 ("legend'", 0.7506831),
 ('ini', 0.7550354),
 ('sudah', 0.7749422),
 ('memartabatkan', 0.68789077),
 ('bidang', 0.75334096),
 ('muzik', 0.77209735),
 ('sejak', 0.77883065),
 ('lebih', 0.75666404),
 ('tiga', 0.7756305),
 ('dekad', 0.77535397),
 ('lalu.', 0.7996583),
 ('Jika', 0.7532508),
 ('Datuk', 0.73633057),
 ('Zainal', 0.7388078)]
[32]:
%%time

r = encoder_alxlnet.word_level(isu_string)
r['score'][:20]
CPU times: user 3min 20s, sys: 21.3 s, total: 3min 41s
Wall time: 39.9 s
[32]:
[('DUA', 0.65859354),
 ('legenda', 0.67562085),
 ('hebat', 0.6850947),
 ('dan', 0.6763989),
 ("'The", 0.67380124),
 ('living', 0.68667483),
 ("legend'", 0.65132356),
 ('ini', 0.92398083),
 ('sudah', 0.90694207),
 ('memartabatkan', 0.9024261),
 ('bidang', 0.8732655),
 ('muzik', 0.56828856),
 ('sejak', 0.24973005),
 ('lebih', 0.27954298),
 ('tiga', 0.27266973),
 ('dekad', 0.83495057),
 ('lalu.', 0.9397317),
 ('Jika', 0.9280187),
 ('Datuk', 0.92466754),
 ('Zainal', 0.93014336)]
[33]:
%%time

r = encoder_sentiment.word_level(isu_string)
r['score'][:20]
CPU times: user 3min 33s, sys: 23.9 s, total: 3min 57s
Wall time: 42.6 s
[33]:
[('DUA', 0.7614572),
 ('legenda', 0.7729454),
 ('hebat', 0.7851631),
 ('dan', 0.838418),
 ("'The", 0.88925576),
 ('living', 0.5610372),
 ("legend'", 0.89473295),
 ('ini', 0.8995718),
 ('sudah', 0.87563884),
 ('memartabatkan', 0.8340343),
 ('bidang', 0.87825197),
 ('muzik', 0.867957),
 ('sejak', 0.8548101),
 ('lebih', 0.740687),
 ('tiga', 0.8771104),
 ('dekad', 0.89566004),
 ('lalu.', 0.7821031),
 ('Jika', 0.9377091),
 ('Datuk', 0.9417584),
 ('Zainal', 0.8979969)]