Normalizer#

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

[1]:
import os

os.environ['CUDA_VISIBLE_DEVICES'] = ''
[2]:
%%time
import malaya
CPU times: user 2.86 s, sys: 2.63 s, total: 5.49 s
Wall time: 2.53 s
/home/ubuntu/dev/malaya/malaya/tokenizer.py:202: FutureWarning: Possible nested set at position 3361
  self.tok = re.compile(r'({})'.format('|'.join(pipeline)))
/home/ubuntu/dev/malaya/malaya/tokenizer.py:202: FutureWarning: Possible nested set at position 3879
  self.tok = re.compile(r'({})'.format('|'.join(pipeline)))
[3]:
string1 = 'xjdi ke, y u xsuke makan HUSEIN kt situ tmpt, i hate it. pelikle, pada'
string2 = 'i mmg2 xske mknn HUSEIN kampng tmpat, i love them. pelikle saye'
string3 = 'perdana menteri ke11 sgt suka makn ayam, harganya cuma rm15.50'
string4 = 'pada 10/4, kementerian mengumumkan, 1/100'
string5 = 'Husein Zolkepli dapat tempat ke-12 lumba lari hari ni'
string6 = 'Husein Zolkepli (2011 - 2019) adalah ketua kampng di kedah sekolah King Edward ke-IV'
string7 = '2jam 30 minit aku tunggu kau, 60.1 kg kau ni, suhu harini 31.2c, aku dahaga minum 600ml'
string8 = 'awak sangat hot ye 🔥🔥. 🔥🙂'
string9 = 'hanyalah rm2 ribu'
string10 = 'mulakn slh org boleh ,bila geng tuh kena slhkn jgk xboleh trima .. pelik , dia slhkn org bole hri2 crta sakau then bila kna bls balik xdpt jwb ,kata mcm biasa slh (parti sampah) 🤣🤣🤣 jgn mulakn dlu slhkn org kalau xboleh trima bila kna bls balik 🤣🤣🤣'
string11 = 'Pemimpin yg hebat, panahan2 fitnah tu akan dituju kepadanya.. harap DS terus bersabar. Jasa baik DS menjadi asbab di sana kelak mahupun rakyat yg terhutang budi juga..'
string12 = 'berehatlh najib.. sudah2 lh tu.. jgn buat rakyat hilang kepercyaan tu pda system kehakiman negara.. klu btl x slh kenapa x dibuktikan semasa sblm rayuan.. sudah lah tu kami dh letih dengan drama korang. ok'
string13 = 'DSNR satu satunya legasi kpd negara penyambung perjuangan bangsa melayu..jatuhnya beliau dek kerana fitnah dan dengkinya manusia..semoga Allah lindungi Najib Bin Razak dunia dan akhirat..Aamiin'
string14 = 'Muhammad Najib sbb malaysiakini dah daftar.... Klu dia fitnah...tertuduh boleh saman.... Klu berita2 yg x daftar...tu yg susah nak saman...sbb x tahu owner'

Load normalizer#

This normalizer can load any spelling correction model, eg, malaya.spelling_correction.probability.load, or malaya.spelling_correction.transformer.load.

def normalizer(speller: Callable = None, **kwargs):
    """
    Load a Normalizer using any spelling correction model.

    Parameters
    ----------
    speller : spelling correction object, optional (default = None)

    Returns
    -------
    result: malaya.normalize.Normalizer class
    """
[4]:
lm = malaya.language_model.kenlm()
[5]:
corrector = malaya.spelling_correction.probability.load(language_model = lm)
[6]:
normalizer = malaya.normalize.normalizer(corrector)

normalize#

def normalize(
    self,
    string: str,
    normalize_text: bool = True,
    normalize_url: bool = False,
    normalize_email: bool = False,
    normalize_year: bool = True,
    normalize_telephone: bool = True,
    normalize_date: bool = True,
    normalize_time: bool = True,
    normalize_emoji: bool = True,
    normalize_elongated: bool = True,
    normalize_hingga: bool = True,
    normalize_pada_hari_bulan: bool = True,
    normalize_fraction: bool = True,
    normalize_money: bool = True,
    normalize_units: bool = True,
    normalize_percent: bool = True,
    normalize_ic: bool = True,
    normalize_number: bool = True,
    normalize_x_kali: bool = True,
    normalize_cardinal: bool = True,
    normalize_ordinal: bool = True,
    normalize_entity: bool = True,
    expand_contractions: bool = True,
    check_english_func=is_english,
    check_malay_func=is_malay,
    translator: Callable = None,
    language_detection_word: Callable = None,
    acceptable_language_detection: List[str] = ['EN', 'CAPITAL', 'NOT_LANG'],
    segmenter: Callable = None,
    stemmer: Callable = None,
    **kwargs,
):
    """
    Normalize a string.

    Parameters
    ----------
    string : str
    normalize_text: bool, optional (default=True)
        if True, will try to replace shortforms with internal corpus.
    normalize_url: bool, optional (default=False)
        if True, replace `://` with empty and `.` with `dot`.
        `https://huseinhouse.com` -> `https huseinhouse dot com`.
    normalize_email: bool, optional (default=False)
        if True, replace `@` with `di`, `.` with `dot`.
        `husein.zol05@gmail.com` -> `husein dot zol kosong lima di gmail dot com`.
    normalize_year: bool, optional (default=True)
        if True, `tahun 1987` -> `tahun sembilan belas lapan puluh tujuh`.
        if True, `1970-an` -> `sembilan belas tujuh puluh an`.
        if False, `tahun 1987` -> `tahun seribu sembilan ratus lapan puluh tujuh`.
    normalize_telephone: bool, optional (default=True)
        if True, `no 012-1234567` -> `no kosong satu dua, satu dua tiga empat lima enam tujuh`
    normalize_date: bool, optional (default=True)
        if True, `01/12/2001` -> `satu disember dua ribu satu`.
        if True, `Jun 2017` -> `satu Jun dua ribu tujuh belas`.
        if True, `2017 Jun` -> `satu Jun dua ribu tujuh belas`.
        if False, `2017 Jun` -> `01/06/2017`.
        if False, `Jun 2017` -> `01/06/2017`.
    normalize_time: bool, optional (default=True)
        if True, `pukul 2.30` -> `pukul dua tiga puluh minit`.
        if False, `pukul 2.30` -> `'02:00:00'`
    normalize_emoji: bool, (default=True)
        if True, `🔥` -> `emoji api`
        Load from `malaya.preprocessing.demoji`.
    normalize_elongated: bool, optional (default=True)
        if True, `betuii` -> `betui`.
    normalize_hingga: bool, optional (default=True)
        if True, `2011 - 2019` -> `dua ribu sebelas hingga dua ribu sembilan belas`
    normalize_pada_hari_bulan: bool, optional (default=True)
        if True, `pada 10/4` -> `pada sepuluh hari bulan empat`
    normalize_fraction: bool, optional (default=True)
        if True, `10 /4` -> `sepuluh per empat`
    normalize_money: bool, optional (default=True)
        if True, `rm10.4m` -> `sepuluh juta empat ratus ribu ringgit`
    normalize_units: bool, optional (default=True)
        if True, `61.2 kg` -> `enam puluh satu perpuluhan dua kilogram`
    normalize_percent: bool, optional (default=True)
        if True, `0.8%` -> `kosong perpuluhan lapan peratus`
    normalize_ic: bool, optional (default=True)
        if True, `911111-01-1111` -> `sembilan satu satu satu satu satu sempang kosong satu sempang satu satu satu satu`
    normalize_number: bool, optional (default=True)
        if True `0123` -> `kosong satu dua tiga`
    normalize_x_kali: bool, optional (default=True)
        if True `10x` -> 'sepuluh kali'
    normalize_cardinal: bool, optional (default=True)
        if True, `123` -> `seratus dua puluh tiga`
    normalize_ordinal: bool, optional (default=True)
        if True, `ke-123` -> `keseratus dua puluh tiga`
    normalize_entity: bool, optional (default=True)
        normalize entities, only effect `date`, `datetime`, `time` and `money` patterns string only.
    expand_contractions: bool, optional (default=True)
        expand english contractions.
    check_english_func: Callable, optional (default=malaya.text.function.is_english)
        function to check a word in english dictionary, default is malaya.text.function.is_english.
        this parameter also will be use for malay text normalization.
    check_malay_func: Callable, optional (default=malaya.text.function.is_malay)
        function to check a word in malay dictionary, default is malaya.text.function.is_malay.
    translator: Callable, optional (default=None)
        function to translate EN word to MS word.
    language_detection_word: Callable, optional (default=None)
        function to detect language for each words to get better translation results.
    acceptable_language_detection: List[str], optional (default=['EN', 'CAPITAL', 'NOT_LANG'])
        only translate substrings if the results from `language_detection_word` is in `acceptable_language_detection`.
    segmenter: Callable, optional (default=None)
        function to segmentize word.
        If provide, it will expand a word, apaitu -> apa itu
    stemmer: Callable, optional (default=None)
        a Callable object, must have `stem_word` method.
        If provide, will stem a word, tlonglh -> tlong
        Else, will use regex based.

    Returns
    -------
    result: {'normalize', 'date', 'money'}
    """

To get better english checker, we prefer to use https://pyenchant.github.io/pyenchant/

[7]:
import enchant
d = enchant.Dict('en_US')

is_english = lambda x: d.check(x)
is_english('lifestyle')
[7]:
True
[8]:
string = 'boleh dtg 8pagi esok tak atau minggu depan? 2 oktober 2019 2pm, tlong bayar rm 3.2k sekali tau'
[9]:
normalizer.normalize(string)
[9]:
{'normalize': 'boleh datang pukul lapan esok tidak atau minggu depan ? dua Oktober dua ribu sembilan belas pukul empat belas , tolong bayar tiga ribu dua ratus ringgit sekali tahu',
 'date': {'minggu depan': datetime.datetime(2022, 9, 9, 0, 4, 53, 823277),
  '2 oktober 2019 2pm': datetime.datetime(2019, 10, 2, 14, 0),
  '8AM esok': datetime.datetime(2022, 9, 3, 8, 0)},
 'money': {'rm 3.2k': 'RM3200.0'}}
[10]:
normalizer.normalize(string, normalize_entity = False)
[10]:
{'normalize': 'boleh datang pukul lapan esok tidak atau minggu depan ? dua Oktober dua ribu sembilan belas pukul empat belas , tolong bayar tiga ribu dua ratus ringgit sekali tahu',
 'date': {},
 'money': {}}
[11]:
string1
[11]:
'xjdi ke, y u xsuke makan HUSEIN kt situ tmpt, i hate it. pelikle, pada'

Here you can see, Malaya normalizer will normalize minggu depan to datetime object, also 3.2k ringgit to RM3200

[12]:
print(normalizer.normalize(string1))
print(normalizer.normalize(string2))
print(normalizer.normalize(string3))
print(normalizer.normalize(string4))
print(normalizer.normalize(string5))
print(normalizer.normalize(string6))
print(normalizer.normalize(string7))
print(normalizer.normalize(string8))
print(normalizer.normalize(string9))
print(normalizer.normalize(string10))
print(normalizer.normalize(string11))
print(normalizer.normalize(string12))
print(normalizer.normalize(string13))
print(normalizer.normalize(string14))
{'normalize': 'tak jadi ke , kenapa awak tak suka makan HUSEIN di situ tempat , saya hate it . peliklah , pada', 'date': {}, 'money': {}}
{'normalize': 'saya memang-memang tak suka mkan HUSEIN kampung tempat , saya love them . peliklah saya', 'date': {}, 'money': {}}
{'normalize': 'perdana menteri kesebelas sangat suka makan ayam , harganya cuma lima belas ringgit lima puluh sen', 'date': {}, 'money': {'rm15.50': 'RM15.50'}}
{'normalize': 'pada sepuluh hari bulan empat , kementerian mengumumkan , satu per seratus', 'date': {}, 'money': {}}
{'normalize': 'Husein Zolkepli dapat tempat ke-12 lumba lari hari ini', 'date': {}, 'money': {}}
{'normalize': 'Husein Zolkepli ( dua ribu sebelas hingga dua ribu sembilan belas ) adalah ketua kampung di kedah sekolah King Edward keempat', 'date': {}, 'money': {}}
{'normalize': 'dua jam tiga puluh minit aku tunggu kamu , enam puluh perpuluhan satu kilogram kamu ini , suhu hari ini tiga puluh satu perpuluhan dua celsius , aku dahaga minum enam ratus milliliter', 'date': {'2jam': datetime.datetime(2022, 9, 1, 22, 4, 53, 955401)}, 'money': {}}
{'normalize': 'awak sangat hot ye , emoji api , emoji api . Emoji api , emoji muka tersenyum sedikit', 'date': {}, 'money': {}}
{'normalize': 'hanyalah dua ribu ringgit', 'date': {}, 'money': {'rm2 ribu': 'RM2000.0'}}
{'normalize': 'mulakan salah orang boleh , bila geng itu kena salahkan juga tak boleh terima . . pelik , dia salahkan orang bole hari-hari cerita sakau then bila kena balas balik tak dapat jawab , kata macam biasa salah ( parti sampah ) , emoji berguling di lantai ketawa , emoji berguling di lantai ketawa , emoji berguling di lantai ketawa , jangan mulakan dahulu salahkan orang kalau tak boleh terima bila kena balas balik , emoji berguling di lantai ketawa , emoji berguling di lantai ketawa , emoji berguling di lantai ketawa', 'date': {}, 'money': {}}
{'normalize': 'Pemimpin yang hebat , panahan-panahan fitnah itu akan dituju kepadanya . . harap DS terus bersabar . Jasa baik DS menjadi asbab di sana kelak mahupun rakyat yang terhutang budi juga . .', 'date': {}, 'money': {}}
{'normalize': 'berehatlah najib . . sudah-sudah lah itu . . jangan buat rakyat hilang kepercayaan itu pada system kehakiman negara . . kalau betul tak salah kenapa tak dibuktikan semasa sebelum rayuan . . sudah lah itu kami dah letih dengan drama kamu semua . ok', 'date': {}, 'money': {}}
{'normalize': 'DATUK SERI NAJIB RAZAK satu satunya legasi kepada negara penyambung perjuangan bangsa melayu . . jatuhnya beliau dek kerana fitnah dan dengkinya manusia . semoga Allah lindungi Najib Bin Razak dunia dan akhirat . . Aamiin', 'date': {}, 'money': {}}
{'normalize': 'Muhammad Najib sebab malaysiakini dah daftar . . . . Kalau dia fitnah . . . tertuduh boleh saman . . . . Kalau berita-berita yang tak daftar . . itu yang susah nak saman . . sebab tak tahu owner', 'date': {}, 'money': {}}

Use translator#

To use translator, pass a callable variable into translator parameter,

print(normalizer.normalize(string1, translator = translator))
[13]:
en_ms_vocab = malaya.translation.en_ms.dictionary()
translator = lambda x: en_ms_vocab.get(x, x)
translator('pain'), translator('aduh')
[13]:
('kesakitan', 'aduh')
[14]:
print(normalizer.normalize(string1, translator = translator))
{'normalize': 'tak jadi ke , kenapa awak tak suka makan HUSEIN di situ tempat , saya benci ia . peliklah , pada', 'date': {}, 'money': {}}
[15]:
print(normalizer.normalize(string2, translator = translator))
{'normalize': 'saya memang-memang tak suka mkan HUSEIN kampung tempat , saya love them . peliklah saya', 'date': {}, 'money': {}}

Use Neural Translation Machine#

Problem with dictionary based, if the words is not exist, the translation will not work,

[16]:
translator('love'), translator('them'), translator('pain')
[16]:
('love', 'them', 'kesakitan')
[17]:
nmt = malaya.translation.en_ms.transformer(model = 'small')
2022-09-02 00:05:03.868872: 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 AVX512F FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2022-09-02 00:05:03.872191: E tensorflow/stream_executor/cuda/cuda_driver.cc:271] failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected
2022-09-02 00:05:03.872207: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:169] retrieving CUDA diagnostic information for host: huseincomel-desktop
2022-09-02 00:05:03.872211: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:176] hostname: huseincomel-desktop
2022-09-02 00:05:03.872259: 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-09-02 00:05:03.872280: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:204] kernel reported version is: 470.141.3
[18]:
nmt_func = lambda x: nmt.greedy_decoder([x])[0]
[19]:
print(normalizer.normalize(string1, translator = nmt_func))
{'normalize': 'tak jadi ke , kenapa awak tak suka makan HUSEIN di situ tempat , saya benci ia . peliklah , pada', 'date': {}, 'money': {}}
[20]:
print(normalizer.normalize(string2, translator = nmt_func))
{'normalize': 'saya memang-memang tak suka mkan HUSEIN kampung tempat , saya cinta mereka . peliklah saya', 'date': {}, 'money': {}}

Problem with single word translation#

When we do direct translate word-by-word, it does not really understand the context, for an example,

talk properly lah,

talk -> bercakap, properly -> betul,

so when we combined, we got bercakap betul lah, not really good translation. So to solve this problem, we need predict language on word level, group substrings based on similar language and translate.

[21]:
nmt = malaya.translation.en_ms.transformer(model = 'noisy-base')
nmt_func = lambda x: nmt.greedy_decoder([x])[0]
[22]:
fasttext = malaya.language_detection.fasttext()
lang_word_model = malaya.language_detection.substring_rules(model = fasttext)
Warning : `load_model` does not return WordVectorModel or SupervisedModel any more, but a `FastText` object which is very similar.
[23]:
language_detection_word_func = lambda x: lang_word_model.predict(x)
[24]:
s = 'u ni, talk properly lah'
[25]:
normalizer.normalize(s, translator = nmt_func,
                    check_english_func = is_english)
2022-09-02 00:05:12.601798: W tensorflow/core/framework/cpu_allocator_impl.cc:80] Allocation of 53428224 exceeds 10% of free system memory.
2022-09-02 00:05:12.694159: W tensorflow/core/framework/cpu_allocator_impl.cc:80] Allocation of 53428224 exceeds 10% of free system memory.
2022-09-02 00:05:12.694190: W tensorflow/core/framework/cpu_allocator_impl.cc:80] Allocation of 53428224 exceeds 10% of free system memory.
2022-09-02 00:05:12.760700: W tensorflow/core/framework/cpu_allocator_impl.cc:80] Allocation of 53428224 exceeds 10% of free system memory.
2022-09-02 00:05:12.760737: W tensorflow/core/framework/cpu_allocator_impl.cc:80] Allocation of 53428224 exceeds 10% of free system memory.
[25]:
{'normalize': 'awak ini , bercakap betul lah', 'date': {}, 'money': {}}
[26]:
normalizer.normalize(s, translator = nmt_func, language_detection_word = language_detection_word_func,
                    check_english_func = is_english)
[26]:
{'normalize': 'awak ini , bercakap dengan betul lah', 'date': {}, 'money': {}}
[27]:
s = 'This looks like awak, but in a less formal kind of way, still comel'
[28]:
normalizer.normalize(s, translator = nmt_func,
                    check_english_func = is_english)
[28]:
{'normalize': 'This rupa seperti awak , tetapi dalam a kurang formal jenis dari cara , masih comel',
 'date': {},
 'money': {}}
[29]:
normalizer.normalize(s, translator = nmt_func, language_detection_word = language_detection_word_func,
                    check_english_func = is_english)
[29]:
{'normalize': 'Ini kelihatan seperti awak , tetapi dalam cara yang kurang formal, masih comel',
 'date': {},
 'money': {}}
[30]:
s = "just attended my cousin's wedding. pelik jugak dia buat majlis biasa2 je sebab her lifestyle looks lavish. then i found out they're going on a 3 weeks honeymoon. smart decision 👍"
[31]:
normalizer.normalize(s, translator = nmt_func,
                    check_english_func = is_english)
[31]:
{'normalize': 'hanya menghadiri saya sepupu perkahwinan . pelik juga dia buat majlis biasa-biasa sahaja sebab dia gaya hidup rupa mewah . kemudian saya ditemui keluar mereka adalah pergi pada a 3 minggu bulan madu . pintar keputusan , emoji jempol',
 'date': {},
 'money': {}}
[32]:
normalizer.normalize(s, translator = nmt_func, language_detection_word = language_detection_word_func,
                    check_english_func = is_english)
[32]:
{'normalize': 'baru sahaja menghadiri majlis perkahwinan sepupu saya. pelik juga dia buat majlis biasa-biasa sahaja sebab gaya hidupnya kelihatan mewah. maka saya mendapat tahu bahawa mereka akan menjalani bulan madu selama 3 minggu. keputusan pintar, emoji jempol',
 'date': {},
 'money': {}}
[33]:
s = 'Hello gais, boleh tolong recommend bengkel ketuk yang okay near Wangsa Maju / nearby? Kereta bf i pulak kepek langgar dinding hahahha'
[34]:
normalizer.normalize(s, translator = nmt_func,
                    check_english_func = is_english)
[34]:
{'normalize': 'Hello semua orang , boleh tolong cadang bengkel ketuk yang okay berhampiran Wangsa Maju / berhampiran ? Kereta bf saya pula kepek langgar dinding haha',
 'date': {},
 'money': {}}
[35]:
normalizer.normalize(s, translator = nmt_func, language_detection_word = language_detection_word_func,
                    check_english_func = is_english)
[35]:
{'normalize': 'Helo semua orang , boleh tolong cadang bengkel ketuk berhampiran yang baik-baik saja Wangsa Maju / berhampiran? Kereta bf saya pula kepek langgar dinding haha',
 'date': {},
 'money': {}}
[36]:
s = 'Me after seeing this video: mm dapnya burger benjo extra mayo'
[37]:
normalizer.normalize(s, translator = nmt_func,
                    check_english_func = is_english)
[37]:
{'normalize': 'Me selepas melihat ini video : mm sedapnya burger benjo tambahan mayo',
 'date': {},
 'money': {}}
[38]:
normalizer.normalize(s, translator = nmt_func, language_detection_word = language_detection_word_func,
                    check_english_func = is_english)
[38]:
{'normalize': 'Saya selepas melihat video ini: mm sedapnya burger benjo mayo tambahan',
 'date': {},
 'money': {}}
[39]:
s = 'Hi guys! I noticed semalam & harini dah ramai yang dapat cookies ni kan. So harini i nak share some post mortem of our first batch:'
[40]:
normalizer.normalize(s, translator = nmt_func,
                    check_english_func = is_english)
[40]:
{'normalize': 'Hi lelaki ! SAYA disedari semalam & hari ini dah ramai yang dapat kuki ini kan . Jadi hari ini saya nak kongsi beberapa pos mortem dari kami pertama kelompok :',
 'date': {'semalam': datetime.datetime(2022, 9, 1, 0, 5, 19, 9484)},
 'money': {}}
[41]:
normalizer.normalize(s, translator = nmt_func, language_detection_word = language_detection_word_func,
                    check_english_func = is_english)
[41]:
{'normalize': 'Hai kawan! SAYA disedari semalam & hari ini dah ramai yang dapat kuki ini kan . Jadi hari ini saya nak kongsi beberapa pos mortem kumpulan pertama kami :',
 'date': {'semalam': datetime.datetime(2022, 9, 1, 0, 5, 19, 208765)},
 'money': {}}

Use segmenter#

[42]:
print(normalizer.normalize('saya taksuka ayam, tapi saya sukaikan'))
{'normalize': 'saya taksuka ayam , tapi saya sukaikan', 'date': {}, 'money': {}}
[43]:
segmenter = malaya.segmentation.transformer(model = 'small')
[44]:
segmenter_func = lambda x: segmenter.greedy_decoder([x])[0]
[45]:
print(normalizer.normalize('saya taksuka ayam, tapi saya sukaikan', segmenter = segmenter_func))
{'normalize': 'saya tidak suka ayam , tapi saya suka ikan', 'date': {}, 'money': {}}

Use stemmer#

By default kata imbuhan captured using naive regex pattern without understand the word structure, and problem with that, there are so many rules need to hardcode, so we can use better stemmer model like malaya.stem.deep_model(model = 'noisy').

[46]:
stemmer = malaya.stem.deep_model(model = 'noisy')
[47]:
normalizer.normalize(string12, stemmer = stemmer)
[47]:
{'normalize': 'berehatlah najib . . sudah-sudah lah itu . . jangan buat rakyat hilang kepercayaan itu pada system kehakiman negara . . kalau betul tak salah kenapa tak dibuktikan semasa sebelum rayuan . . sudah lah itu kami dah letih dengan drama kamu semua . ok',
 'date': {},
 'money': {}}
[159]:
normalizer.normalize(string13, stemmer = stemmer)
[159]:
{'normalize': 'DATUK SERI NAJIB RAZAK satu satunya legasi kepada negara penyambung perjuangan bangsa melayu . . jatuhnya beliau dek kerana fitnah dan dengkinya manusia . semoga Allah lindungi Najib Bin Razak dunia dan akhirat . . Aamiin',
 'date': {},
 'money': {}}
[160]:
normalizer.normalize(string14, stemmer = stemmer)
[160]:
{'normalize': 'Muhammad Najib sebab malaysiakini dah daftar . . . . Kalau dia fitnah . . . tertuduh boleh saman . . . . Kalau berita-berita yang tak daftar . . itu yang susah nak saman . . sebab tak tahu owner',
 'date': {},
 'money': {}}

Skip spelling correction#

Simply pass None to speller to normalizer = malaya.normalize.normalizer. By default it is None.

[48]:
normalizer = malaya.normalize.normalizer(corrector)
without_corrector_normalizer = malaya.normalize.normalizer(None)
[49]:
normalizer.normalize(string2, normalize_elongated = False)
[49]:
{'normalize': 'saya memang-memang tak suka mkan HUSEIN kampung tempat , saya love them . peliklah saya',
 'date': {},
 'money': {}}
[50]:
without_corrector_normalizer.normalize(string2)
[50]:
{'normalize': 'saya memang-memang tak suka mkan HUSEIN kampng tmpat , saya love them . peliklah saya',
 'date': {},
 'money': {}}

Pass kwargs preprocessing#

Let say you want to skip to normalize date pattern, you can pass kwargs to normalizer, check word tokenizer kwargs at https://malaya.readthedocs.io/en/latest/load-tokenizer-word.html

[51]:
normalizer = malaya.normalize.normalizer(corrector)
skip_date_normalizer = malaya.normalize.normalizer(corrector, date = False)
[52]:
normalizer.normalize('tarikh program tersebut 14 mei')
[52]:
{'normalize': 'tarikh program tersebut empat belas Mei dua ribu dua puluh dua',
 'date': {'14 mei': datetime.datetime(2022, 5, 14, 0, 0)},
 'money': {}}
[53]:
skip_date_normalizer.normalize('tarikh program tersebut 14 mei')
[53]:
{'normalize': 'tarikh program tersebut 14 mei',
 'date': {'14 mei': datetime.datetime(2022, 5, 14, 0, 0)},
 'money': {}}

Normalize text#

If True,

  1. replace xkisah -> tak kisah.

  2. replace berehatlh -> berehatlah.

  3. replace seadil2nya -> seadil-adilnya.

  4. apply spelling correction if passed speller parameter.

  5. standardize laughing pattern.

  6. standardize mengeluh pattern.

  7. normalize title,

{
    'dr': 'Doktor',
    'yb': 'Yang Berhormat',
    'hj': 'Haji',
    'ybm': 'Yang Berhormat Mulia',
    'tyt': 'Tuan Yang Terutama',
    'yab': 'Yang Berhormat',
    'ybm': 'Yang Berhormat Mulia',
    'yabhg': 'Yang Amat Berbahagia',
    'ybhg': 'Yang Berbahagia',
    'miss': 'Cik',
}

Simply normalizer.normalize(string, normalize_text = True), default is True.

[54]:
normalizer = malaya.normalize.normalizer(corrector)
[55]:
normalizer.normalize('xkisah')
[55]:
{'normalize': 'tak kisah', 'date': {}, 'money': {}}
[56]:
normalizer.normalize('berehatlh')
[56]:
{'normalize': 'berehatlah', 'date': {}, 'money': {}}
[57]:
normalizer.normalize('seadil2nya')
[57]:
{'normalize': 'seadil-adilnya', 'date': {}, 'money': {}}
[58]:
normalizer.normalize('xterjadi4nya')
[58]:
{'normalize': 'tak terjadi-jadi-jadi-jadinya', 'date': {}, 'money': {}}
[59]:
normalizer.normalize('bukan2')
[59]:
{'normalize': 'bukan-bukan', 'date': {}, 'money': {}}
[60]:
normalizer.normalize('bukan2 wkwkwkw')
[60]:
{'normalize': 'bukan-bukan haha', 'date': {}, 'money': {}}
[61]:
normalizer.normalize('bukan2 haih')
[61]:
{'normalize': 'bukan-bukan aduh', 'date': {}, 'money': {}}
[62]:
normalizer.normalize('dia sakai hhihihu')
[62]:
{'normalize': 'dia sakai haha', 'date': {}, 'money': {}}
[63]:
normalizer.normalize('hais sorrylah')
[63]:
{'normalize': 'aduh maaflah', 'date': {}, 'money': {}}
[64]:
normalizer.normalize('Dr yahaya')
[64]:
{'normalize': 'Doktor yahaya', 'date': {}, 'money': {}}
[65]:
normalizer.normalize('mulakn slh org boleh ,bila geng tuh kena slhkn jgk xboleh trima')
[65]:
{'normalize': 'mulakan salah orang boleh , bila geng itu kena salahkan juga tak boleh terima',
 'date': {},
 'money': {}}

Normalize url#

Let say you have an url word, example, https://huseinhouse.com, this parameter going to,

If True,

  1. replace :// with empty string.

  2. replace . with dot.

  3. replace digits with string representation.

  4. Capitalize https, http, and www.

Simply normalizer.normalize(string, normalize_url = True), default is False.

[66]:
normalizer = malaya.normalize.normalizer()
[67]:
normalizer.normalize('web saya ialah https://huseinhouse.com')
[67]:
{'normalize': 'web saya ialah https://huseinhouse.com',
 'date': {},
 'money': {}}
[68]:
normalizer.normalize('web saya ialah https://huseinhouse.com', normalize_url = True)
[68]:
{'normalize': 'web saya ialah HTTPS huseinhouse dot com',
 'date': {},
 'money': {}}
[69]:
normalizer.normalize('web saya ialah https://huseinhouse02934.com', normalize_url = True)
[69]:
{'normalize': 'web saya ialah HTTPS huseinhouse kosong dua sembilan tiga empat dot com',
 'date': {},
 'money': {}}

Normalize email#

Let say you have an email word, example, husein.zol05@gmail.com, this parameter going to,

If True,

  1. replace :// with empty string.

  2. replace . with dot.

  3. replace @ with di.

  4. replace digits with string representation.

Simply normalizer.normalize(string, normalize_email = True), default is False.

[70]:
normalizer = malaya.normalize.normalizer()
[71]:
normalizer.normalize('email saya ialah husein.zol05@gmail.com')
[71]:
{'normalize': 'email saya ialah husein.zol05@gmail.com',
 'date': {},
 'money': {}}
[72]:
normalizer.normalize('email saya ialah husein.zol05@gmail.com', normalize_email = True)
[72]:
{'normalize': 'email saya ialah husein dot zol kosong lima di gmail dot com',
 'date': {},
 'money': {}}

Normalize year#

  1. if True, tahun 1987 -> tahun sembilan belas lapan puluh tujuh.

  2. if True, 1970-an -> sembilan belas tujuh puluh an.

  3. if False, tahun 1987 -> tahun seribu sembilan ratus lapan puluh tujuh.

Simply normalizer.normalize(string, normalize_year = True), default is True.

[73]:
normalizer = malaya.normalize.normalizer()
[74]:
normalizer.normalize('$400 pada tahun 1998 berbanding lebih $1000')
[74]:
{'normalize': 'empat ratus dollar pada tahun sembilan belas sembilan puluh lapan berbanding lebih seribu dollar',
 'date': {},
 'money': {'$400 ': '$400', '$1000': '$1000'}}
[75]:
normalizer.normalize('$400 pada 1970-an berbanding lebih $1000')
[75]:
{'normalize': 'empat ratus dollar pada sembilan belas tujuh puluhan berbanding lebih seribu dollar',
 'date': {},
 'money': {'$400 ': '$400', '$1000': '$1000'}}
[76]:
normalizer.normalize('$400 pada tahun 1970-an berbanding lebih $1000')
[76]:
{'normalize': 'empat ratus dollar pada tahun sembilan belas tujuh puluhan berbanding lebih seribu dollar',
 'date': {},
 'money': {'$400 ': '$400', '$1000': '$1000'}}
[77]:
normalizer.normalize('$400 pada tahun 1998 berbanding lebih $1000', normalize_year = False)
[77]:
{'normalize': 'empat ratus dollar pada tahun 1998 berbanding lebih seribu dollar',
 'date': {},
 'money': {'$400 ': '$400', '$1000': '$1000'}}

Normalize telephone#

  1. if True, no 012-1234567 -> no kosong satu dua, satu dua tiga empat lima enam tujuh.

Simply normalizer.normalize(string, normalize_telephone = True), default is True.

[78]:
normalizer = malaya.normalize.normalizer()
[79]:
normalizer.normalize('no saya 012-1234567')
[79]:
{'normalize': 'no saya kosong satu dua, satu dua tiga empat lima enam tujuh',
 'date': {},
 'money': {}}
[80]:
normalizer.normalize('no saya 012-1234567', normalize_telephone = False)
[80]:
{'normalize': 'no saya 012-1234567', 'date': {}, 'money': {}}

Normalize date#

  1. if True, 01/12/2001 -> satu disember dua ribu satu.

  2. if False, normalize date string to %d/%m/%y.

Simply normalizer.normalize(string, normalize_date = True), default is True.

[81]:
normalizer = malaya.normalize.normalizer()
[82]:
normalizer.normalize('saya akan gerak pada 1/11/2021')
[82]:
{'normalize': 'saya akan gerak pada sebelas Januari dua ribu dua puluh satu',
 'date': {'1/11/2021': datetime.datetime(2021, 1, 11, 0, 0)},
 'money': {}}
[83]:
normalizer.normalize('saya akan gerak pada 1/11/2021', normalize_date = False)
[83]:
{'normalize': 'saya akan gerak pada 11/01/2021',
 'date': {'1/11/2021': datetime.datetime(2021, 1, 11, 0, 0)},
 'money': {}}
[84]:
normalizer.normalize('1 nov 2019')
[84]:
{'normalize': 'satu November dua ribu sembilan belas',
 'date': {'1 nov 2019': datetime.datetime(2019, 11, 1, 0, 0)},
 'money': {}}
[85]:
normalizer.normalize('1 nov 2019', normalize_date = False)
[85]:
{'normalize': '01/11/2019',
 'date': {'1 nov 2019': datetime.datetime(2019, 11, 1, 0, 0)},
 'money': {}}
[86]:
normalizer.normalize('januari 1 1996')
[86]:
{'normalize': 'satu Januari seribu sembilan ratus sembilan puluh enam',
 'date': {'januari 1 1996': datetime.datetime(1996, 1, 1, 0, 0)},
 'money': {}}
[87]:
normalizer.normalize('januari 1 1996', normalize_date = False)
[87]:
{'normalize': '01/01/1996',
 'date': {'januari 1 1996': datetime.datetime(1996, 1, 1, 0, 0)},
 'money': {}}
[88]:
normalizer.normalize('januari 2019')
[88]:
{'normalize': 'satu Januari dua ribu sembilan belas',
 'date': {'januari 2019': datetime.datetime(2019, 1, 1, 0, 0)},
 'money': {}}
[89]:
normalizer.normalize('januari 2019', normalize_date = False)
[89]:
{'normalize': '01/01/2019',
 'date': {'januari 2019': datetime.datetime(2019, 1, 1, 0, 0)},
 'money': {}}

Normalize time#

  1. if True, pukul 2.30 -> pukul dua tiga puluh minit.

  2. if False 2:01pm -> pukul 14.01.

Simply normalizer.normalize(string, normalize_time = True), default is True.

[90]:
normalizer = malaya.normalize.normalizer()
[91]:
s = 'Operasi tamat sepenuhnya pada pukul 1.30 tengah hari'
normalizer.normalize(s, normalize_time = True)
[91]:
{'normalize': 'Operasi tamat sepenuhnya pada pukul satu tiga puluh minit tengah hari',
 'date': {},
 'money': {}}
[92]:
s = 'Operasi tamat sepenuhnya pada pukul 1.30 tengah hari'
normalizer.normalize(s, normalize_time = False)
[92]:
{'normalize': 'Operasi tamat sepenuhnya pada pukul 01.30 tengah hari',
 'date': {},
 'money': {}}
[93]:
s = 'Operasi tamat sepenuhnya pada pukul 1:30:50 tengah hari'
normalizer.normalize(s, normalize_time = True)
[93]:
{'normalize': 'Operasi tamat sepenuhnya pada pukul satu tiga puluh minit lima puluh saat tengah hari',
 'date': {'1:30:50': datetime.datetime(2022, 9, 1, 1, 30, 50)},
 'money': {}}
[94]:
s = 'Operasi tamat sepenuhnya pada pukul 1:30:50 tengah hari'
normalizer.normalize(s, normalize_time = False)
[94]:
{'normalize': 'Operasi tamat sepenuhnya pada pukul 01.30:50 tengah hari',
 'date': {'1:30:50': datetime.datetime(2022, 9, 1, 1, 30, 50)},
 'money': {}}
[95]:
normalizer.normalize('2:01pm')
[95]:
{'normalize': 'pukul empat belas satu minit',
 'date': {'2:01pm': datetime.datetime(2022, 9, 1, 14, 1)},
 'money': {}}
[96]:
normalizer.normalize('2:01pm', normalize_time = False)
[96]:
{'normalize': 'pukul 14.01',
 'date': {'2:01pm': datetime.datetime(2022, 9, 1, 14, 1)},
 'money': {}}
[97]:
normalizer.normalize('2AM')
[97]:
{'normalize': 'pukul dua',
 'date': {'2am': datetime.datetime(2022, 9, 1, 2, 0)},
 'money': {}}
[98]:
normalizer.normalize('2AM', normalize_time = False)
[98]:
{'normalize': 'pukul 02',
 'date': {'2am': datetime.datetime(2022, 9, 1, 2, 0)},
 'money': {}}
[99]:
normalizer.normalize('2pm')
[99]:
{'normalize': 'pukul empat belas',
 'date': {'2pm': datetime.datetime(2022, 9, 1, 14, 0)},
 'money': {}}
[100]:
normalizer.normalize('2pm', normalize_time = False)
[100]:
{'normalize': 'pukul 14',
 'date': {'2pm': datetime.datetime(2022, 9, 1, 14, 0)},
 'money': {}}

Normalize emoji#

  1. if True, 🔥 -> emoji api

Simply normalizer.normalize(string, normalize_emoji = True), default is True.

[101]:
normalizer = malaya.normalize.normalizer()
[102]:
s = 'u are really damn hot 🔥'
normalizer.normalize(s, translator = nmt_func,
                     language_detection_word = language_detection_word_func)
[102]:
{'normalize': 'awak sangat panas, emoji api', 'date': {}, 'money': {}}

Normalize elongated#

Any typical elongated word, eg, pppeeddaaaasss - > pedas, but this elongated normalization required to pass speller parameter to perform the best.

Simply normalizer.normalize(string, normalize_elongated = True), default is True.

[103]:
normalizer = malaya.normalize.normalizer(corrector)
[104]:
normalizer.normalize('saayyyyaa ttttaaak ssssukaaa makaan pedas')
[104]:
{'normalize': 'saya tidak suka makan pedas', 'date': {}, 'money': {}}
[105]:
normalizer.normalize('saayyyyaa ttttaaak ssssukaaa makaan pedas', normalize_elongated = False)
[105]:
{'normalize': 'saayyaa titik sesuka makan pedas', 'date': {}, 'money': {}}

Normalize hingga#

If True,

  1. 2011 - 2019 -> dua ribu sebelas hingga dua ribu sembilan belas.

  2. 2011.01-2019 - > dua ribu sebelas perpuluhan kosong satu hingga dua ribu sembilan belas.

Simply normalizer.normalize(string, normalize_hingga = True), default is True.

[106]:
normalizer = malaya.normalize.normalizer()
[107]:
normalizer.normalize('2011 - 2019', normalize_hingga = True)
[107]:
{'normalize': 'dua ribu sebelas hingga dua ribu sembilan belas',
 'date': {},
 'money': {}}
[108]:
normalizer.normalize('2011 - 2019', normalize_hingga = False)
[108]:
{'normalize': '2011 - 2019', 'date': {}, 'money': {}}
[109]:
normalizer.normalize('2011 - 2019', normalize_hingga = False, normalize_cardinal = False, normalize_ordinal = False)
[109]:
{'normalize': '2011 - 2019', 'date': {}, 'money': {}}

Normalize pada hari bulan#

If True,

  1. pada 10/4 -> pada sepuluh hari bulan empat.

Simply normalizer.normalize(string, normalize_pada_hari_bulan = True), default is True.

[110]:
normalizer = malaya.normalize.normalizer()
[111]:
normalizer.normalize('pada 10/   4', normalize_pada_hari_bulan = True)
[111]:
{'normalize': 'pada sepuluh hari bulan empat', 'date': {}, 'money': {}}
[112]:
normalizer.normalize('pada 10/4', normalize_pada_hari_bulan = False)
[112]:
{'normalize': 'pada sepuluh per empat', 'date': {}, 'money': {}}

Normalize fraction#

If True,

  1. 10/4 -> sepuluh per empat.

Simply normalizer.normalize(string, normalize_fraction = True), default is True.

[113]:
normalizer = malaya.normalize.normalizer()
[114]:
normalizer.normalize('10/4', normalize_fraction = True)
[114]:
{'normalize': 'sepuluh per empat', 'date': {}, 'money': {}}
[115]:
normalizer.normalize('201231.1 / 4', normalize_fraction = True)
[115]:
{'normalize': 'dua ratus satu ribu dua ratus tiga puluh satu perpuluhan satu per empat',
 'date': {},
 'money': {}}
[116]:
normalizer.normalize('201231.1 / 4', normalize_fraction = False)
[116]:
{'normalize': '201231.1 / 4', 'date': {}, 'money': {}}
[117]:
normalizer.normalize('201231.1 / 4', normalize_fraction = False, normalize_cardinal = False,
                    normalize_ordinal = False)
[117]:
{'normalize': '201231.1 / 4', 'date': {}, 'money': {}}

Normalize money#

If True,

  1. RM10.5 -> sepuluh ringgit lima puluh sen.

  2. rm 10.5 sen -> sepuluh ringgit lima puluh sen.

  3. 20.2m ringgit -> dua puluh juta dua ratus ribu ringgit.

And so much more!

Simply normalizer.normalize(string, normalize_money = True), default is True.

[118]:
normalizer = malaya.normalize.normalizer()
[119]:
normalizer.normalize('RM10.5')
[119]:
{'normalize': 'sepuluh ringgit lima puluh sen',
 'date': {},
 'money': {'rm10.5': 'RM10.5'}}
[120]:
normalizer.normalize('rm 10.5 sen')
[120]:
{'normalize': 'sepuluh ringgit lima puluh sen',
 'date': {},
 'money': {'rm 10.5': 'RM10.5'}}
[121]:
normalizer.normalize('1015 sen')
[121]:
{'normalize': 'sepuluh ringgit lima belas sen',
 'date': {},
 'money': {'1015 sen': 'RM10.15'}}
[122]:
normalizer.normalize('rm10.4m')
[122]:
{'normalize': 'sepuluh juta empat ratus ribu ringgit',
 'date': {},
 'money': {'rm10.4m': 'RM10400000.0'}}
[123]:
normalizer.normalize('$10.4K')
[123]:
{'normalize': 'sepuluh ribu empat ratus dollar',
 'date': {},
 'money': {'$10.4k': '$10400.0'}}
[124]:
normalizer.normalize('22.5123334k ringgit')
[124]:
{'normalize': 'dua puluh dua ribu lima ratus dua belas ringgit tiga ratus tiga puluh empat sen',
 'date': {},
 'money': {'22.512334k ringgit': 'RM22512.334'}}
[125]:
normalizer.normalize('saya ada 20.2m ringgit')
[125]:
{'normalize': 'saya ada dua puluh juta dua ratus ribu ringgit',
 'date': {},
 'money': {'20.2m ringgit': 'RM20200000.0'}}
[126]:
normalizer.normalize('22.5123334k ringgit', normalize_money = False)
[126]:
{'normalize': '22.512334k ringgit',
 'date': {},
 'money': {'22.512334k ringgit': 'RM22512.334'}}

Normalize units#

Able to normalize temperature, distance, volume, duration and weight units.

If True,

  1. 61.2 kg -> enam puluh satu perpuluhan dua kilogram.

  2. 61.2km -> sepuluh ringgit lima puluh sen.

And so much more!

Simply normalizer.normalize(string, normalize_units = True), default is True.

[127]:
normalizer = malaya.normalize.normalizer()
[128]:
normalizer.normalize('61.2    KG')
[128]:
{'normalize': 'enam puluh satu perpuluhan dua kilogram',
 'date': {},
 'money': {}}
[129]:
normalizer.normalize('61.2km')
[129]:
{'normalize': 'enam puluh satu perpuluhan dua kilometer',
 'date': {},
 'money': {}}
[130]:
normalizer.normalize('61.2c')
[130]:
{'normalize': 'enam puluh satu perpuluhan dua celsius',
 'date': {},
 'money': {}}
[131]:
normalizer.normalize('61.2 ml')
[131]:
{'normalize': 'enam puluh satu perpuluhan dua milliliter',
 'date': {},
 'money': {}}
[132]:
normalizer.normalize('61.2 l')
[132]:
{'normalize': 'enam puluh satu perpuluhan dua liter', 'date': {}, 'money': {}}
[133]:
normalizer.normalize('61.2 jam')
[133]:
{'normalize': 'enam puluh satu perpuluhan dua jam',
 'date': {'61:2 jam': datetime.datetime(2022, 9, 1, 22, 5, 39, 432217)},
 'money': {}}
[134]:
normalizer.normalize('61.2 hari')
[134]:
{'normalize': '61.2 hari', 'date': {}, 'money': {}}

Normalize percents#

  1. If True, 61.2% -> enam puluh satu perpuluhan dua peratus.

Simply normalizer.normalize(string, normalize_percent = True), default is True.

[135]:
normalizer = malaya.normalize.normalizer()
[136]:
normalizer.normalize('61.2%')
[136]:
{'normalize': 'enam puluh satu perpuluhan dua peratus',
 'date': {},
 'money': {}}
[137]:
normalizer.normalize('61.2%', normalize_percent = False)
[137]:
{'normalize': '61.2%', 'date': {}, 'money': {}}

Normalize IC#

  1. If True, 911111-01-1111 -> sembilan satu satu satu satu satu sempang kosong satu sempang satu satu satu satu.

Simply normalizer.normalize(string, normalize_ic = True), default is True.

[138]:
normalizer = malaya.normalize.normalizer()
[139]:
normalizer.normalize('911111-01-1111')
[139]:
{'normalize': 'sembilan satu satu satu satu satu sempang kosong satu sempang satu satu satu satu',
 'date': {},
 'money': {}}
[140]:
normalizer.normalize('911111-01-1111', normalize_ic = False)
[140]:
{'normalize': '911111-01-1111', 'date': {}, 'money': {}}

Normalize Numbers#

If the number starts with 0, will convert into string representation.

  1. If True, 0123 -> kosong satu dua tiga.

Simply normalizer.normalize(string, normalize_number = True), default is True.

[141]:
normalizer = malaya.normalize.normalizer()
[142]:
normalizer.normalize('01234')
[142]:
{'normalize': 'kosong satu dua tiga empat', 'date': {}, 'money': {}}
[143]:
normalizer.normalize('01234', normalize_number = False)
[143]:
{'normalize': '01234', 'date': {}, 'money': {}}

Normalize x kali#

If the word ends with x and before that is a digit, will convert into string representation.

  1. If True, 10x -> sepuluh kali.

  2. If False, 10x -> 10 kali.

Simply normalizer.normalize(string, normalize_x_kali = True), default is True.

[144]:
normalizer = malaya.normalize.normalizer()
[145]:
normalizer.normalize('saya sokong 10x')
[145]:
{'normalize': 'saya sokong sepuluh kali', 'date': {}, 'money': {}}
[146]:
normalizer.normalize('saya sokong 10x', normalize_x_kali = False)
[146]:
{'normalize': 'saya sokong 10 kali', 'date': {}, 'money': {}}

Normalize Cardinals#

Any numbers will convert using malaya.num2word.to_cardinal.

  1. If True, 123 -> seratus dua puluh tiga.

Simply normalizer.normalize(string, normalize_cardinal = True), default is True.

[147]:
normalizer = malaya.normalize.normalizer()
[148]:
normalizer.normalize('123')
[148]:
{'normalize': '123', 'date': {}, 'money': {}}
[149]:
normalizer.normalize('123.123421231')
[149]:
{'normalize': '123.123421231', 'date': {}, 'money': {}}
[150]:
normalizer.normalize('123.123421231', normalize_cardinal = False)
[150]:
{'normalize': '123.123421231', 'date': {}, 'money': {}}

Normalize Ordinals#

Any numbers will convert using malaya.num2word.to_cardinal.

  1. If True, 123 -> keseratus dua puluh tiga.

  2. Able to normalize roman numbers, ke-XXI -> kedua puluh satu.

Simply normalizer.normalize(string, normalize_ordinal = True), default is True.

[151]:
normalizer.normalize('123', normalize_cardinal = False)
[151]:
{'normalize': '123', 'date': {}, 'money': {}}
[152]:
normalizer.normalize('123', normalize_cardinal = False, normalize_ordinal = False)
[152]:
{'normalize': '123', 'date': {}, 'money': {}}
[153]:
normalizer.normalize('ke-XXI')
[153]:
{'normalize': 'kedua puluh satu', 'date': {}, 'money': {}}

Normalize entity#

normalize entities, only effect date, datetime, time and money patterns string only

Simply normalizer.normalize(string, normalize_entity = True), default is True.

[154]:
string = 'boleh dtg 8pagi esok tak atau minggu depan? 2 oktober 2019 2pm, tlong bayar rm 3.2k sekali tau'
[155]:
normalizer = malaya.normalize.normalizer(corrector)
[156]:
normalizer.normalize(string)
[156]:
{'normalize': 'boleh datang pukul lapan esok tidak atau minggu depan ? dua Oktober dua ribu sembilan belas pukul empat belas , tolong bayar tiga ribu dua ratus ringgit sekali tahu',
 'date': {'minggu depan': datetime.datetime(2022, 9, 9, 0, 5, 41, 627111),
  '2 oktober 2019 2pm': datetime.datetime(2019, 10, 2, 14, 0),
  '8AM esok': datetime.datetime(2022, 9, 3, 8, 0)},
 'money': {'rm 3.2k': 'RM3200.0'}}
[157]:
normalizer.normalize(string, normalize_entity = False)
[157]:
{'normalize': 'boleh datang pukul lapan esok tidak atau minggu depan ? dua Oktober dua ribu sembilan belas pukul empat belas , tolong bayar tiga ribu dua ratus ringgit sekali tahu',
 'date': {},
 'money': {}}
[158]:
normalizer.normalize(string, normalize_date = False, normalize_time = False, normalize_money = False,
                    normalize_cardinal = False, normalize_ordinal = False)
[158]:
{'normalize': 'boleh datang pukul 08 esok tidak atau minggu depan ? 02/10/2019 pukul 14 , tolong bayar rm 3.2k sekali tahu',
 'date': {'minggu depan': datetime.datetime(2022, 9, 9, 0, 5, 41, 648618),
  '2 oktober 2019 2pm': datetime.datetime(2019, 10, 2, 14, 0),
  '8AM esok': datetime.datetime(2022, 9, 3, 8, 0)},
 'money': {'rm 3.2k': 'RM3200.0'}}