Extractive HuggingFace#

This tutorial is available as an IPython notebook at Malaya/example/qa-extractive-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
from pprint import pprint
CPU times: user 3.22 s, sys: 3.31 s, total: 6.53 s
Wall time: 2.2 s

What is Extractive QA#

is a reading comprehension problem, eg,

{
    'title': 'Normans',
    'paragraphs': [
        {
            'context': 'Orang Norman (Norman: Nourmands; Perancis: Normands; Latin: Normanni) ialah orang-orang yang pada abad ke-10 dan ke-11 memberikan nama mereka kepada Normandy, sebuah wilayah di Perancis. Mereka diturunkan daripada Norse ("Norman" berasal daripada penyerang "Norseman") dan lanun dari Denmark, Iceland dan Norway yang, di bawah pimpinan mereka Rollo, bersetuju untuk bersumpah fealty kepada Raja Charles III dari Francia Barat. Melalui generasi asimilasi dan percampuran dengan penduduk asli Frankish dan Roman-Gaulish, keturunan mereka akan beransur-ansur bergabung dengan budaya Carolingian yang berpusat di Francia Barat. Identiti budaya dan etnik yang berbeza dari orang Norman muncul pada mulanya pada separuh pertama abad ke-10, dan ia terus berkembang pada abad-abad yang berjaya.',
            'qas': [
                {
                    'question': 'Di negara manakah Normandy berada?',
                    'answers': [
                        {'text': 'Perancis', 'answer_start': 177},
                        {'text': 'Perancis', 'answer_start': 177},
                        {'text': 'Perancis', 'answer_start': 177},
                        {'text': 'Perancis', 'answer_start': 177},
                    ],
                    'id': '56ddde6b9a695914005b9628',
                    'is_impossible': False,
                }
            ],
        }
    ],
}

So we need to give a long paragraph and multiple questions, and the model will return answers based on that paragraph with start and end spans. Read more about SQUAD dataset https://rajpurkar.github.io/SQuAD-explorer/

List available HuggingFace models#

[4]:
malaya.qa.extractive.available_huggingface()
INFO:malaya.qa.extractive:tested on translated SQUAD V2 Dev set, https://github.com/huseinzol05/malay-dataset/tree/master/question-answer/squad
INFO:malaya.qa.extractive:tested on SQUAD V2 Dev set, https://rajpurkar.github.io/SQuAD-explorer/
[4]:
Size (MB) exact-ms f1-ms exact-en f1-en
mesolitica/finetune-extractive-qa-t5-tiny-standard-bahasa-cased 139.0 0.426956 0.511303 0.469257 0.541063
mesolitica/finetune-extractive-qa-t5-small-standard-bahasa-cased 242.0 0.582010 0.651100 0.582010 0.651100
mesolitica/finetune-extractive-qa-t5-base-standard-bahasa-cased 892.0 0.570355 0.641370 0.570355 0.641370
mesolitica/finetune-extractive-qa-flan-t5-base 990.0 0.552198 0.624780 0.709291 0.779958

Load HuggingFace model#

[7]:
model = malaya.qa.extractive.huggingface(model = 'mesolitica/finetune-extractive-qa-t5-base-standard-bahasa-cased')
[8]:
model_flan = malaya.qa.extractive.huggingface(model = 'mesolitica/finetune-extractive-qa-flan-t5-base')

Copy from wikipedia and news#

[9]:
# https://ms.wikipedia.org/wiki/Mohd_Najib_bin_Abdul_Razak

p_wikipedia = """
Najib razak telah dipilih untuk Parlimen Malaysia pada tahun 1976,
pada usia 23 tahun, menggantikan bapanya duduk di kerusi Pekan yang berpangkalan di Pahang.
Dari tahun 1982 hingga 1986 beliau menjadi Menteri Besar (Ketua Menteri) Pahang,
sebelum memasuki persekutuan Kabinet Tun Dr Mahathir Mohamad pada tahun 1986 sebagai Menteri Kebudayaan, Belia dan Sukan.
Beliau telah berkhidmat dalam pelbagai jawatan Kabinet sepanjang baki tahun 1980-an dan 1990-an, termasuk sebagai Menteri Pertahanan dan Menteri Pelajaran.
Beliau menjadi Timbalan Perdana Menteri pada 7 Januari 2004, berkhidmat di bawah Perdana Menteri Tun Dato' Seri Abdullah Ahmad Badawi,
sebelum menggantikan Badawi setahun selepas Barisan Nasional mengalami kerugian besar dalam pilihan raya 2008.
Di bawah kepimpinan beliau, Barisan Nasional memenangi pilihan raya 2013,
walaupun buat kali pertama dalam sejarah Malaysia pembangkang memenangi majoriti undi popular.
"""
q_wikipedia = ['pada umur berapa najib razak menggantikan ayahnya',
               'Apakah jawatan yang pernah dipegang oleh Najib Razak']
[10]:
# https://www.malaysiakini.com/news/574914

p_news = """
Bekas perdana menteri Najib Razak mempersoalkan tindakan polis yang menurutnya tidak serta-merta mengeluarkan kenyataan berhubung dakwaan Adun Perikatan Nasional (PN) "merancang" insiden rogol.
Sedangkan, kata ahli parlimen Pekan itu, polis pantas mengeluarkan kenyataan apabila dia dilapor terlupa mengimbas MySejahtera sebelum masuk restoran.
"Berita Najib lupa scan MySejahtera tular, kenyataan polis terus keluar. Berita Dr Mahathir Mohamad lupa scan, kenyataan, polis serta-merta keluar.
"Sebab itu saya pelik kenapa pihak polis belum sempat keluar apa-apa kenyataan berhubung kes seorang gadis membuat laporan polis untuk dakwa Adun PN rancang insiden rogolnya," katanya di Facebook hari ini.
Najib merujuk dakwaan seorang wanita yang mendakwa dirogol kenalan kepada Adun Gombak Setia, Hilman Idham.
Wanita itu mendakwa ahli politik dari Bersatu berkenaan merancang insiden yang berlaku pada 5 Dis lalu.
Menurut laporan polis pada 8 Mei, mangsa mendakwa kejadian itu berlaku di sebuah hotel di Selangor, yang pada masa itu berada di bawah perintah kawalan pergerakan bersyarat (PKPB).
"""

q_news = ['siapakah yang mempersoalkan tindakan polis', 'siapakah Adun Gombak Setia']

Predict#

def predict(
    self,
    paragraph_text: str,
    question_texts: List[str],
    **kwargs,
):
    """
    Predict Span from questions given a paragraph.

    Parameters
    ----------
    paragraph_text: str
    question_texts: List[str]
        List of questions, results really depends on case sensitive questions.
    **kwargs: vector arguments pass to huggingface `generate` method.
        Read more at https://huggingface.co/docs/transformers/main_classes/text_generation

    Returns
    -------
    result: List[str]
    """
[11]:
model.predict(p_wikipedia, q_wikipedia)
[11]:
['23', 'Timbalan Perdana Menteri']
[12]:
model_flan.predict(p_wikipedia, q_wikipedia)
[12]:
['23', 'menggantikan bapanya duduk di kerusi Pekan ']
[13]:
model.predict(p_news, q_news)
[13]:
['Najib Razak', 'Hilman Idham']
[14]:
model_flan.predict(p_news, q_news)
Token indices sequence length is longer than the specified maximum sequence length for this model (552 > 512). Running this sequence through the model will result in indexing errors
[14]:
['Bekas perdana menteri Najib Razak', 'Hilman Idham']

Able to mixed MS and EN#

[15]:
# https://ms.wikipedia.org/wiki/Mohd_Najib_bin_Abdul_Razak

p_wikipedia = """
Najib razak telah dipilih untuk Parlimen Malaysia pada tahun 1976,
pada usia 23 tahun, menggantikan bapanya duduk di kerusi Pekan yang berpangkalan di Pahang.
Dari tahun 1982 hingga 1986 beliau menjadi Menteri Besar (Ketua Menteri) Pahang,
sebelum memasuki persekutuan Kabinet Tun Dr Mahathir Mohamad pada tahun 1986 sebagai Menteri Kebudayaan, Belia dan Sukan.
Beliau telah berkhidmat dalam pelbagai jawatan Kabinet sepanjang baki tahun 1980-an dan 1990-an, termasuk sebagai Menteri Pertahanan dan Menteri Pelajaran.
Beliau menjadi Timbalan Perdana Menteri pada 7 Januari 2004, berkhidmat di bawah Perdana Menteri Tun Dato' Seri Abdullah Ahmad Badawi,
sebelum menggantikan Badawi setahun selepas Barisan Nasional mengalami kerugian besar dalam pilihan raya 2008.
Di bawah kepimpinan beliau, Barisan Nasional memenangi pilihan raya 2013,
walaupun buat kali pertama dalam sejarah Malaysia pembangkang memenangi majoriti undi popular.
"""
q_wikipedia = ['pada umur berapa najib razak menggantikan ayahnya',
               'Apakah jawatan yang pernah dipegang oleh Najib Razak',
              'what age najib razak replaced his father']
[16]:
model.predict(p_wikipedia, q_wikipedia)
[16]:
['23', 'Timbalan Perdana Menteri', '23']
[17]:
model_flan.predict(p_wikipedia, q_wikipedia)
[17]:
['23', 'menggantikan bapanya duduk di kerusi Pekan ', '23']
[18]:
# https://www.malaysiakini.com/news/574914

p_news = """
Bekas perdana menteri Najib Razak mempersoalkan tindakan polis yang menurutnya tidak serta-merta mengeluarkan kenyataan berhubung dakwaan Adun Perikatan Nasional (PN) "merancang" insiden rogol.
Sedangkan, kata ahli parlimen Pekan itu, polis pantas mengeluarkan kenyataan apabila dia dilapor terlupa mengimbas MySejahtera sebelum masuk restoran.
"Berita Najib lupa scan MySejahtera tular, kenyataan polis terus keluar. Berita Dr Mahathir Mohamad lupa scan, kenyataan, polis serta-merta keluar.
"Sebab itu saya pelik kenapa pihak polis belum sempat keluar apa-apa kenyataan berhubung kes seorang gadis membuat laporan polis untuk dakwa Adun PN rancang insiden rogolnya," katanya di Facebook hari ini.
Najib merujuk dakwaan seorang wanita yang mendakwa dirogol kenalan kepada Adun Gombak Setia, Hilman Idham.
Wanita itu mendakwa ahli politik dari Bersatu berkenaan merancang insiden yang berlaku pada 5 Dis lalu.
Menurut laporan polis pada 8 Mei, mangsa mendakwa kejadian itu berlaku di sebuah hotel di Selangor, yang pada masa itu berada di bawah perintah kawalan pergerakan bersyarat (PKPB).
"""

q_news = ['siapakah yang mempersoalkan tindakan polis', 'siapakah Adun Gombak Setia',
         'who is the victim on 8 may incident',
         'where does the 8 may incident happened']
[19]:
model.predict(p_news, q_news)
[19]:
['Najib Razak', 'Hilman Idham', 'Hilman Idham', 'di sebuah hotel di Selangor']
[20]:
model_flan.predict(p_news, q_news)
[20]:
['Bekas perdana menteri Najib Razak',
 'Hilman Idham',
 'Hilman Idham',
 'sebuah hotel di Selangor']
[ ]: