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.

This interface deprecated, use HuggingFace interface instead.

[1]:
import os

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

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

import malaya
CPU times: user 4.01 s, sys: 2.54 s, total: 6.55 s
Wall time: 4.4 s
[4]:
import warnings
warnings.filterwarnings('default')

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#

[5]:
malaya.true_case.available_transformer()
/home/husein/dev/malaya/malaya/true_case.py:147: DeprecationWarning: `malaya.true_case.available_transformer` is deprecated, use `malaya.true_case.available_huggingface` instead
  warnings.warn(
INFO:malaya.true_case:tested on generated dataset at https://f000.backblazeb2.com/file/malay-dataset/true-case/test-set-true-case.json
[5]:
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')
        Check available models at `malaya.true_case.available_transformer()`.
    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
    """
[6]:
model = malaya.true_case.transformer()
/home/husein/dev/malaya/malaya/true_case.py:181: DeprecationWarning: `malaya.true_case.transformer` is deprecated, use `malaya.true_case.huggingface` instead
  warnings.warn(
2022-11-14 00:18:17.697600: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2022-11-14 00:18:17.702918: E tensorflow/stream_executor/cuda/cuda_driver.cc:271] failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected
2022-11-14 00:18:17.702945: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:169] retrieving CUDA diagnostic information for host: husein-MS-7D31
2022-11-14 00:18:17.702949: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:176] hostname: husein-MS-7D31
2022-11-14 00:18:17.703054: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:200] libcuda reported version is: Not found: was unable to find libcuda.so DSO loaded into this program
2022-11-14 00:18:17.703083: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:204] kernel reported version is: 470.141.3
[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.']