True Case

This tutorial is available as an IPython notebook at Malaya/example/true-case.

This module trained on both standard and local (included social media) language structures, so it is save to use for both.

[1]:
%%time

import malaya
CPU times: user 5.81 s, sys: 1.19 s, total: 7 s
Wall time: 7.63 s

Explanation

Common third party NLP services like Google Speech to Text or PDF to Text will returned unsensitive case and no punctuations or mistake punctuations and cases. So True Case can help you.

  1. jom makan di us makanan di sana sedap -> jom makan di US, makanan di sana sedap.

  2. kuala lumpur menteri di jabatan perdana menteri datuk seri dr mujahid yusof rawa hari ini mengakhiri lawatan kerja lapan hari ke jordan turki dan bosnia herzegovina lawatan yang bertujuan mengeratkan lagi hubungan dua hala dengan ketiga tiga negara berkenaan -> KUALA LUMPUR - Menteri di Jabatan Perdana Menteri, Datuk Seri Dr Mujahid Yusof Rawa hari ini mengakhiri lawatan kerja lapan hari ke Jordan, Turki dan Bosnia Herzegovina, lawatan yang bertujuan mengeratkan lagi hubungan dua hala dengan ketiga-tiga negara berkenaan.

True case only,

  1. Solve mistake / no punctuations.

  2. Solve mistake / unsensitive case.

  3. Not correcting any grammar.

List available Transformer model

[2]:
malaya.true_case.available_transformer()
[2]:
Size (MB) Quantized Size (MB) CER Suggested length
small 42.70 13.10 0.024601 256.0
base 234.00 63.80 0.014619 256.0
super-tiny-t5 81.80 27.10 0.025468 256.0
super-super-tiny-t5 39.60 12.00 0.025337 256.0
3x-super-tiny-t5 18.30 4.46 0.048737 256.0
3x-super-tiny-t5-4k 5.03 2.99 0.079891 256.0

Load Transformer model

def transformer(model: str = 'base', quantized: bool = False, **kwargs):
    """
    Load transformer encoder-decoder model to True Case.

    Parameters
    ----------
    model : str, optional (default='base')
        Model architecture supported. Allowed values:

        * ``'small'`` - Transformer SMALL parameters.
        * ``'base'`` - Transformer BASE parameters.
        * ``'super-tiny-t5'`` - T5 SUPER TINY parameters.
        * ``'super-super-tiny-t5'`` - T5 SUPER SUPER TINY parameters.
        * ``'3x-super-tiny-t5'`` - T5 3X SUPER TINY parameters.
        * ``'3x-super-tiny-t5-4k'`` - T5 3X SUPER TINY 4k vocab size 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.tf.TrueCase class
    """
[7]:
model = malaya.true_case.transformer()
[3]:
super_super_tiny = malaya.true_case.transformer(model = 'super-super-tiny-t5')

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.

[6]:
quantized_model = malaya.true_case.transformer(quantized = True)
WARNING:root:Load quantized model will cause accuracy drop.
[4]:
string1 = 'jom makan di us makanan di sana sedap'
string2 = 'kuala lumpur menteri di jabatan perdana menteri datuk seri dr mujahid yusof rawa hari ini mengakhiri lawatan kerja lapan hari ke jordan turki dan bosnia herzegovina lawatan yang bertujuan mengeratkan lagi hubungan dua hala dengan ketiga tiga negara berkenaan'

Predict using greedy decoder

def greedy_decoder(self, strings: List[str]):
    """
    True case strings using greedy decoder.
    Example, "saya nak makan di us makanan di sana sedap" -> "Saya nak makan di US, makanan di sana sedap."

    Parameters
    ----------
    strings : List[str]

    Returns
    -------
    result: List[str]
    """
    return self._greedy_decoder(strings)
[7]:
from pprint import pprint
[12]:
pprint(model.greedy_decoder([string1, string2]))
['Jom makan di US makanan di sana sedap.',
 'KUALA LUMPUR - Menteri di Jabatan Perdana Menteri, Datuk Seri Dr Mujahid '
 'Yusof Rawa hari ini mengakhiri lawatan kerja lapan hari ke Jordan, Turki dan '
 'Bosnia Herzegovina, lawatan yang bertujuan mengeratkan lagi hubungan dua '
 'hala dengan ketiga-tiga negara berkenaan.']
[8]:
pprint(super_super_tiny.greedy_decoder([string1]))
['Jom makan di US makanan di sana sedap.']
[13]:
pprint(quantized_model.greedy_decoder([string1, string2]))
['Jom makan di US makanan di sana sedap.',
 'KUALA LUMPUR - Menteri di Jabatan Perdana Menteri, Datuk Seri Dr Mujahid '
 'Yusof Rawa hari ini mengakhiri lawatan kerja lapan hari ke Jordan, Turki dan '
 'Bosnia Herzegovina, lawatan yang bertujuan mengeratkan lagi hubungan dua '
 'hala dengan ketiga-tiga negara berkenaan.']
[14]:
import random

def random_uppercase(string):
    string = [c.upper() if random.randint(0,1) else c for c in string]
    return ''.join(string)
[15]:
r = random_uppercase(string2)
r
[15]:
'KuAlA LUMPUR menTeri di jAbATaN PErDANA MentERI Datuk SERi Dr mujahid YUsof RaWA HARI Ini mEngakhirI LAwaTAN kERJA lApan hARi Ke JOrdaN tURkI dAN bOsnIa heRzEGoVInA lAwaTAN yAng BeRTUjuAN MeNGERAtKaN lAgI HUBUnGAN dua HaLA dENGAn kETiGa TIGA nEgara BerkenAaN'
[16]:
pprint(model.greedy_decoder([r]))
['KUALA LUMPUR: Menteri di Jabatan Perdana Menteri, Datuk Seri Dr Mujahid '
 'Yusof Rawa hari ini mengakhiri lawatan kerja lapan hari ke Jordan, Turki dan '
 'Bosnia Herzegovina, lawatan yang bertujuan mengeratkan lagi hubungan dua '
 'hala dengan ketiga tiga negara berkenaan.']
[17]:
pprint(quantized_model.greedy_decoder([r]))
['KUALA LUMPUR: Menteri di Jabatan Perdana Menteri, Datuk Seri Dr Mujahid '
 'Yusof Rawa hari ini mengakhiri lawatan kerja lapan hari ke Jordan, Turki dan '
 'Bosnia Herzegovina, lawatan yang bertujuan mengeratkan lagi hubungan dua '
 'hala dengan ketiga tiga negara berkenaan.']

Predict using beam decoder

def beam_decoder(self, strings: List[str]):
    """
    True case strings using beam decoder, beam width size 3, alpha 0.5 .
    Example, "saya nak makan di us makanan di sana sedap" -> "Saya nak makan di US, makanan di sana sedap."

    Parameters
    ----------
    strings : List[str]

    Returns
    -------
    result: List[str]
    """

T5 models not able to use beam_decoder.

[18]:
pprint(model.beam_decoder([string1, string2]))
['Jom makan di US makanan di sana sedap.',
 'KUALA LUMPUR - Menteri di Jabatan Perdana Menteri, Datuk Seri Dr Mujahid '
 'Yusof Rawa hari ini mengakhiri lawatan kerja lapan hari ke Jordan, Turki dan '
 'Bosnia Herzegovina, lawatan yang bertujuan mengeratkan lagi hubungan dua '
 'hala dengan ketiga-tiga negara berkenaan.']
[19]:
pprint(quantized_model.beam_decoder([string1, string2]))
['Jom makan di US makanan di sana sedap.',
 'KUALA LUMPUR - Menteri di Jabatan Perdana Menteri, Datuk Seri Dr Mujahid '
 'Yusof Rawa hari ini mengakhiri lawatan kerja lapan hari ke Jordan, Turki dan '
 'Bosnia Herzegovina, lawatan yang bertujuan mengeratkan lagi hubungan dua '
 'hala dengan ketiga-tiga negara berkenaan.']