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 5.12 s, sys: 892 ms, total: 6.01 s
Wall time: 6.41 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')
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: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: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:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/function/__init__.py:69: The name tf.InteractiveSession is deprecated. Please use tf.compat.v1.InteractiveSession instead.
WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/function/__init__.py:69: The name tf.InteractiveSession is deprecated. Please use tf.compat.v1.InteractiveSession instead.
[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)]]