Segmentation

This tutorial is available as an IPython notebook at Malaya/example/segmentation.

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 4.62 s, sys: 602 ms, total: 5.22 s
Wall time: 4.19 s

Common problem for social media texts, there are missing spaces in the text, so text segmentation can help you,

  1. huseinsukamakan ayam,dia sgtrisaukan -> husein suka makan ayam, dia sgt risaukan.

  2. drmahathir sangat menekankan budaya budakzamansekarang -> dr mahathir sangat menekankan budaya budak zaman sekarang.

  3. ceritatunnajibrazak -> cerita tun najib razak.

  4. TunM sukakan -> Tun M sukakan.

Segmentation only,

  1. Solve spacing error.

  2. Not correcting any grammar.

[2]:
string1 = 'huseinsukamakan ayam,dia sgtrisaukan'
string2 = 'drmahathir sangat menekankan budaya budakzamansekarang'
string3 = 'ceritatunnajibrazak'
string4 = 'TunM sukakan'
string_hard = 'IPOH-AhliDewanUndangan Negeri(ADUN) HuluKinta, MuhamadArafat Varisai Mahamadmenafikanmesejtularmendakwa beliau akan melompatparti menyokong UMNO membentuk kerajaannegeridiPerak.BeliauyangjugaKetua Penerangan Parti Keadilan Rakyat(PKR)Perak dalam satumesejringkaskepadaSinar Harian menjelaskan perkara itutidakbenarsama sekali.'
string_socialmedia = 'aqxsukalah apeyg tejadidekat mamattu'

Viterbi algorithm

Commonly people use Viterbi algorithm to solve this problem, we also added viterbi using ngram from bahasa papers and wikipedia.

def viterbi(max_split_length: int = 20, **kwargs):
    """
    Load Segmenter class using viterbi algorithm.

    Parameters
    ----------
    max_split_length: int, (default=20)
        max length of words in a sentence to segment
    validate: bool, optional (default=True)
        if True, malaya will check model availability and download if not available.

    Returns
    -------
    result : malaya.segmentation.SEGMENTER class
    """
[3]:
viterbi = malaya.segmentation.viterbi()
[4]:
%%time

viterbi.segment([string1, string2, string3, string4])
CPU times: user 61.1 ms, sys: 1.98 ms, total: 63.1 ms
Wall time: 63 ms
[4]:
['husein suka makan ayam,dia sgt risau kan',
 'dr mahathir sangat mene kan kan budaya budak zaman sekarang',
 'cerita tu n najib razak',
 'Tun M suka kan']
[5]:
%%time

viterbi.segment([string_hard, string_socialmedia])
CPU times: user 7.25 ms, sys: 353 µs, total: 7.61 ms
Wall time: 7.47 ms
[5]:
['IPOH - Ahli Dewan Undangan Negeri(ADUN) Hulu Kinta, Muhamad Arafat Varisai Mahamadmenafikanmesejtularmendakwa belia u akan me lompat part i me nyo ko ng UMNO mem bentuk kerajaannegeridi Perak. Beliauyangjuga Ketua Penerangan Parti Keadilan Rakyat(PKR) Perak dalam satumesejringkaskepada Sinar Harian men jel ask an perkara it u tidak benar sama sekali.',
 'aq x suka lah ape yg te jadi dekat mama ttu']

List available Transformer model

[4]:
malaya.segmentation.available_transformer()
[4]:
Size (MB) Quantized Size (MB) Sequence Accuracy
small 42.7 13.1 0.8217
base 234.0 63.8 0.8759

Load Transformer model

[6]:
model = malaya.segmentation.transformer(model = 'small')
quantized_model = malaya.segmentation.transformer(model = 'small', quantized = True)
WARNING:root:Load quantized model will cause accuracy drop.
[ ]:
model_base = malaya.segmentation.transformer(model = 'base')
quantized_model_base = malaya.segmentation.transformer(model = 'base', quantized = True)

Predict using greedy decoder

def greedy_decoder(self, strings: List[str]):
    """
    Segment strings using greedy decoder.
    Example, "sayasygkan negarasaya" -> "saya sygkan negara saya"

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

    Returns
    -------
    result: List[str]
    """
[9]:
%%time

model.greedy_decoder([string1, string2, string3, string4])
CPU times: user 1.09 s, sys: 397 ms, total: 1.49 s
Wall time: 831 ms
[9]:
['husein suka makan ayam, dia sgt risaukan',
 'dr mahathir sangat menekankan budaya budak zaman sekarang',
 'cerita tun najib razak',
 'Tun M sukakan']
[14]:
%%time

quantized_model.greedy_decoder([string1, string2, string3, string4])
CPU times: user 1.07 s, sys: 404 ms, total: 1.47 s
Wall time: 775 ms
[14]:
['husein suka makan ayam, dia sgt risaukan',
 'dr mahathir sangat menekankan budaya budak zaman sekarang',
 'cerita tun najib razak',
 'Tun M sukakan']
[11]:
%%time

model_base.greedy_decoder([string1, string2, string3, string4])
CPU times: user 4.08 s, sys: 2.39 s, total: 6.48 s
Wall time: 1.39 s
[11]:
['husein suka makan ayam, dia sgt risaukan',
 'dr mahathir sangat menekankan budaya budak zaman sekarang',
 'cerita tun najib razak cerita',
 'Tun M sukakan Tun M sukakan']
[15]:
%%time

quantized_model_base.greedy_decoder([string1, string2, string3, string4])
CPU times: user 5.75 s, sys: 3.26 s, total: 9.01 s
Wall time: 3.79 s
[15]:
['husein suka makan ayam, dia sgt risaukan',
 'dr mahathir sangat menekankan budaya budak zaman sekarang',
 'cerita tun najib razak cerita tun',
 'Tun M sukakan Tun M sukakan']
[12]:
%%time

model.greedy_decoder([string_hard, string_socialmedia])
CPU times: user 2.91 s, sys: 465 ms, total: 3.38 s
Wall time: 825 ms
[12]:
['IPOH - Ahli Dewan Undangan Negeri (ADUN) Hulu Kinta, Muhamad Arafat Varisai Mahamad menafikan mesej tular mendakwa beliau akan melompat parti menyokong UMNO membentuk kerajaan negeri di Perak. Beliau yang juga Ketua Penerangan Parti Keadilan Rakyat (PKR) Perak dalam satu mesej ringkas kepada Sinar Harian menjelaskan perkara itu tidak benar sama sekali.',
 'aq xsukalah ape yg tejadid dekat mamat tu']
[16]:
%%time

quantized_model.greedy_decoder([string_hard, string_socialmedia])
CPU times: user 2.96 s, sys: 543 ms, total: 3.5 s
Wall time: 842 ms
[16]:
['IPOH - Ahli Dewan Undangan Negeri (ADUN) Hulu Kinta, Muhamad Arafat Varisai Mahamad menafikan mesej tular mendakwa beliau akan melompat parti menyokong UMNO membentuk kerajaan negeri di Perak. Beliau yang juga Ketua Penerangan Parti Keadilan Rakyat (PKR) Perak dalam satu mesej ringkas kepada Sinar Harian menjelaskan perkara itu tidak benar sama sekali.',
 'aq xsukalah ape yg tejadid dekat mamat tu']
[13]:
%%time

model_base.greedy_decoder([string_hard, string_socialmedia])
CPU times: user 17.3 s, sys: 10 s, total: 27.3 s
Wall time: 5.75 s
[13]:
['IPOH - Ahli Dewan Undangan Negeri (ADUN) Hulu Kinta, Muhamad Arafat Varisai Mahamad menafikan mesej tular mendakwa beliau akan melompat parti menyokong UMNO membentuk kerajaan negeri di Perak. Beliau yang juga Ketua Penerangan Parti Keadilan Rakyat (PKR) Perak dalam satu mesej ringkas kepada Sinar Harian menjelaskan perkara itu tidak benar sama sekali.',
 'aq xsukalah ape yg teja di dekat mamat tu aq xsukalah ape yg teja di dekat mamat tu']
[17]:
%%time

quantized_model_base.greedy_decoder([string_hard, string_socialmedia])
CPU times: user 17.6 s, sys: 10.6 s, total: 28.2 s
Wall time: 5.91 s
[17]:
['IPOH - Ahli Dewan Undangan Negeri (ADUN) Hulu Kinta, Muhamad Arafat Varisai Mahamad menafikan mesej tular mendakwa beliau akan melompat parti menyokong UMNO membentuk kerajaan negeri di Perak. Beliau yang juga Ketua Penerangan Parti Keadilan Rakyat (PKR) Perak dalam satu mesej ringkas kepada Sinar Harian menjelaskan perkara itu tidak benar sama sekali.',
 'aq xsukalah ape yg teja di dekat mamat tu aq xsukalah ape yg teja di dekat mamat tu']

Problem with batching string, short string might repeating itself, so to solve this, you need to give a single string only,

[18]:
%%time

quantized_model_base.greedy_decoder([string_socialmedia])
CPU times: user 1.68 s, sys: 596 ms, total: 2.28 s
Wall time: 664 ms
[18]:
['aq xsukalah ape yg teja di dekat mamat tu']
[19]:
%%time

quantized_model_base.greedy_decoder([string3])
CPU times: user 918 ms, sys: 254 ms, total: 1.17 s
Wall time: 314 ms
[19]:
['cerita tun najib razak']
[20]:
%%time

quantized_model_base.greedy_decoder([string4])
CPU times: user 691 ms, sys: 171 ms, total: 862 ms
Wall time: 234 ms
[20]:
['Tun M sukakan']

Predict using beam decoder

def beam_decoder(self, strings: List[str]):
    """
    Segment strings using beam decoder, beam width size 3, alpha 0.5 .
    Example, "sayasygkan negarasaya" -> "saya sygkan negara saya"

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

    Returns
    -------
    result: List[str]
    """
[11]:
%%time

quantized_model.beam_decoder([string_socialmedia])
CPU times: user 1.38 s, sys: 1.87 s, total: 3.25 s
Wall time: 654 ms
[11]:
['aq xsukalah ape yg tejadid dekat mamat tu']
[12]:
%%time

quantized_model_base.beam_decoder([string_socialmedia])
CPU times: user 6.77 s, sys: 3.71 s, total: 10.5 s
Wall time: 2.43 s
[12]:
['aq xsukalah ape yg teja di dekat mamat tu']

We can expect beam decoder is much more slower than greedy decoder.