Kesalahan Tatabahasa#

This tutorial is available as an IPython notebook at Malaya/example/tatabahasa.

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

[1]:
import logging

logging.basicConfig(level=logging.INFO)
[2]:
import malaya
from pprint import pprint
INFO:numexpr.utils:NumExpr defaulting to 8 threads.

List available Transformer models#

[3]:
malaya.tatabahasa.available_transformer()
INFO:malaya.tatabahasa:tested on 7.5k generated dataset at https://github.com/huseinzol05/malaya/blob/master/session/tatabahasa/t5/prepare-tatabahasa.ipynb
[3]:
Size (MB) Quantized Size (MB) WER
t5 1250.0 481.00 0.017890
small-t5 355.6 195.00 0.018797
tiny-t5 208.0 103.00 0.032804
super-tiny-t5 81.8 27.10 0.035114
3x-super-tiny-t5 18.3 4.46 0.036762

Load Transformer model#

def transformer(model: str = 'small-t5', quantized: bool = False, **kwargs):
    """
    Load Malaya transformer encoder-decoder model to correct a `kesalahan tatabahasa` text.

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

        * ``'t5'`` - T5 BASE parameters.
        * ``'small-t5'`` - T5 SMALL parameters.
        * ``'tiny-t5'`` - T5 TINY parameters.
        * ``'super-tiny-t5'`` - T5 SUPER TINY parameters.
        * ``'3x-super-tiny-t5'`` - T5 3X SUPER TINY 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 `t5` in model, will return `malaya.model.t5.Tatabahasa`.
    """
[3]:
model = malaya.tatabahasa.transformer(model = 'small-t5')
INFO:root:running kesalahan-tatabahasa/small-t5 using device /device:CPU:0

Predict using greedy decoder#

def greedy_decoder(self, strings: List[str]):
    """
    fix kesalahan tatabahasa.

    Parameters
    ----------
    strings: List[str]

    Returns
    -------
    result: List[str]
    """
[4]:
# https://ms.wikipedia.org/wiki/Bola_sepak
string = 'Pada amnya, hanya penjaga gol sahaja yang dibenarkan menyentuh bola dengan tangan di dalam kawasan golnya'
[5]:
model.greedy_decoder([string])
[5]:
['Pada amnya , hanya penjaga gol sahaja yang dibenarkan menyentuh bola dengan tangan di dalam kawasan golnya']

Now assumed we have kesalahan frasa nama, from penjaga gol become gol penjaga.

[6]:
# https://ms.wikipedia.org/wiki/Bola_sepak
string = 'Pada amnya, hanya gol penjaga sahaja yang dibenarkan menyentuh bola dengan tangan di dalam kawasan golnya'
[7]:
model.greedy_decoder([string])
[7]:
['Pada amnya , hanya penjaga gol sahaja yang dibenarkan menyentuh bola dengan tangan di dalam kawasan golnya']
[8]:
string = 'Sani mendapat markah yang tertinggi sekali.'
string1 = 'Hassan ialah peserta yang termuda sekali dalam pertandingan itu.'
model.greedy_decoder([string, string1])
[8]:
['Sani mendapat markah yang tertinggi .',
 'Hassan ialah peserta yang termuda dalam pertandingan itu .']
[19]:
string = 'Dia kata kepada saya.'
model.greedy_decoder([string])
[19]:
['Dia berkata kepada saya .']

More examples#

I just copy pasted from https://ms.wikipedia.org/wiki/Kesalahan_biasa_tatabahasa_Melayu

[11]:
string = 'Tidak ada apa yang mereka risaukan waktu itu.'
model.greedy_decoder([string])
[11]:
['Tidak ada apa yang mereka risaukan waktu itu .']
[12]:
string = 'Ayahnya setuju walaupun melanggar syarat yang dia sendiri menetapkan.'
model.greedy_decoder([string])
[12]:
['Ayahnya setuju walaupun melanggar syarat yang dia sendiri menetapkan .']
[14]:
string = 'Semuanya dia kenal.'
model.greedy_decoder([string])
[14]:
['Semuanya dia kenal .']
[15]:
string = 'Dia menjawab seperti disuruh-suruh oleh kuasa yang dia tidak tahu dari mana puncanya.'
model.greedy_decoder([string])
[15]:
['Dia menjawab seperti disuruh-suruh oleh kuasa yang dia tidak tahu dari mana puncanya .']
[16]:
string = 'Bola ini ditendang oleh saya.'
model.greedy_decoder([string])
[16]:
['Bola ini ditendang oleh saya .']
[17]:
string = 'Makanan ini kamu telah makan?'
model.greedy_decoder([string])
[17]:
['Makanan ini kamu telah makan .']
[18]:
string = 'Segala perubahan yang berlaku kita akan menghadapi sama-sama.'
model.greedy_decoder([string])
[18]:
['Segala perubahan yang berlaku kita akan menghadapi sama-sama .']
[20]:
string = 'Kakak saya sedang memasak gulai nangka. Dia menyenduk seketul nangka gulai dan menyuruh saya merasanya.'
model.greedy_decoder([string])
[20]:
['Kakak saya sedang memasak gulai nangka . Dia menyenduk seketul gulai nangka dan menyuruh saya merasanya .']
[22]:
string = 'Sally sedang membaca bila saya tiba di rumahnya.'
model.greedy_decoder([string])
[22]:
['Sally sedang membaca bila dia tiba di rumahnya .']
[23]:
string = 'Badannya besar kecuali kakinya kecil.'
model.greedy_decoder([string])
[23]:
['Badannya besar dan kakinya kecil .']
[24]:
string = 'Beribu peniaga tidak membayar cukai pendapatan.'
model.greedy_decoder([string])
[24]:
['Beribu peniaga tidak membayar cukai pendapatan .']
[25]:
string = 'Setengah remaja suka membuang masa di pasar raya.'
model.greedy_decoder([string])
[25]:
['Setengah remaja suka membuang masa di pasar raya .']
[26]:
string = 'Umar telah berpindah daripada sekolah ini bulan lalu.'
model.greedy_decoder([string])
[26]:
['Umar telah berpindah ke sekolah ini bulan lalu .']
[28]:
string = 'Para-para peserta sedang berbaris.'
model.greedy_decoder([string])
[28]:
['Para peserta sedang berbaris .']