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.3 s, sys: 3.22 s, total: 6.51 s
Wall time: 2.36 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 61.2 0.84929 0.8281 0.92099
mesolitica/finetune-dependency-t5-small-standard-bahasa-cased 61.2 0.84929 0.8281 0.92099
mesolitica/finetune-dependency-t5-base-standard-bahasa-cased 61.2 0.84929 0.8281 0.92099

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]:
_images/load-dependency-huggingface_14_1.svg

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]:
_images/load-dependency-huggingface_17_1.svg

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]:
_images/load-dependency-huggingface_21_1.svg

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', '_'))]

Check the graph contains cycles#

[18]:
graph.contains_cycle()
[18]:
False