Dependency Parsing HuggingFace
Contents
Dependency Parsing HuggingFace#
This tutorial is available as an IPython notebook at Malaya/example/dependency-huggingface.
This module only trained on standard language structure, so it is not save to use it for local language structure.
[1]:
import os
os.environ['CUDA_VISIBLE_DEVICES'] = ''
[2]:
import logging
logging.basicConfig(level=logging.INFO)
[3]:
%%time
import malaya
CPU times: user 3.31 s, sys: 3.3 s, total: 6.6 s
Wall time: 2.42 s
Describe supported dependencies#
[4]:
malaya.dependency.describe()
INFO:malaya_boilerplate.utils:you can read more from https://universaldependencies.org/treebanks/id_pud/index.html
[4]:
Tag | Description | |
---|---|---|
0 | acl | clausal modifier of noun |
1 | advcl | adverbial clause modifier |
2 | advmod | adverbial modifier |
3 | amod | adjectival modifier |
4 | appos | appositional modifier |
5 | aux | auxiliary |
6 | case | case marking |
7 | ccomp | clausal complement |
8 | compound | compound |
9 | compound:plur | plural compound |
10 | conj | conjunct |
11 | cop | cop |
12 | csubj | clausal subject |
13 | dep | dependent |
14 | det | determiner |
15 | fixed | multi-word expression |
16 | flat | name |
17 | iobj | indirect object |
18 | mark | marker |
19 | nmod | nominal modifier |
20 | nsubj | nominal subject |
21 | obj | direct object |
22 | parataxis | parataxis |
23 | root | root |
24 | xcomp | open clausal complement |
List available HuggingFace Dependency models#
[5]:
malaya.dependency.available_huggingface()
INFO:malaya.dependency:tested on test set at https://github.com/huseinzol05/malay-dataset/tree/master/parsing/dependency
[5]:
Size (MB) | Arc Accuracy | Types Accuracy | Root Accuracy | |
---|---|---|---|---|
mesolitica/finetune-dependency-t5-tiny-standard-bahasa-cased | 143.0 | 0.850607 | 0.783164 | 0.872302 |
mesolitica/finetune-dependency-t5-small-standard-bahasa-cased | 247.0 | 0.849405 | 0.783103 | 0.866906 |
mesolitica/finetune-dependency-t5-base-standard-bahasa-cased | 898.0 | 0.852892 | 0.784091 | 0.859712 |
Load HuggingFace dependency model#
def huggingface(
model: str = 'mesolitica/finetune-dependency-t5-small-standard-bahasa-cased',
force_check: bool = True,
**kwargs,
):
"""
Load HuggingFace model to dependency parsing.
Parameters
----------
model: str, optional (default='mesolitica/finetune-dependency-t5-small-standard-bahasa-cased')
Check available models at `malaya.dependency.available_huggingface()`.
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.Dependency
"""
[6]:
model = malaya.dependency.huggingface()
WARNING:malaya.dependency:`malaya.dependency.huggingface` trained on indonesian dataset and augmented dataset, not an actual malay dataset.
Predict#
def predict(
self,
string: str,
validate_tree: bool = False,
f_tree: Callable = eisner,
):
"""
Tag a string. We assumed the string input been properly tokenized.
Parameters
----------
string: str
validate_tree: bool, optional (default=False)
validate arcs is a valid tree using `malaya.parser.conll.CoNLL.istree`.
Originally from https://github.com/Unipisa/diaparser
f_tree: Callable, optional (default=malaya.parser.alg.eisner)
if arcs is not a tree, use approximate function to fix arcs.
Originally from https://github.com/Unipisa/diaparser
Returns
-------
result: Tuple
"""
[12]:
string = 'Dr Mahathir menasihati mereka supaya berhenti berehat dan tidur sebentar sekiranya mengantuk ketika memandu.'
[14]:
d_object, tagging, indexing = model.predict(string)
d_object.to_graphvis()
huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
To disable this warning, you can either:
- Avoid using `tokenizers` before the fork if possible
- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
[14]:
Harder example#
[9]:
# https://www.astroawani.com/berita-malaysia/terbaik-tun-kita-geng-najib-razak-puji-tun-m-297884
s = """
KUALA LUMPUR: Dalam hal politik, jarang sekali untuk melihat dua figura ini - bekas Perdana Menteri, Datuk Seri Najib Razak dan Tun Dr Mahathir Mohamad mempunyai 'pandangan yang sama' atau sekapal. Namun, situasi itu berbeza apabila melibatkan isu ketidakpatuhan terhadap prosedur operasi standard (SOP). Najib, yang juga Ahli Parlimen Pekan memuji sikap Ahli Parlimen Langkawi itu yang mengaku bersalah selepas melanggar SOP kerana tidak mengambil suhu badan ketika masuk ke sebuah surau di Langkawi pada Sabtu lalu.
"""
[10]:
d_object, tagging, indexing = model.predict(s)
d_object.to_graphvis()
huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
To disable this warning, you can either:
- Avoid using `tokenizers` before the fork if possible
- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
[10]:
Dependency graph object#
To initiate a dependency graph from dependency models, you need to call malaya.dependency.dependency_graph
.
[11]:
graph = malaya.dependency.dependency_graph(tagging, indexing)
graph
[11]:
<malaya.function.parse_dependency.DependencyGraph at 0x7f268bd2f3a0>
generate graphvis#
[12]:
graph.to_graphvis()
huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
To disable this warning, you can either:
- Avoid using `tokenizers` before the fork if possible
- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
[12]:
Get nodes#
[13]:
graph.nodes
[13]:
defaultdict(<function malaya.function.parse_dependency.DependencyGraph.__init__.<locals>.<lambda>()>,
{0: {'address': 0,
'word': None,
'lemma': None,
'ctag': 'TOP',
'tag': 'TOP',
'feats': None,
'head': None,
'deps': defaultdict(list, {'root': [26]}),
'rel': None},
1: {'address': 1,
'word': 'KUALA',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 26,
'deps': defaultdict(list, {'punct': [2], 'nmod': [4]}),
'rel': 'nsubj'},
26: {'address': 26,
'word': 'mempunyai',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 0,
'deps': defaultdict(list,
{'nsubj': [1],
'xcomp': [9],
'obj': [27],
'punct': [77]}),
'rel': 'root'},
2: {'address': 2,
'word': 'LUMPUR:',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 1,
'deps': defaultdict(list, {}),
'rel': 'punct'},
3: {'address': 3,
'word': 'Dalam',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 4,
'deps': defaultdict(list, {}),
'rel': 'case'},
4: {'address': 4,
'word': 'hal',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 1,
'deps': defaultdict(list, {'case': [3], 'punct': [5]}),
'rel': 'nmod'},
5: {'address': 5,
'word': 'politik,',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 4,
'deps': defaultdict(list, {}),
'rel': 'punct'},
6: {'address': 6,
'word': 'jarang',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 9,
'deps': defaultdict(list, {'advmod': [7]}),
'rel': 'advmod'},
9: {'address': 9,
'word': 'melihat',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 26,
'deps': defaultdict(list,
{'advmod': [6], 'case': [8], 'obj': [11]}),
'rel': 'xcomp'},
7: {'address': 7,
'word': 'sekali',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 6,
'deps': defaultdict(list, {}),
'rel': 'advmod'},
8: {'address': 8,
'word': 'untuk',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 9,
'deps': defaultdict(list, {}),
'rel': 'case'},
10: {'address': 10,
'word': 'dua',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 11,
'deps': defaultdict(list, {}),
'rel': 'nummod'},
11: {'address': 11,
'word': 'figura',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 9,
'deps': defaultdict(list,
{'nummod': [10],
'det': [12],
'punct': [13],
'compound:plur': [14]}),
'rel': 'obj'},
12: {'address': 12,
'word': 'ini',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 11,
'deps': defaultdict(list, {}),
'rel': 'det'},
13: {'address': 13,
'word': '-',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 11,
'deps': defaultdict(list, {}),
'rel': 'punct'},
14: {'address': 14,
'word': 'bekas',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 11,
'deps': defaultdict(list, {'flat': [15]}),
'rel': 'compound:plur'},
15: {'address': 15,
'word': 'Perdana',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 14,
'deps': defaultdict(list, {'flat': [16], 'conj': [22]}),
'rel': 'flat'},
16: {'address': 16,
'word': 'Menteri,',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 15,
'deps': defaultdict(list, {'flat': [17]}),
'rel': 'flat'},
17: {'address': 17,
'word': 'Datuk',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 16,
'deps': defaultdict(list, {'flat': [18]}),
'rel': 'flat'},
18: {'address': 18,
'word': 'Seri',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 17,
'deps': defaultdict(list, {'flat': [19]}),
'rel': 'flat'},
19: {'address': 19,
'word': 'Najib',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 18,
'deps': defaultdict(list, {'flat': [20]}),
'rel': 'flat'},
20: {'address': 20,
'word': 'Razak',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 19,
'deps': defaultdict(list, {}),
'rel': 'flat'},
21: {'address': 21,
'word': 'dan',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 22,
'deps': defaultdict(list, {}),
'rel': 'cc'},
22: {'address': 22,
'word': 'Tun',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 15,
'deps': defaultdict(list, {'cc': [21], 'flat': [23]}),
'rel': 'conj'},
23: {'address': 23,
'word': 'Dr',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 22,
'deps': defaultdict(list, {'flat': [24]}),
'rel': 'flat'},
24: {'address': 24,
'word': 'Mahathir',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 23,
'deps': defaultdict(list, {'flat': [25]}),
'rel': 'flat'},
25: {'address': 25,
'word': 'Mohamad',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 24,
'deps': defaultdict(list, {}),
'rel': 'flat'},
27: {'address': 27,
'word': "'pandangan",
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 26,
'deps': defaultdict(list, {'amod': [29], 'acl': [35]}),
'rel': 'obj'},
28: {'address': 28,
'word': 'yang',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 29,
'deps': defaultdict(list, {}),
'rel': 'nsubj'},
29: {'address': 29,
'word': "sama'",
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 27,
'deps': defaultdict(list, {'nsubj': [28]}),
'rel': 'amod'},
30: {'address': 30,
'word': 'atau',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 35,
'deps': defaultdict(list, {}),
'rel': 'cc'},
35: {'address': 35,
'word': 'berbeza',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 27,
'deps': defaultdict(list,
{'cc': [30],
'punct': [31],
'mark': [32],
'nsubj:pass': [33],
'advcl': [37]}),
'rel': 'acl'},
31: {'address': 31,
'word': 'sekapal.',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 35,
'deps': defaultdict(list, {}),
'rel': 'punct'},
32: {'address': 32,
'word': 'Namun,',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 35,
'deps': defaultdict(list, {}),
'rel': 'mark'},
33: {'address': 33,
'word': 'situasi',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 35,
'deps': defaultdict(list, {'det': [34]}),
'rel': 'nsubj:pass'},
34: {'address': 34,
'word': 'itu',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 33,
'deps': defaultdict(list, {}),
'rel': 'det'},
36: {'address': 36,
'word': 'apabila',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 37,
'deps': defaultdict(list, {}),
'rel': 'mark'},
37: {'address': 37,
'word': 'melibatkan',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 35,
'deps': defaultdict(list, {'mark': [36], 'obj': [38]}),
'rel': 'advcl'},
38: {'address': 38,
'word': 'isu',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 37,
'deps': defaultdict(list, {'compound': [39], 'nmod': [41]}),
'rel': 'obj'},
39: {'address': 39,
'word': 'ketidakpatuhan',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 38,
'deps': defaultdict(list, {}),
'rel': 'compound'},
40: {'address': 40,
'word': 'terhadap',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 41,
'deps': defaultdict(list, {}),
'rel': 'case'},
41: {'address': 41,
'word': 'prosedur',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 38,
'deps': defaultdict(list,
{'case': [40], 'compound': [42], 'acl': [51]}),
'rel': 'nmod'},
42: {'address': 42,
'word': 'operasi',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 41,
'deps': defaultdict(list, {'flat': [43]}),
'rel': 'compound'},
43: {'address': 43,
'word': 'standard',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 42,
'deps': defaultdict(list, {'flat': [44]}),
'rel': 'flat'},
44: {'address': 44,
'word': '(SOP).',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 43,
'deps': defaultdict(list, {'flat': [45]}),
'rel': 'flat'},
45: {'address': 45,
'word': 'Najib,',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 44,
'deps': defaultdict(list, {}),
'rel': 'flat'},
46: {'address': 46,
'word': 'yang',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 51,
'deps': defaultdict(list, {}),
'rel': 'obj'},
51: {'address': 51,
'word': 'memuji',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 41,
'deps': defaultdict(list,
{'obj': [46, 52], 'advmod': [47], 'nsubj': [48]}),
'rel': 'acl'},
47: {'address': 47,
'word': 'juga',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 51,
'deps': defaultdict(list, {}),
'rel': 'advmod'},
48: {'address': 48,
'word': 'Ahli',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 51,
'deps': defaultdict(list, {'flat': [49]}),
'rel': 'nsubj'},
49: {'address': 49,
'word': 'Parlimen',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 48,
'deps': defaultdict(list, {'flat': [50]}),
'rel': 'flat'},
50: {'address': 50,
'word': 'Pekan',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 49,
'deps': defaultdict(list, {}),
'rel': 'flat'},
52: {'address': 52,
'word': 'sikap',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 51,
'deps': defaultdict(list, {'flat': [53], 'acl': [58]}),
'rel': 'obj'},
53: {'address': 53,
'word': 'Ahli',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 52,
'deps': defaultdict(list, {'flat': [54]}),
'rel': 'flat'},
54: {'address': 54,
'word': 'Parlimen',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 53,
'deps': defaultdict(list, {'flat': [55]}),
'rel': 'flat'},
55: {'address': 55,
'word': 'Langkawi',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 54,
'deps': defaultdict(list, {'det': [56]}),
'rel': 'flat'},
56: {'address': 56,
'word': 'itu',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 55,
'deps': defaultdict(list, {}),
'rel': 'det'},
57: {'address': 57,
'word': 'yang',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 58,
'deps': defaultdict(list, {}),
'rel': 'nsubj'},
58: {'address': 58,
'word': 'mengaku',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 52,
'deps': defaultdict(list, {'nsubj': [57], 'xcomp': [59]}),
'rel': 'acl'},
59: {'address': 59,
'word': 'bersalah',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 58,
'deps': defaultdict(list, {'xcomp': [61]}),
'rel': 'xcomp'},
60: {'address': 60,
'word': 'selepas',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 61,
'deps': defaultdict(list, {}),
'rel': 'det'},
61: {'address': 61,
'word': 'melanggar',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 59,
'deps': defaultdict(list,
{'det': [60], 'obj': [62], 'advcl': [65]}),
'rel': 'xcomp'},
62: {'address': 62,
'word': 'SOP',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 61,
'deps': defaultdict(list, {}),
'rel': 'obj'},
63: {'address': 63,
'word': 'kerana',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 65,
'deps': defaultdict(list, {}),
'rel': 'mark'},
65: {'address': 65,
'word': 'mengambil',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 61,
'deps': defaultdict(list,
{'mark': [63],
'advmod': [64],
'obj': [66],
'advcl': [69]}),
'rel': 'advcl'},
64: {'address': 64,
'word': 'tidak',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 65,
'deps': defaultdict(list, {}),
'rel': 'advmod'},
66: {'address': 66,
'word': 'suhu',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 65,
'deps': defaultdict(list, {'compound': [67]}),
'rel': 'obj'},
67: {'address': 67,
'word': 'badan',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 66,
'deps': defaultdict(list, {}),
'rel': 'compound'},
68: {'address': 68,
'word': 'ketika',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 69,
'deps': defaultdict(list, {}),
'rel': 'mark'},
69: {'address': 69,
'word': 'masuk',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 65,
'deps': defaultdict(list, {'mark': [68]}),
'rel': 'advcl'},
70: {'address': 70,
'word': 'ke',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 73,
'deps': defaultdict(list, {'obl': [72, 74, 76]}),
'rel': 'case'},
73: {'address': 73,
'word': 'di',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 75,
'deps': defaultdict(list, {'case': [70]}),
'rel': 'case'},
71: {'address': 71,
'word': 'sebuah',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 72,
'deps': defaultdict(list, {}),
'rel': 'det'},
72: {'address': 72,
'word': 'surau',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 70,
'deps': defaultdict(list, {'det': [71]}),
'rel': 'obl'},
75: {'address': 75,
'word': 'pada',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 77,
'deps': defaultdict(list, {'case': [73]}),
'rel': 'case'},
74: {'address': 74,
'word': 'Langkawi',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 70,
'deps': defaultdict(list, {}),
'rel': 'obl'},
77: {'address': 77,
'word': 'lalu.',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 26,
'deps': defaultdict(list, {'case': [75]}),
'rel': 'punct'},
76: {'address': 76,
'word': 'Sabtu',
'lemma': '_',
'ctag': '_',
'tag': '_',
'feats': '_',
'head': 70,
'deps': defaultdict(list, {}),
'rel': 'obl'}})
Flat the graph#
[14]:
list(graph.triples())
[14]:
[(('mempunyai', '_'), 'nsubj', ('KUALA', '_')),
(('KUALA', '_'), 'punct', ('LUMPUR:', '_')),
(('KUALA', '_'), 'nmod', ('hal', '_')),
(('hal', '_'), 'case', ('Dalam', '_')),
(('hal', '_'), 'punct', ('politik,', '_')),
(('mempunyai', '_'), 'xcomp', ('melihat', '_')),
(('melihat', '_'), 'advmod', ('jarang', '_')),
(('jarang', '_'), 'advmod', ('sekali', '_')),
(('melihat', '_'), 'case', ('untuk', '_')),
(('melihat', '_'), 'obj', ('figura', '_')),
(('figura', '_'), 'nummod', ('dua', '_')),
(('figura', '_'), 'det', ('ini', '_')),
(('figura', '_'), 'punct', ('-', '_')),
(('figura', '_'), 'compound:plur', ('bekas', '_')),
(('bekas', '_'), 'flat', ('Perdana', '_')),
(('Perdana', '_'), 'flat', ('Menteri,', '_')),
(('Menteri,', '_'), 'flat', ('Datuk', '_')),
(('Datuk', '_'), 'flat', ('Seri', '_')),
(('Seri', '_'), 'flat', ('Najib', '_')),
(('Najib', '_'), 'flat', ('Razak', '_')),
(('Perdana', '_'), 'conj', ('Tun', '_')),
(('Tun', '_'), 'cc', ('dan', '_')),
(('Tun', '_'), 'flat', ('Dr', '_')),
(('Dr', '_'), 'flat', ('Mahathir', '_')),
(('Mahathir', '_'), 'flat', ('Mohamad', '_')),
(('mempunyai', '_'), 'obj', ("'pandangan", '_')),
(("'pandangan", '_'), 'amod', ("sama'", '_')),
(("sama'", '_'), 'nsubj', ('yang', '_')),
(("'pandangan", '_'), 'acl', ('berbeza', '_')),
(('berbeza', '_'), 'cc', ('atau', '_')),
(('berbeza', '_'), 'punct', ('sekapal.', '_')),
(('berbeza', '_'), 'mark', ('Namun,', '_')),
(('berbeza', '_'), 'nsubj:pass', ('situasi', '_')),
(('situasi', '_'), 'det', ('itu', '_')),
(('berbeza', '_'), 'advcl', ('melibatkan', '_')),
(('melibatkan', '_'), 'mark', ('apabila', '_')),
(('melibatkan', '_'), 'obj', ('isu', '_')),
(('isu', '_'), 'compound', ('ketidakpatuhan', '_')),
(('isu', '_'), 'nmod', ('prosedur', '_')),
(('prosedur', '_'), 'case', ('terhadap', '_')),
(('prosedur', '_'), 'compound', ('operasi', '_')),
(('operasi', '_'), 'flat', ('standard', '_')),
(('standard', '_'), 'flat', ('(SOP).', '_')),
(('(SOP).', '_'), 'flat', ('Najib,', '_')),
(('prosedur', '_'), 'acl', ('memuji', '_')),
(('memuji', '_'), 'obj', ('yang', '_')),
(('memuji', '_'), 'advmod', ('juga', '_')),
(('memuji', '_'), 'nsubj', ('Ahli', '_')),
(('Ahli', '_'), 'flat', ('Parlimen', '_')),
(('Parlimen', '_'), 'flat', ('Pekan', '_')),
(('memuji', '_'), 'obj', ('sikap', '_')),
(('sikap', '_'), 'flat', ('Ahli', '_')),
(('Ahli', '_'), 'flat', ('Parlimen', '_')),
(('Parlimen', '_'), 'flat', ('Langkawi', '_')),
(('Langkawi', '_'), 'det', ('itu', '_')),
(('sikap', '_'), 'acl', ('mengaku', '_')),
(('mengaku', '_'), 'nsubj', ('yang', '_')),
(('mengaku', '_'), 'xcomp', ('bersalah', '_')),
(('bersalah', '_'), 'xcomp', ('melanggar', '_')),
(('melanggar', '_'), 'det', ('selepas', '_')),
(('melanggar', '_'), 'obj', ('SOP', '_')),
(('melanggar', '_'), 'advcl', ('mengambil', '_')),
(('mengambil', '_'), 'mark', ('kerana', '_')),
(('mengambil', '_'), 'advmod', ('tidak', '_')),
(('mengambil', '_'), 'obj', ('suhu', '_')),
(('suhu', '_'), 'compound', ('badan', '_')),
(('mengambil', '_'), 'advcl', ('masuk', '_')),
(('masuk', '_'), 'mark', ('ketika', '_')),
(('mempunyai', '_'), 'punct', ('lalu.', '_')),
(('lalu.', '_'), 'case', ('pada', '_')),
(('pada', '_'), 'case', ('di', '_')),
(('di', '_'), 'case', ('ke', '_')),
(('ke', '_'), 'obl', ('surau', '_')),
(('surau', '_'), 'det', ('sebuah', '_')),
(('ke', '_'), 'obl', ('Langkawi', '_')),
(('ke', '_'), 'obl', ('Sabtu', '_'))]