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]:
%%time

import malaya
from pprint import pprint
CPU times: user 4.87 s, sys: 865 ms, total: 5.73 s
Wall time: 6.34 s

Model

Common Seq2Seq model, P(yt | X, yt-1), one step decoder will generate yt, and this required encoder output and output from last step decoder, yt-1.

So we improve the model to general tags also, P(yt, zt | X, yt-1, zt-1), one step decoder will generate yt and zt, and this required encoder output and outputs from last step decoder, yt-1 and zt-1.

We named this model as TransformerTag.

There is no paper produced for this model, feel free to write a paper about it, check out our implementation at https://github.com/huseinzol05/malaya/tree/master/session/tatabahasa

List available Transformer Tag models

[2]:
malaya.tatabahasa.available_transformer()
INFO:root:tested on 10k kesalahan tatabahasa texts.
[2]:
Size (MB) Quantized Size (MB) Sequence Accuracy Sequence Tagging Accuracy
small 397.0 100.0 0.860198 0.963267
base 875.0 220.0 0.938972 0.977407

Supported kesalahan tatabahasa

For full description, check out https://tatabahasabm.tripod.com/tata/salahtata.htm

[3]:
malaya.tatabahasa.describe()
[3]:
class Description salah betul
0 0 PAD
1 1 kesambungan subwords
2 2 tiada kesalahan
3 3 kesalahan frasa nama, Perkara yang diterangkan... Cili sos sos cili
4 4 kesalahan kata jamak mereka-mereka mereka
5 5 kesalahan kata penguat sangat tinggi sekali sangat tinggi
6 6 kata adjektif dan imbuhan "ter" tanpa penguat. Sani mendapat markah yang tertinggi sekali. Sani mendapat markah yang tertinggi.
7 7 kesalahan kata hubung Sally sedang membaca bila saya tiba di rumahnya. Sally sedang membaca apabila saya tiba di ruma...
8 8 kesalahan kata bilangan Beribu peniaga tidak membayar cukai pendapatan. Beribu-ribu peniaga tidak membayar cukai penda...
9 9 kesalahan kata sendi Umar telah berpindah daripada sekolah ini bula... Umar telah berpindah dari sekolah ini bulan lalu.
10 10 kesalahan penjodoh bilangan Setiap orang pelajar Setiap pelajar.
11 11 kesalahan kata ganti diri Pencuri itu telah ditangkap. Beliau dibawa ke ... Pencuri itu telah ditangkap. Dia dibawa ke bal...
12 12 kesalahan ayat pasif Cerpen itu telah dikarang oleh saya. Cerpen itu telah saya karang.
13 13 kesalahan kata tanya Kamu berasal dari manakah ? Kamu berasal dari mana ?
14 14 kesalahan tanda baca Kamu berasal dari manakah . Kamu berasal dari mana ?
15 15 kesalahan kata kerja tak transitif Dia kata kepada saya Dia berkata kepada saya
16 16 kesalahan kata kerja transitif Dia suka baca buku Dia suka membaca buku
17 17 penggunaan kata yang tidak tepat Tembuk Besar negeri Cina dibina oleh Shih Huan... Tembok Besar negeri Cina dibina oleh Shih Huan...

Right now we only able to predict up to 15 different kesalahan tatabahasa, hopefully in the future we can scale this up.

Load Transformer Tag model

[4]:
model = malaya.tatabahasa.transformer(model = 'base')

Load Quantized model

To load 8-bit quantized model, simply pass quantized = True, default is False.

We can expect slightly accuracy drop from quantized model, and not necessary faster than normal 32-bit float model, totally depends on machine.

[5]:
quantized_model = malaya.tatabahasa.transformer(model = 'base', quantized = True)
WARNING:root:Load quantized model will cause accuracy drop.

Predict using greedy decoder

def greedy_decoder(self, strings: List[str]):
    """
    Fix kesalahan tatatabahasa.

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

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

For TransformerTag model, right now only supported greedy_decoder method.

Randomly picked string in bahasa melayu wikipedia.

[6]:
# https://ms.wikipedia.org/wiki/Bola_sepak
string = 'Pada amnya, hanya penjaga gol sahaja yang dibenarkan menyentuh bola dengan tangan di dalam kawasan golnya'
[7]:
model.greedy_decoder([string])
[7]:
[[('Pada', 2),
  ('amnya,', 2),
  ('hanya', 2),
  ('penjaga', 2),
  ('gol', 2),
  ('sahaja', 2),
  ('yang', 2),
  ('dibenarkan', 2),
  ('menyentuh', 2),
  ('bola', 2),
  ('dengan', 2),
  ('tangan', 2),
  ('di', 2),
  ('dalam', 2),
  ('kawasan', 2),
  ('golnya', 2)]]

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

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

with open('tests/dataset-tatabahasa.pkl', 'rb') as fopen:
    test_set = pickle.load(fopen)

len(test_set)
[12]:
100
[13]:
def get_xy(row):
    x, y, tag = [], [], []

    for i in range(len(row[0])):
        t = [row[0][i][0]]
        y.extend(t)
        t = [row[1][i][0]]
        x.extend(t)
        tag.extend([row[1][i][1]] * len(t))

    return ' '.join(x), ' '.join(y), tag
[14]:
x, y, t = get_xy(test_set[0])
x, y, t
[14]:
('Dirk Jan Klaas " Klaas-Jan " Huntelaar ( lahir 12 Ogos 1983 ) merupakan pemain bola sepak Belanda yang bermain seperti posisi penyerang !',
 'Dirk Jan Klaas " Klaas-Jan " Huntelaar ( lahir 12 Ogos 1983 ) merupakan pemain bola sepak Belanda yang bermain di posisi penyerang .',
 [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9, 2, 2, 14])
[15]:
model.greedy_decoder([x])
[15]:
[[('Dirk', 2),
  ('Jan', 2),
  ('Klaas', 2),
  ('"', 2),
  ('Klaas-Jan', 2),
  ('"', 2),
  ('Huntelaar', 2),
  ('(', 2),
  ('lahir', 2),
  ('12', 2),
  ('Ogos', 2),
  ('1983', 2),
  (')', 2),
  ('merupakan', 2),
  ('pemain', 2),
  ('bola', 2),
  ('sepak', 2),
  ('Belanda', 2),
  ('yang', 2),
  ('bermain', 2),
  ('di', 9),
  ('posisi', 2),
  ('penyerang', 2),
  ('.', 14)]]
[16]:
quantized_model.greedy_decoder([x])
[16]:
[[('Dirk', 2),
  ('Jan', 2),
  ('Klaas', 2),
  ('"', 2),
  ('Klaas-Jan', 2),
  ('"', 2),
  ('Huntelaar', 2),
  ('(', 2),
  ('lahir', 2),
  ('12', 2),
  ('Ogos', 2),
  ('1983', 2),
  (')', 2),
  ('merupakan', 2),
  ('pemain', 2),
  ('bola', 2),
  ('sepak', 2),
  ('Belanda', 2),
  ('yang', 2),
  ('bermain', 2),
  ('di', 9),
  ('posisi', 2),
  ('penyerang', 2),
  ('.', 14)]]
[17]:
x, y, t = get_xy(test_set[-1])
x, y, t
[17]:
('Pada tahun 2002 , kedua-dua gol beliau menduduki tempat ke-6 dalam 100 Greatest Sporting Moments oleh saluran Channel 4 UK .',
 'Pada tahun 2002 , kedua-dua gol ini menduduki tempat ke-6 dalam 100 Greatest Sporting Moments oleh saluran Channel 4 UK .',
 [2, 2, 2, 2, 2, 2, 11, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
[18]:
model.greedy_decoder([x])
[18]:
[[('Pada', 2),
  ('tahun', 2),
  ('2002', 2),
  (',', 2),
  ('kedua-dua', 2),
  ('gol', 2),
  ('beliau', 2),
  ('menduduki', 2),
  ('tempat', 2),
  ('ke-6', 2),
  ('dalam', 2),
  ('100', 2),
  ('Greatest', 2),
  ('Sporting', 2),
  ('Moments', 2),
  ('oleh', 2),
  ('saluran', 2),
  ('Channel', 2),
  ('4', 2),
  ('UK', 2),
  ('.', 2)]]
[19]:
x, y, t = get_xy(test_set[-2])
x, y, t
[19]:
('Gol inilah yang bergelar Goal of the Century dengan undian Internet 2000 sejak FIFA .',
 'Gol inilah yang bergelar Goal of the Century di undian Internet 2000 oleh FIFA .',
 [2, 2, 2, 2, 2, 2, 2, 2, 9, 2, 2, 2, 9, 2, 2])
[20]:
model.greedy_decoder([x])
[20]:
[[('Gol', 2),
  ('inilah', 2),
  ('yang', 2),
  ('bergelar', 2),
  ('Goal', 2),
  ('of', 2),
  ('the', 2),
  ('Century', 2),
  ('dengan', 2),
  ('undian', 2),
  ('Internet', 2),
  ('2000', 2),
  ('sejak', 2),
  ('FIFA', 2),
  ('.', 2)]]
[21]:
x, y, t = get_xy(test_set[-3])
x, y, t
[21]:
('Beliau mengambil bola dalam kawasan kepul diri lalu pusing dan luru lebih separuh padang sambil menyentuh bola 11 kali , memintas lima pemain England : ( Glenn Hoddle , Peter Reid , Kenny Sansom , Terry Butcher , dan Terry Fenwick ) serta penjaga gawang Peter Shilton .',
 'Beliau mengambil bola di kawasan pasukan diri lalu berpusing-pusing dan meluru lebih separuh padang sambil menyentuh bola 11 kali , memintas lima pemain England : ( Glenn Hoddle , Peter Reid , Kenny Sansom , Terry Butcher , dan Terry Fenwick ) serta penjaga gawang Peter Shilton .',
 [2,
  2,
  2,
  9,
  2,
  10,
  2,
  2,
  15,
  2,
  15,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2,
  2])
[22]:
model.greedy_decoder([x])
[22]:
[[('Beliau', 2),
  ('mengambil', 2),
  ('bola', 2),
  ('dari', 9),
  ('kawasan', 2),
  ('kaki', 10),
  ('diri', 2),
  ('lalu', 2),
  ('berpusing', 15),
  ('dan', 2),
  ('meluru', 15),
  ('lebih', 2),
  ('separuh', 2),
  ('padang', 2),
  ('sambil', 2),
  ('menyentuh', 2),
  ('bola', 2),
  ('11', 2),
  ('kali', 2),
  (',', 2),
  ('memintas', 2),
  ('lima', 2),
  ('pemain', 2),
  ('England', 2),
  (':', 2),
  ('(', 2),
  ('Glenn', 2),
  ('Hoddle', 2),
  (',', 2),
  ('Peter', 2),
  ('Reid', 2),
  (',', 2),
  ('Kenny', 2),
  ('Sansom', 2),
  (',', 2),
  ('Terry', 2),
  ('Butcher', 2),
  (',', 2),
  ('dan', 2),
  ('Terry', 2),
  ('Fenwick', 2),
  (')', 2),
  ('serta', 2),
  ('penjaga', 2),
  ('gawang', 2),
  ('Peter', 2),
  ('Shilton', 2),
  ('.', 2)]]
[24]:
quantized_model.greedy_decoder([x])
[24]:
[[('Beliau', 2),
  ('mengambil', 2),
  ('bola', 2),
  ('dari', 9),
  ('kawasan', 2),
  ('kaki', 10),
  ('diri', 2),
  ('lalu', 2),
  ('berpusing', 15),
  ('dan', 2),
  ('meluru', 15),
  ('lebih', 2),
  ('separuh', 2),
  ('padang', 2),
  ('sambil', 2),
  ('menyentuh', 2),
  ('bola', 2),
  ('11', 2),
  ('kali', 2),
  (',', 2),
  ('memintas', 2),
  ('lima', 2),
  ('pemain', 2),
  ('England', 2),
  (':', 2),
  ('(', 2),
  ('Glenn', 2),
  ('Hoddle', 2),
  (',', 2),
  ('Peter', 2),
  ('Reid', 2),
  (',', 2),
  ('Kenny', 2),
  ('Sansom', 2),
  (',', 2),
  ('Terry', 2),
  ('Butcher', 2),
  (',', 2),
  ('dan', 2),
  ('Terry', 2),
  ('Fenwick', 2),
  (')', 2),
  ('serta', 2),
  ('penjaga', 2),
  ('gawang', 2),
  ('Peter', 2),
  ('Shilton', 2),
  ('.', 2)]]