Knowledge Graph Triples#

Generate MS text -> EN Knowledge Graph Triples format.

This tutorial is available as an IPython notebook at Malaya/example/knowledge-graph-triples.

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

import malaya
INFO:numexpr.utils:NumExpr defaulting to 8 threads.
CPU times: user 5.04 s, sys: 723 ms, total: 5.76 s
Wall time: 5.34 s

List available Transformer model#

[3]:
malaya.knowledge_graph.available_transformer()
INFO:malaya.knowledge_graph:tested on translated KELM test set at https://github.com/huseinzol05/malaya-graph/tree/master/data/kelm
[3]:
Size (MB) Quantized Size (MB) BLEU Suggested length
t5 1250.0 481.0 0.919301 256.0
small-t5 355.6 195.0 0.910234 512.0
tiny-t5 208.0 103.0 0.933374 256.0

Load Transformer model#

def transformer(model: str = 'small-t5', quantized: bool = False, **kwargs):
    """
    Load transformer to generate knowledge graphs in triples format from texts,
    MS text -> EN triples format.

    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.

    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: malaya.model.t5.KnowledgeGraph class
    """
[3]:
model = malaya.knowledge_graph.transformer(model = 'small-t5')
INFO:root:running knowledge-graph-triplet/small-t5 using device /device:CPU:0

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.

[4]:
quantized_model = malaya.knowledge_graph.transformer(model = 'small-t5', quantized = True)
WARNING:root:Load quantized model will cause accuracy drop.
INFO:root:running knowledge-graph-triplet/small-t5-quantized using device /device:CPU:0
[5]:
string1 = "Yang Berhormat Dato Sri Haji Mohammad Najib bin Tun Haji Abdul Razak ialah ahli politik Malaysia dan merupakan bekas Perdana Menteri Malaysia ke-6 yang mana beliau menjawat jawatan dari 3 April 2009 hingga 9 Mei 2018. Beliau juga pernah berkhidmat sebagai bekas Menteri Kewangan dan merupakan Ahli Parlimen Pekan Pahang"
string2 = "Pahang ialah negeri yang ketiga terbesar di Malaysia Terletak di lembangan Sungai Pahang yang amat luas negeri Pahang bersempadan dengan Kelantan di utara Perak Selangor serta Negeri Sembilan di barat Johor di selatan dan Terengganu dan Laut China Selatan di timur."

Predict using greedy decoder#

def greedy_decoder(
        self,
        strings: List[str],
        get_networkx: bool = True,
    ):
        """
        Generate triples knowledge graph using greedy decoder.
        Example, "Joseph Enanga juga bermain untuk Union Douala." -> "Joseph Enanga member of sports team Union Douala"

        Parameters
        ----------
        strings: List[str]
        get_networkx: bool, optional (default=True)
            If True, will generate networkx.MultiDiGraph.

        Returns
        -------
        result: List[Dict]
        """
[6]:
r = model.greedy_decoder([string1, string2])
[7]:
r[0]
[7]:
{'result': [{'subject': 'Dato Sri Haji Mohammad Najib bin Tun Haji Abdul Razak',
   'relation': 'occupation',
   'object': 'Politician'},
  {'subject': 'Dato Sri Haji Mohammad Najib bin Tun Haji Abdul Razak',
   'relation': 'country of citizenship',
   'object': 'Malaysia'},
  {'subject': 'Dato Sri Haji Mohammad Najib bin Tun Haji Abdul Razak',
   'relation': 'occupation',
   'object': 'Finance minister'},
  {'subject': 'Dato Sri Haji Mohammad Najib bin Tun Haji Abdul Razak',
   'relation': 'position held',
   'object': 'Member of the Pahang Town Parliament'},
  {'subject': 'Dato Sri Haji Mohammad Najib bin Tun Haji Abdul Razak',
   'relation': 'occupation',
   'object': 'Prime Minister of Malaysia'},
  {'subject': 'Dato Sri Haji Mohammad Najib bin Tun Haji Abdul Razak',
   'relation': 'work period (start)',
   'object': '03 April 2009'}],
 'main_object': 'Dato Sri Haji Mohammad Najib bin Tun Haji Abdul Razak',
 'triple': 'Dato Sri Haji Mohammad Najib bin Tun Haji Abdul Razak occupation Politician, country of citizenship Malaysia, occupation Finance minister, position held Member of the Pahang Town Parliament, occupation Prime Minister of Malaysia, work period (start) 03 April 2009.',
 'G': <networkx.classes.multidigraph.MultiDiGraph at 0x17c3067d0>}
[10]:
import matplotlib.pyplot as plt
import networkx as nx

g = r[0]['G']
plt.figure(figsize=(6, 6))
pos = nx.spring_layout(g)
nx.draw(g, with_labels=True, node_color='skyblue', edge_cmap=plt.cm.Blues, pos = pos)
nx.draw_networkx_edge_labels(g, pos=pos)
plt.show()
_images/load-knowledge-graph-triples_15_0.png
[11]:
g = r[1]['G']
plt.figure(figsize=(6, 6))
pos = nx.spring_layout(g)
nx.draw(g, with_labels=True, node_color='skyblue', edge_cmap=plt.cm.Blues, pos = pos)
nx.draw_networkx_edge_labels(g, pos=pos)
plt.show()
_images/load-knowledge-graph-triples_16_0.png
[12]:
# https://ms.wikipedia.org/wiki/Malaysia

string = """
Malaysia secara rasminya Persekutuan Malaysia ialah sebuah negara raja berperlembagaan persekutuan di Asia Tenggara yang terdiri daripada tiga belas negeri dan tiga wilayah persekutuan, yang menduduki bumi berkeluasan 330,803 kilometer persegi (127,720 bt2). Malaysia terbahagi kepada dua kawasan yang mengapit Laut China Selatan, iaitu Semenanjung Malaysia dan Borneo Malaysia (juga Malaysia Barat dan Timur). Malaysia berkongsi sempadan darat dengan Thailand, Indonesia, dan Brunei dan juga sempadan laut dengan Singapura dan Filipina. Ibu negara Malaysia ialah Kuala Lumpur, manakala Putrajaya merupakan pusat kerajaan persekutuan. Pada tahun 2009, Malaysia diduduki oleh 28 juta penduduk dan pada tahun 2017 dianggarkan telah mencecah lebih 30 juta orang yang menduduki di Malaysia.

Malaysia berakar-umbikan Kerajaan-kerajaan Melayu yang wujud di wilayahnya dan menjadi taklukan Empayar British sejak abad ke-18. Wilayah British pertama di sini dikenali sebagai Negeri-Negeri Selat. Semenanjung Malaysia yang ketika itu dikenali sebagai Tanah Melayu atau Malaya, mula-mula disatukan di bawah komanwel pada tahun 1946, sebelum menjadi Persekutuan Tanah Melayu pada tahun 1948. Pada tahun 1957 Semenanjung Malaysia mencapai Kemerdekaan dan bebas daripada penjajah dan sekali gus menjadi catatan sejarah terpenting bagi Malaysia. Pada tahun 1963, Tanah Melayu bersatu bersama dengan negara Sabah, Sarawak, dan Singapura bagi membentuk Malaysia. Pada tahun 1965, Singapura keluar dari persekutuan untuk menjadi negara kota yang bebas. Semenjak itu, Malaysia menikmati antara ekonomi yang terbaik di Asia, dengan purata pertumbuhan keluaran dalam negara kasarnya (KDNK) kira-kira 6.5% selama 50 tahun pertama kemerdekaannya.

Ekonomi negara yang selama ini dijana oleh sumber alamnya kini juga berkembang dalam sektor-sektor ukur tanah, sains, kejuruteraan, pendidikan, pelancongan, perkapalan, perdagangan dan perubatan.

Ketua negara Malaysia ialah Yang di-Pertuan Agong, iaitu raja elektif yang terpilih dan diundi dari kalangan sembilan raja negeri Melayu. Ketua kerajaannya pula ialah Perdana Menteri. Sistem kerajaan Malaysia banyak berdasarkan sistem parlimen Westminster, dan sistem perundangannya juga berasaskan undang-undang am Inggeris.

Malaysia terletak berdekatan dengan khatulistiwa dan beriklim tropika, serta mempunyai kepelbagaian flora dan fauna, sehingga diiktiraf menjadi salah satu daripada 17 negara megadiversiti. Di Malaysia terletaknya Tanjung Piai, titik paling selatan di seluruh tanah besar Eurasia. Malaysia ialah sebuah negara perintis Persatuan Negara-Negara Asia Tenggara dan Pertubuhan Persidangan Islam, dan juga anggota Kerjasama Ekonomi Asia-Pasifik, Negara-Negara Komanwel, dan Pergerakan Negara-Negara Berkecuali.
"""
[13]:
def simple_cleaning(string):
    return ''.join([s for s in string if s not in ',.\'";'])

string = malaya.text.function.split_into_sentences(string)
string = [simple_cleaning(s) for s in string if len(s) > 50]
string
[13]:
['Malaysia secara rasminya Persekutuan Malaysia ialah sebuah negara raja berperlembagaan persekutuan di Asia Tenggara yang terdiri daripada tiga belas negeri dan tiga wilayah persekutuan yang menduduki bumi berkeluasan 330803 kilometer persegi (127720 bt2)',
 'Malaysia terbahagi kepada dua kawasan yang mengapit Laut China Selatan iaitu Semenanjung Malaysia dan Borneo Malaysia (juga Malaysia Barat dan Timur)',
 'Malaysia berkongsi sempadan darat dengan Thailand Indonesia dan Brunei dan juga sempadan laut dengan Singapura dan Filipina',
 'Ibu negara Malaysia ialah Kuala Lumpur manakala Putrajaya merupakan pusat kerajaan persekutuan Pada tahun 2009 Malaysia diduduki oleh 28 juta penduduk dan pada tahun 2017 dianggarkan telah mencecah lebih 30 juta orang yang menduduki di Malaysia',
 'Malaysia berakar-umbikan Kerajaan-kerajaan Melayu yang wujud di wilayahnya dan menjadi taklukan Empayar British sejak abad ke-18',
 'Wilayah British pertama di sini dikenali sebagai Negeri-Negeri Selat',
 'Semenanjung Malaysia yang ketika itu dikenali sebagai Tanah Melayu atau Malaya mula-mula disatukan di bawah komanwel pada tahun 1946 sebelum menjadi Persekutuan Tanah Melayu pada tahun 1948',
 'Pada tahun 1957 Semenanjung Malaysia mencapai Kemerdekaan dan bebas daripada penjajah dan sekali gus menjadi catatan sejarah terpenting bagi Malaysia',
 'Pada tahun 1963 Tanah Melayu bersatu bersama dengan negara Sabah Sarawak dan Singapura bagi membentuk Malaysia',
 'Pada tahun 1965 Singapura keluar dari persekutuan untuk menjadi negara kota yang bebas',
 'Semenjak itu Malaysia menikmati antara ekonomi yang terbaik di Asia dengan purata pertumbuhan keluaran dalam negara kasarnya (KDNK) kira-kira 65% selama 50 tahun pertama kemerdekaannya',
 'Ekonomi negara yang selama ini dijana oleh sumber alamnya kini juga berkembang dalam sektor-sektor ukur tanah sains kejuruteraan pendidikan pelancongan perkapalan perdagangan dan perubatan',
 'Ketua negara Malaysia ialah Yang di-Pertuan Agong iaitu raja elektif yang terpilih dan diundi dari kalangan sembilan raja negeri Melayu',
 'Sistem kerajaan Malaysia banyak berdasarkan sistem parlimen Westminster dan sistem perundangannya juga berasaskan undang-undang am Inggeris',
 'Malaysia terletak berdekatan dengan khatulistiwa dan beriklim tropika serta mempunyai kepelbagaian flora dan fauna sehingga diiktiraf menjadi salah satu daripada 17 negara megadiversiti',
 'Di Malaysia terletaknya Tanjung Piai titik paling selatan di seluruh tanah besar Eurasia',
 'Malaysia ialah sebuah negara perintis Persatuan Negara-Negara Asia Tenggara dan Pertubuhan Persidangan Islam dan juga anggota Kerjasama Ekonomi Asia-Pasifik Negara-Negara Komanwel dan Pergerakan Negara-Negara Berkecuali']
[14]:
r = model.greedy_decoder(string)
[15]:
g = r[0]['G']

for i in range(1, len(r), 1):
    g.update(r[i]['G'])
[16]:
plt.figure(figsize=(17, 17))
pos = nx.spring_layout(g)
nx.draw(g, with_labels=True, node_color='skyblue', edge_cmap=plt.cm.Blues, pos = pos)
nx.draw_networkx_edge_labels(g, pos=pos)
plt.show()
_images/load-knowledge-graph-triples_21_0.png
[17]:
# https://www.utusan.com.my/terkini/2021/07/agong-dukacita-ketua-pembangkang-tuntut-pm-letak-jawatan/
# https://www.hmetro.com.my/mutakhir/2021/07/736206/kediaman-pm-jadi-tumpuan-media

string = """
KUALA LUMPUR: Ketua Pembangkang, Datuk Seri Anwar Ibrahim menggesa Perdana Menteri, Tan Sri Muhyiddin Yassin meletak jawatan susulan kenyataan dikeluarkan Istana Negara berhubung isu Proklamasi Darurat.

“Ini menunjukkan Kabinet yang diketuai Tan Sri Muhyiddin melanggar Perlembagaan menghina instusi raja Perlembagaan termasuk menteri di Jabatan Perdana Menteri mengelirukan Dewan.

“Oleh yang demikian, kita menuntut Perdana Menteri meletak jawatan,” ujarnya hari ini.

Terdahulu, Yang di-Pertuan Agong, Al-Sultan Abdullah Ri’ayatuddin Al-Mustafa Billah Shah menzahirkan rasa dukacita dengan pengumuman pembatalan darurat di Parlimen.

Perkara itu dimaklumkan Datuk Pengelola Bijaya Diraja Istana Negara, Datuk Indera Ahmad Fadil Shamsudddin dalam satu kenyataan hari ini.

“Sehubungan dengan itu, Seri Paduka Baginda menzahirkan rasa amat dukacita dengan kenyataan yang telah dibuat pada 26 Julai, 2021 lalu bahawa kerajaan telah membatalkan semua Ordinan Darurat yang telah dimasyhurkan oleh Baginda sepanjang tempoh darurat walhal belum lagi diperkenan baginda,” katanya.

Kuala Lumpur: Kediaman Perdana Menteri Tan Sri Muhyiddin Yassin menjadi tumpuan petugas media susulan kenyataan yang dikeluarkan Istana Negara berhubung isu pembatalan Ordinan Darurat hari ini.

Petugas media dilihat mula 'berkampung' di rumah Perdana Menteri yang terletak di Bukit Damansara di sini, sejak 1 tengah hari ini.

Pemerhatian Bernama mendapati beberapa kenderaan dipercayai membawa menteri dan Peguam Negara memasuki pekarangan kediaman Perdana Menteri pada 1.30 tengah hari.

Dalam kenyataan Istana Negara itu, Yang di-Pertuan Agong Al-Sultan Abdullah Ri'ayatuddin Al-Mustafa Billah Shah menzahirkan rasa amat dukacita dengan kenyataan di Parlimen pada Isnin bahawa kerajaan membatalkan semua Ordinan Darurat walhal ia belum lagi diperkenan Seri Paduka.

Yang di-Pertuan Agong juga amat dukacita kerana apa yang diperkenan dan dititahkan kepada Menteri di Jabatan Perdana Menteri (Parlimen dan Undang-Undang) Datuk Seri Takiyuddin Hassan serta Peguam Negara Tan Sri Idrus Harun bahawa cadangan pembatalan semua Ordinan Darurat dibentang dan dibahaskan di Parlimen bagi tujuan diungkaikan tidak dilaksanakan.
"""
[18]:
def simple_cleaning(string):
    return ''.join([s for s in string if s not in ',.\'";'])

string = malaya.text.function.split_into_sentences(string)
string = [simple_cleaning(s) for s in string if len(s) > 50]
string
[18]:
['KUALA LUMPUR: Ketua Pembangkang Datuk Seri Anwar Ibrahim menggesa Perdana Menteri Tan Sri Muhyiddin Yassin meletak jawatan susulan kenyataan dikeluarkan Istana Negara berhubung isu Proklamasi Darurat',
 'Ini menunjukkan Kabinet yang diketuai Tan Sri Muhyiddin melanggar Perlembagaan menghina instusi raja Perlembagaan termasuk menteri di Jabatan Perdana Menteri mengelirukan Dewan',
 'Oleh yang demikian kita menuntut Perdana Menteri meletak jawatan ujarnya hari ini',
 'Terdahulu Yang di-Pertuan Agong Al-Sultan Abdullah Riayatuddin Al-Mustafa Billah Shah menzahirkan rasa dukacita dengan pengumuman pembatalan darurat di Parlimen',
 'Perkara itu dimaklumkan Datuk Pengelola Bijaya Diraja Istana Negara Datuk Indera Ahmad Fadil Shamsudddin dalam satu kenyataan hari ini',
 'Sehubungan dengan itu Seri Paduka Baginda menzahirkan rasa amat dukacita dengan kenyataan yang telah dibuat pada 26 Julai 2021 lalu bahawa kerajaan telah membatalkan semua Ordinan Darurat yang telah dimasyhurkan oleh Baginda sepanjang tempoh darurat walhal belum lagi diperkenan baginda katanya',
 'Kuala Lumpur: Kediaman Perdana Menteri Tan Sri Muhyiddin Yassin menjadi tumpuan petugas media susulan kenyataan yang dikeluarkan Istana Negara berhubung isu pembatalan Ordinan Darurat hari ini',
 'Petugas media dilihat mula berkampung di rumah Perdana Menteri yang terletak di Bukit Damansara di sini sejak 1 tengah hari ini',
 'Pemerhatian Bernama mendapati beberapa kenderaan dipercayai membawa menteri dan Peguam Negara memasuki pekarangan kediaman Perdana Menteri pada 130 tengah hari',
 'Dalam kenyataan Istana Negara itu Yang di-Pertuan Agong Al-Sultan Abdullah Riayatuddin Al-Mustafa Billah Shah menzahirkan rasa amat dukacita dengan kenyataan di Parlimen pada Isnin bahawa kerajaan membatalkan semua Ordinan Darurat walhal ia belum lagi diperkenan Seri Paduka',
 'Yang di-Pertuan Agong juga amat dukacita kerana apa yang diperkenan dan dititahkan kepada Menteri di Jabatan Perdana Menteri (Parlimen dan Undang-Undang) Datuk Seri Takiyuddin Hassan serta Peguam Negara Tan Sri Idrus Harun bahawa cadangan pembatalan semua Ordinan Darurat dibentang dan dibahaskan di Parlimen bagi tujuan diungkaikan tidak dilaksanakan']
[19]:
r = model.greedy_decoder(string)
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
WARNING:root:1
[20]:
g = r[0]['G']

for i in range(1, len(r), 1):
    g.update(r[i]['G'])
[21]:
plt.figure(figsize=(17, 17))
pos = nx.spring_layout(g)
nx.draw(g, with_labels=True, node_color='skyblue', edge_cmap=plt.cm.Blues, pos = pos)
nx.draw_networkx_edge_labels(g, pos=pos)
plt.show()
_images/load-knowledge-graph-triples_26_0.png