End-to-End#

Generate EN Knowledge Graph Triples format -> MS text

This tutorial is available as an IPython notebook at Malaya/example/kg-to-text.

This module only trained on standard language structure, so it is not save to use it for local language structure.

This input must be an english knowledge graph triples format.

[2]:
import os

os.environ['CUDA_VISIBLE_DEVICES'] = ''
[3]:
import logging

logging.basicConfig(level=logging.INFO)
[4]:
%%time

import malaya
CPU times: user 3.59 s, sys: 3.04 s, total: 6.64 s
Wall time: 3 s

List available HuggingFace model#

[5]:
malaya.kg_to_text.available_huggingface()
INFO:malaya.kg_to_text:tested on test set 02 part translated KELM, https://huggingface.co/datasets/mesolitica/translated-KELM
[5]:
Size (MB) BLEU SacreBLEU Verbose Suggested length
mesolitica/finetune-ttkg-t5-tiny-standard-bahasa-cased 139 61.067843 86.1/68.4/55.8/45.9 (BP = 0.980 ratio = 0.980 ... 256
mesolitica/finetune-ttkg-t5-small-standard-bahasa-cased 242 61.559203 86.0/68.4/56.1/46.3 (BP = 0.984 ratio = 0.984 ... 256
mesolitica/finetune-ttkg-t5-base-standard-bahasa-cased 892 58.764876 84.5/65.8/53.0/43.1 (BP = 0.984 ratio = 0.985 ... 256

Load HuggingFace model#

def huggingface(model: str = 'mesolitica/finetune-ttkg-t5-small-standard-bahasa-cased', **kwargs):
    """
    Load HuggingFace model to knowledge graph to text.

    Parameters
    ----------
    model: str, optional (default='mesolitica/finetune-ttkg-t5-small-standard-bahasa-cased')
        Check available models at `malaya.kg_to_text.available_huggingface()`.

    Returns
    -------
    result: malaya.torch_model.huggingface.KGtoText
    """
[6]:
ttkg = malaya.text_to_kg.e2e.huggingface()
[7]:
model = malaya.kg_to_text.huggingface()
[9]:
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."
[10]:
r = ttkg.generate([string1, string2], do_sample=True,
    max_length=256,
    top_k=0,
    temperature=0.7)
r
You're using a T5TokenizerFast tokenizer. Please note that with a fast tokenizer, using the `__call__` method is faster than using a method to encode the text followed by a call to the `pad` method to get a padded encoding.
[10]:
[{'G': <networkx.classes.multidigraph.MultiDiGraph at 0x7fc379f1cfa0>,
  'triple': [{'head': 'Najib Razak',
    'type': 'position held',
    'tail': 'Prime Minister of Malaysia'}],
  'rebel': '<triplet> Najib Razak <subj> Prime Minister of Malaysia <obj> position held'},
 {'G': <networkx.classes.multidigraph.MultiDiGraph at 0x7fc37a5053d0>,
  'triple': [{'head': 'Pahang', 'type': 'country', 'tail': 'Malaysia'},
   {'head': 'Malaysia',
    'type': 'contains administrative territorial entity',
    'tail': 'Pahang'},
   {'head': 'Pahang', 'type': 'country', 'tail': 'Malaysia'},
   {'head': 'Perak Selangor', 'type': 'country', 'tail': 'Malaysia'},
   {'head': 'Negeri Sembilan', 'type': 'country', 'tail': 'Malaysia'},
   {'head': 'Johor', 'type': 'country', 'tail': 'Malaysia'},
   {'head': 'Terengganu', 'type': 'country', 'tail': 'Malaysia'},
   {'head': 'South China Sea', 'type': 'basin country', 'tail': 'Malaysia'}],
  'rebel': '<triplet> Pahang <subj> Malaysia <obj> country <triplet> Malaysia <subj> Pahang <obj> contains administrative territorial entity <triplet> Pahang <subj> Malaysia <obj> country <triplet> Perak Selangor <subj> Malaysia <obj> country <triplet> Negeri Sembilan <subj> Malaysia <obj> country <triplet> Johor <subj> Malaysia <obj> country <triplet> Terengganu <subj> Malaysia <obj> country <triplet> South China Sea <subj> Malaysia <obj> basin country'}]
[11]:
r[0]['triple']
[11]:
[{'head': 'Najib Razak',
  'type': 'position held',
  'tail': 'Prime Minister of Malaysia'}]

Predict#

def generate(self, kgs: List[List[Dict]], **kwargs):
    """
    Generate a text from list of knowledge graph dictionary.

    Parameters
    ----------
    kg: List[List[Dict]]
        list of list of {'head', 'type', 'tail'}
    **kwargs: vector arguments pass to huggingface `generate` method.
        Read more at https://huggingface.co/docs/transformers/main_classes/text_generation

    Returns
    -------
    result: List[str]
    """
[12]:
model.generate([r_['triple'] for r_ in r], do_sample=True,
    max_length=100,
    top_k=50,
    top_p=0.95,
    num_return_sequences=3)
You're using a T5TokenizerFast tokenizer. Please note that with a fast tokenizer, using the `__call__` method is faster than using a method to encode the text followed by a call to the `pad` method to get a padded encoding.
[12]:
['Beliau adalah Perdana Menteri Malaysia selama enam tahun pada tahun 1974 dan beliau kemudiannya menggantikan bekas Perdana Menteri yang memerintah, yang diketuai oleh Najib Razak.',
 'Ia ditubuhkan pada 4 Jun 2020 oleh bekas Perdana Menteri Malaysia, Najib Razak sebagai tindak balas kepada keputusan yang dibuat oleh bekas perdana menteri Malaysia yang mendakwa tidak berjaya untuk menamatkan krisis politik semasa Perang Saudara Asia.',
 'Beliau merupakan pemimpin Parti Perikatan Rakyat Malaysia yang dikenali sebagai Barisan Rakyat yang disokong oleh Presiden Najib Razak dan Perdana Menteri Malaysia yang ketiga, Syed Ali.',
 'Ia dijumpai di Pahang, Malaysia, di mana ia telah direkodkan dari Perak Selangor, Negeri Sembilan dan Johor di bahagian atas Laut China Selatan.',
 'Ia dijumpai di Pahang, Malaysia, di Perak Selangor, Negeri Sembilan, Johor, Terengganu, dan Laut China Selatan.',
 'Spesies ini endemik kepada Pahang (negeri Malaysia Perak Selangor, Negeri Sembilan, Johor, Terengganu, Selangor, dan Laut China Selatan).']