Abstractive HuggingFace#

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

Results generated using stochastic methods.

[1]:
import os

os.environ['CUDA_VISIBLE_DEVICES'] = ''
os.environ['TF_FORCE_GPU_ALLOW_GROWTH'] = 'true'
[2]:
%%time

import malaya
CPU times: user 3.23 s, sys: 3.54 s, total: 6.77 s
Wall time: 2.25 s

Why augmentation#

Let say you have a very limited labelled corpus, and you want to add more, but labelling is very costly.

So, text augmentation! We provided few augmentation interfaces in Malaya.

List available HuggingFace models#

[3]:
malaya.augmentation.abstractive.available_huggingface()
[3]:
Size (MB) BLEU SacreBLEU Verbose Suggested length
mesolitica/finetune-noisy-translation-t5-tiny-bahasa-cased-v2 139 60.000967 77.9/63.9/54.6/47.7 (BP = 1.000 ratio = 1.036 ... 256
mesolitica/finetune-noisy-translation-t5-small-bahasa-cased-v4 242 64.062582 80.1/67.7/59.1/52.5 (BP = 1.000 ratio = 1.042 ... 256
mesolitica/finetune-noisy-translation-t5-base-bahasa-cased-v2 892 64.583819 80.2/68.1/59.8/53.2 (BP = 1.000 ratio = 1.048 ... 256

Load HuggingFace model#

def huggingface(
    model: str = 'mesolitica/finetune-noisy-translation-t5-small-bahasa-cased-v4',
    lang: str = 'ms',
    force_check: bool = True,
    **kwargs,
):
    """
    Load HuggingFace model to abstractive text augmentation.

    Parameters
    ----------
    model: str, optional (default='mesolitica/finetune-noisy-translation-t5-small-bahasa-cased-v4')
        Check available models at `malaya.augmentation.abstractive.available_huggingface()`.
    lang: str, optional (default='ms')
        Input language, only accept `ms` or `en`.
    force_check: bool, optional (default=True)
        Force check model one of malaya model.
        Set to False if you have your own huggingface model.

    Returns
    -------
    result: malaya.torch_model.huggingface.Generator
    """

So you can choose either ms or en input language, for mixed language, it is save to choose both.

[4]:
model = malaya.augmentation.abstractive.huggingface(model = 'mesolitica/finetune-noisy-translation-t5-small-bahasa-cased-v4')

Generate#

def generate(self, strings: List[str], return_generate=False, **kwargs):
    """
    Generate texts from the input.

    Parameters
    ----------
    strings : List[str]
    **kwargs: vector arguments pass to huggingface `generate` method.
        Read more at https://huggingface.co/docs/transformers/main_classes/text_generation

    Returns
    -------
    result: List[str]
    """
[5]:
string = 'saya suka makan ayam dan ikan'
string2 = 'saya sebenarnya tak suka sangat dekat lelaki tu, ketiak masam sebab tak mandi'
string3 = 'Perdana Menteri berkata, beliau perlu memperoleh maklumat terperinci berhubung isu berkenaan sebelum kerajaan dapat mengambil sebarang tindakan lanjut. Bagaimanapun, beliau yakin masalah itu dapat diselesaikan dan pentadbiran kerajaan boleh berfungsi dengan baik.'
[6]:
model.generate([string, string2, string3], max_length = 256)
You're using a T5TokenizerFast tokenizer. Please note that with a fast tokenizer, using the `__call__` method is faster than using a method to encode the text followed by a call to the `pad` method to get a padded encoding.
[6]:
['Suka makan ayam ikan',
 'Aku sebenarnya tak suka sangat dekat lelaki tu, ketiak masam sebab tak mandi',
 'Perdana Menteri berkata, beliau perlu mendapatkan maklumat terperinci berhubung isu tersebut sebelum kerajaan dapat mengambil sebarang tindakan lanjut. Bagaimanapun, beliau yakin masalah tersebut dapat diselesaikan dan pentadbiran kerajaan dapat berfungsi dengan baik.']

Good thing about HuggingFace#

In generate method, you can do greedy, beam, sampling, nucleus decoder and so much more, read it at https://huggingface.co/blog/how-to-generate

[7]:
outputs = model.generate(['rakyat memang tak suka awak pun'],
                         max_length = 100, do_sample=True, top_k=100, top_p=0.95, temperature=0.7,
                         num_return_sequences=5)
outputs
[7]:
['Rakyat memang tak suka ko pun',
 'rakyat memang x suka u pun',
 'rakyat mmg xsuka ko pon',
 'rakyat mmg tak suka kau pun',
 'rakyat mmg x suka kau pun']
[7]:
outputs = model.generate([string, string2, string3],
                         max_length = 100, do_sample=True, top_k=100, top_p=0.95, temperature=0.7,
                         num_return_sequences=3)
outputs
[7]:
['suka nya makan ayam sama ikan',
 'Suka makan ayam ikan',
 'Suka dah mkn ayam ikan',
 'Aku sebenarnya tak berapa suka dekat lelaki tu, ketiak masam sbb aku tak mandi',
 'Aku sebenarnya tak suka sangat dekat laki tu, ketiak masam sbb tak mandi',
 'aku sebenarnya tak suka sangat dekat laki tu, ketiak masam sebab tak mandi',
 'Perdana Menteri berkata, beliau perlu memperoleh maklumat terperinci berkenaan isu tersebut sebelum kerajaan dapat mengambil sebarang tindakan lanjut. Bagaimanapun beliau yakin masalah itu dapat diselesaikan dan pentadbiran kerajaan dapat berfungsi dengan baik.',
 'Perdana Menteri berkata, beliau perlu mendapatkan maklumat terperinci tentang isu berkenaan sebelum kerajaan dapat mengambil sebarang tindakan lanjut. Walau apa pun beliau yakin masalah itu dapat diselesaikan dan pentadbiran kerajaan boleh berfungsi dengan baik.',
 'Perdana Menteri berkata, beliau perlu memperoleh maklumat yang terperinci mengenai isu tersebut sebelum kerajaan dapat mengambil sebarang tindakan lanjut. Walau bagaimanapun, beliau yakin masalah tersebut dapat diselesaikan dan pentadbiran kerajaan boleh berfungsi dengan baik.']

You can choose different generating method and still maintain the same polarity.

[8]:
strings = [
    'bodoh betul kerajaan ni, mana kebebasan bersuara',
    'Perbincangan khas itu juga bertujuan bagi Seri Paduka mendapat pandangan Raja-Raja Melayu untuk membolehkan baginda membuat keputusan yang terbaik demi kepentingan dan kesejahteraan negara serta rakyat',
    'semalam saya buka tv tengok berita, katanya ada tanah runtuh',
    'i hate him so much, perangai teruk!'
]
[9]:
outputs = model.generate(strings,
                         max_length = 100, do_sample=True, top_k=100, top_p=0.95, temperature=0.8,
                         num_return_sequences=3)
outputs
[9]:
['bodoh betul kerajaan ni, kebebasan bersuara mana',
 'Bodoh betul kerajaan ni, kebebasan bersuara mana',
 'kerajaan ni memang bodoh lah, mana kebebasan bersuara',
 'Ceramah khas pun bertujuan Seri Paduka Baginda ambil pandangan Raja2 Melayu untuk membolehkan baginda membuat keputusan yang terbaik demi kepentingan dan kesejahteraan negara serta rakyat',
 'Perbincangan khas juga bertujuan untuk Seri Paduka Baginda mendapat pandangan Raja2 Melayu bagi membolehkan Baginda membuat keputusan terbaik demi dan kesejahteraan negara dan rakyat',
 'Perbincangan khas juga bertujuan Seri Paduka Baginda mendapat pandangan Raja2 Melayu supaya membolehkan baginda membuat keputusan yang terbaik demi kepentingan dan kesejahteraan negara serta rakyat',
 'semalam bukak tv tengok berita, katanya ada rebah',
 'Semalam aku bukak tv tgk berita katanya ada resah',
 'semalam buka tv tengok berita rupanya ada tanah runtuh',
 'Aku benci dia sangat2, perangai teruk!',
 'Aku benci dia sangat2 ni, perangai tu teruk!',
 'i hate him so much, bad traits!']
[13]:
outputs = model.generate(strings,
                         max_length = 100, do_sample=True, penalty_alpha=0.9, top_k=4, temperature=0.9,
                         num_return_sequences=3)
outputs
[13]:
['Bodoh betul kerajaan ni, mana ada kebebasan bersuara',
 'Bodoh betul kerajaan ni, mana kebebasan bersuara',
 'bodoh betul kerajaan ni, mana kebebasan bersuara',
 'Perbincangan khas tersebut juga bertujuan Seri Paduka Baginda mendapat pandangan Raja2 Melayu bagi membolehkan beliau membuat keputusan yang terbaik demi dan kemakmuran negara dan rakyat',
 'Perbincangan khas itu juga bertujuan Seri Paduka Baginda mendapat pandangan Raja2 Melayu bagi membolehkan baginda membuat keputusan terbaik demi kepentingan dan kesejahteraan negara dan rakyat',
 'Perbincangan khas itu juga bertujuan bagi Seri Paduka Baginda mendapat view dari Raja2 Melayu untuk membolehkan baginda membuat keputusan terbaik demi kepentingan dan kesejahteraan negara dan rakyat',
 'semalam bukak tv tgk kb katanya ada tumbang',
 'semalam buka tv tgk berita, katanya ade sangkut2',
 'semalam bukak tv tgk berita, katanya ada tanah runtuh',
 'i benci dia sgt ni, perangai x elok!',
 'aku benci sangat dengan dia ni, perangai dah teruk tau!',
 'i hate it so much, bad behavior!']
[ ]: