Rules based Normalizer
Contents
Rules based 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 3.07 s, sys: 3.56 s, total: 6.62 s
Wall time: 2.34 s
[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#
normalizer can load any spelling correction model, eg,
malaya.spelling_correction.probability.load
, ormalaya.spelling_correction.transformer.load
.normalizer can load any stemmer model, eg,
malaya.stem.deep_model
.
def load(
speller: Callable = None,
stemmer: Callable = None,
**kwargs,
):
"""
Load a Normalizer using any spelling correction model.
Parameters
----------
speller: Callable, optional (default=None)
function to correct spelling, must have `correct` or `normalize_elongated` method.
stemmer: Callable, optional (default=None)
function to stem, must have `stem_word` method.
If provide stemmer, will accurately to stem kata imbuhan akhir.
Returns
-------
result: malaya.normalizer.rules.Normalizer class
"""
[4]:
lm = malaya.language_model.kenlm(model = 'bahasa-wiki-news')
[5]:
corrector = malaya.spelling_correction.probability.load(language_model = lm)
[6]:
stemmer = malaya.stem.deep_model('noisy')
2022-12-17 15:30:13.238026: 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-12-17 15:30:13.242774: E tensorflow/stream_executor/cuda/cuda_driver.cc:271] failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected
2022-12-17 15:30:13.242804: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:169] retrieving CUDA diagnostic information for host: husein-MS-7D31
2022-12-17 15:30:13.242807: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:176] hostname: husein-MS-7D31
2022-12-17 15:30:13.242879: 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-12-17 15:30:13.243104: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:204] kernel reported version is: 470.161.3
[7]:
normalizer = malaya.normalizer.rules.load(corrector, stemmer)
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,
text_scorer: Callable = None,
text_scorer_window: int = 2,
not_a_word_threshold: float = 1e-4,
dateparser_settings={'TIMEZONE': 'GMT+8'},
**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
text_scorer: Callable, optional (default=None)
function to validate upper word.
If lower case score is higher or equal than upper case score, will choose lower case.
text_scorer_window: int, optional (default=2)
size of lookback and lookforward to validate upper word.
not_a_word_threshold: float, optional (default=1e-4)
assume a word is not a human word if score lower than `not_a_word_threshold`.
only usable if passed `text_scorer` parameter.
dateparser_settings: Dict, optional (default={'TIMEZONE': 'GMT+8'})
default dateparser setting, check support settings at https://dateparser.readthedocs.io/en/latest/
Returns
-------
result: {'normalize', 'date', 'money'}
"""
To get better english checker, we prefer to use https://pyenchant.github.io/pyenchant/
[8]:
import enchant
d = enchant.Dict('en_US')
is_english = lambda x: d.check(x)
is_english('lifestyle')
[8]:
True
[9]:
string = 'boleh dtg 8pagi esok tak atau minggu depan? 2 oktober 2019 2pm, tlong bayar rm 3.2k sekali tau'
[10]:
normalizer.normalize(string)
[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': {'minggu depan': datetime.datetime(2022, 12, 24, 15, 30, 52, 787504),
'8AM esok': datetime.datetime(2022, 12, 18, 8, 0),
'2 oktober 2019 2pm': datetime.datetime(2019, 10, 2, 14, 0)},
'money': {'rm 3.2k': 'RM3200.0'}}
[11]:
normalizer.normalize(string, normalize_entity = False)
[11]:
{'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': {}}
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 itu . peliklah , pada', 'date': {}, 'money': {}}
{'normalize': 'saya memang-memang tak suka makan 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, 12, 17, 13, 30, 55, 904546)}, 'money': {}}
{'normalize': 'awak sangat hot ya , 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 bilas 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 bilas balik , emoji berguling di lantai ketawa , emoji berguling di lantai ketawa , emoji berguling di lantai ketawa', 'date': {}, 'money': {}}
{'normalize': 'Pemimpin yang hebat , panah-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)
[14]:
translator('pain'), translator('aduh')
[14]:
('kesakitan', 'aduh')
[15]:
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': {}}
[16]:
print(normalizer.normalize(string2, translator = translator))
{'normalize': 'saya memang-memang tak suka makan 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,
[17]:
translator('love'), translator('them'), translator('pain')
[17]:
('love', 'them', 'kesakitan')
[18]:
nmt = malaya.translation.en_ms.transformer(model = 'small')
[19]:
nmt_func = lambda x: nmt.greedy_decoder([x])[0]
[20]:
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': {}}
[21]:
print(normalizer.normalize(string2, translator = nmt_func))
{'normalize': 'saya memang-memang tak suka makan 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.
[22]:
nmt = malaya.translation.en_ms.transformer(model = 'noisy-base')
nmt_func = lambda x: nmt.greedy_decoder([x])[0]
[23]:
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.
[24]:
language_detection_word_func = lambda x: lang_word_model.predict(x)
[25]:
s = 'u ni, talk properly lah'
[26]:
normalizer.normalize(s, translator = nmt_func,
check_english_func = is_english)
[26]:
{'normalize': 'awak ini , bercakap betul lah', 'date': {}, 'money': {}}
[27]:
normalizer.normalize(s, translator = nmt_func, language_detection_word = language_detection_word_func,
check_english_func = is_english)
[27]:
{'normalize': 'awak ini , bercakap dengan betul lah', 'date': {}, 'money': {}}
[28]:
s = 'This looks like awak, but in a less formal kind of way, still comel'
[29]:
normalizer.normalize(s, translator = nmt_func,
check_english_func = is_english)
[29]:
{'normalize': 'This rupa seperti awak , tetapi dalam a kurang formal jenis dari cara , masih comel',
'date': {},
'money': {}}
[30]:
normalizer.normalize(s, translator = nmt_func, language_detection_word = language_detection_word_func,
check_english_func = is_english)
[30]:
{'normalize': 'Ini kelihatan seperti awak , tetapi dalam cara yang kurang formal, masih comel',
'date': {},
'money': {}}
[31]:
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 👍"
[32]:
normalizer.normalize(s, translator = nmt_func,
check_english_func = is_english)
[32]:
{'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': {}}
[33]:
normalizer.normalize(s, translator = nmt_func, language_detection_word = language_detection_word_func,
check_english_func = is_english)
[33]:
{'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': {}}
[34]:
s = 'Hello gais, boleh tolong recommend bengkel ketuk yang okay near Wangsa Maju / nearby? Kereta bf i pulak kepek langgar dinding hahahha'
[35]:
normalizer.normalize(s, translator = nmt_func,
check_english_func = is_english)
[35]:
{'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': {}}
[36]:
normalizer.normalize(s, translator = nmt_func, language_detection_word = language_detection_word_func,
check_english_func = is_english)
[36]:
{'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': {}}
[37]:
s = 'Me after seeing this video: mm dapnya burger benjo extra mayo'
[38]:
normalizer.normalize(s, translator = nmt_func,
check_english_func = is_english)
[38]:
{'normalize': 'Me selepas melihat ini video : mm sedapnya burger benjo tambahan mayo',
'date': {},
'money': {}}
[39]:
normalizer.normalize(s, translator = nmt_func, language_detection_word = language_detection_word_func,
check_english_func = is_english)
[39]:
{'normalize': 'Saya selepas melihat video ini: mm sedapnya burger benjo mayo tambahan',
'date': {},
'money': {}}
[40]:
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:'
[41]:
normalizer.normalize(s, translator = nmt_func,
check_english_func = is_english)
[41]:
{'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, 12, 16, 15, 31, 52, 625519)},
'money': {}}
[42]:
normalizer.normalize(s, translator = nmt_func, language_detection_word = language_detection_word_func,
check_english_func = is_english)
[42]:
{'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, 12, 16, 15, 31, 52, 898151)},
'money': {}}
Use segmenter#
[43]:
print(normalizer.normalize('saya taksuka ayam, tapi saya sukaikan'))
{'normalize': 'saya taksuka ayam , tetapi saya sukaikan', 'date': {}, 'money': {}}
[44]:
segmenter = malaya.segmentation.transformer(model = 'small')
[45]:
segmenter_func = lambda x: segmenter.greedy_decoder([x])[0]
[46]:
print(normalizer.normalize('saya taksuka ayam, tapi saya sukaikan', segmenter = segmenter_func))
{'normalize': 'saya tidak suka ayam , tetapi saya suka ikan', 'date': {}, 'money': {}}
Use stemmer#
By default normalizer will ignore kata imbuhan akhir, so to stem kata imbuhan akhir, provide stemmer
parameter. We can use better stemmer model like malaya.stem.deep_model(model = 'noisy')
.
[47]:
normalizer_without_stem = malaya.normalize.normalizer(corrector)
[48]:
normalizer.normalize(string12)
[48]:
{'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': {}}
[49]:
normalizer_without_stem.normalize(string12, stemmer = stemmer)
[49]:
{'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': {}}
[50]:
normalizer.normalize(string13)
[50]:
{'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': {}}
[51]:
normalizer_without_stem.normalize(string13)
[51]:
{'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': {}}
[52]:
normalizer.normalize('seadil2nya')
[52]:
{'normalize': 'seadil-adilnya', 'date': {}, 'money': {}}
[53]:
normalizer_without_stem.normalize('seadil2nya')
[53]:
{'normalize': 'seadilnya', 'date': {}, 'money': {}}
Validate uppercase#
Problem with social media text, people sometime do uppercase for kata nama am, so it will skip to do spelling correction. So to fix that, we need to pass text_scorer
parameter.
[54]:
import math
math.exp(lm.score('hi'))
[54]:
0.00012796330028274245
[55]:
text_scorer = lambda x: lm.score(x)
[56]:
t = 'Konon nak beat the crowd, skali Kedai x bukak ahaha @ Chef Ammar Xpress Souk Cafe https://t.co/QrcBlq6ftV'
normalizer.normalize(t, text_scorer = text_scorer)
[56]:
{'normalize': 'Konon nak beat the crowd , sekali kedai tak bukak haha @ Chef Ammar Xpress Souk Cafe https://t.co/QrcBlq6ftV',
'date': {},
'money': {}}
[57]:
t = '8 Emiten Cum Dividen Pekan Ini, Jangan Ketinggalan https://t.co/9BV9OqqJUG'
normalizer.normalize(t, text_scorer = text_scorer)
[57]:
{'normalize': '8 emiten cum dividen Pekan Ini , jangan ketinggalan https://t.co/9BV9OqqJUG',
'date': {},
'money': {}}
Validate non human word#
A non human word like kasdsahdas
or kasweadsa
, it can be a laugh pattern or a cursing pattern, so to validate it we can use any text scoring. If the score lesser than the threshold, will skip to do spelling correction.
[58]:
normalizer.normalize('bodo la siallll hasdsadwq', text_scorer = text_scorer)
[58]:
{'normalize': 'bodoh lah sial hasdsadwq', 'date': {}, 'money': {}}
Skip spelling correction#
Simply pass None
to speller
to normalizer = malaya.normalize.normalizer
. By default it is None
.
[59]:
normalizer = malaya.normalize.normalizer(corrector)
without_corrector_normalizer = malaya.normalize.normalizer(None)
[60]:
normalizer.normalize(string2, normalize_elongated = False)
[60]:
{'normalize': 'saya memang-memang tak suka makanan HUSEIN kampung tempat , saya love them . pelikla saya',
'date': {},
'money': {}}
[61]:
without_corrector_normalizer.normalize(string2)
[61]:
{'normalize': 'saya memang-memang tak suka mknn HUSEIN kampng tmpat , saya love them . pelikla 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
[62]:
normalizer = malaya.normalize.normalizer(corrector)
skip_date_normalizer = malaya.normalize.normalizer(corrector, date = False)
[63]:
normalizer.normalize('tarikh program tersebut 14 mei')
[63]:
{'normalize': 'tarikh program tersebut empat belas Mei dua ribu dua puluh dua',
'date': {'14 mei': datetime.datetime(2022, 5, 14, 0, 0)},
'money': {}}
[64]:
skip_date_normalizer.normalize('tarikh program tersebut 14 mei')
[64]:
{'normalize': 'tarikh program tersebut 14 mei',
'date': {'14 mei': datetime.datetime(2022, 5, 14, 0, 0)},
'money': {}}
Normalize text#
If True,
replace
xkisah
->tak kisah
.replace
berehatlh
->berehatlah
.replace
seadil2nya
->seadil-adilnya
.apply spelling correction if passed
speller
parameter.standardize laughing pattern.
standardize mengeluh pattern.
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
.
[65]:
normalizer = malaya.normalize.normalizer(corrector, stemmer)
[66]:
normalizer.normalize('xkisah')
[66]:
{'normalize': 'tak kisah', 'date': {}, 'money': {}}
[67]:
normalizer.normalize('berehatlh')
[67]:
{'normalize': 'berehatlah', 'date': {}, 'money': {}}
[68]:
normalizer.normalize('seadil2nya')
[68]:
{'normalize': 'seadil-adilnya', 'date': {}, 'money': {}}
[69]:
normalizer.normalize('bukan2')
[69]:
{'normalize': 'bukan-bukan', 'date': {}, 'money': {}}
[70]:
normalizer.normalize('bukan2 wkwkwkw')
[70]:
{'normalize': 'bukan-bukan haha', 'date': {}, 'money': {}}
[71]:
normalizer.normalize('bukan2 haih')
[71]:
{'normalize': 'bukan-bukan aduh', 'date': {}, 'money': {}}
[72]:
normalizer.normalize('dia sakai hhihihu')
[72]:
{'normalize': 'dia sakai haha', 'date': {}, 'money': {}}
[73]:
normalizer.normalize('hais sorrylah')
[73]:
{'normalize': 'aduh maaflah', 'date': {}, 'money': {}}
[74]:
normalizer.normalize('Dr yahaya')
[74]:
{'normalize': 'Doktor yahaya', 'date': {}, 'money': {}}
[75]:
normalizer.normalize('mulakn slh org boleh ,bila geng tuh kena slhkn jgk xboleh trima')
[75]:
{'normalize': 'mulakan salah orang boleh , bila geng itu kena salahkan juga tak boleh terima',
'date': {},
'money': {}}
[76]:
normalizer.normalize('aah la, bodo btul')
[76]:
{'normalize': 'betul lah , bodoh betul', 'date': {}, 'money': {}}
Normalize url#
Let say you have an url
word, example, https://huseinhouse.com
, this parameter going to,
If True,
replace
://
with empty string.replace
.
withdot
.replace digits with string representation.
Capitalize
https
,http
, andwww
.
Simply normalizer.normalize(string, normalize_url = True)
, default is False
.
[77]:
normalizer = malaya.normalize.normalizer()
[78]:
normalizer.normalize('web saya ialah https://huseinhouse.com')
[78]:
{'normalize': 'web saya ialah https://huseinhouse.com',
'date': {},
'money': {}}
[79]:
normalizer.normalize('web saya ialah https://huseinhouse.com', normalize_url = True)
[79]:
{'normalize': 'web saya ialah HTTPS huseinhouse dot com',
'date': {},
'money': {}}
[80]:
normalizer.normalize('web saya ialah https://huseinhouse02934.com', normalize_url = True)
[80]:
{'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,
replace
://
with empty string.replace
.
withdot
.replace
@
withdi
.replace digits with string representation.
Simply normalizer.normalize(string, normalize_email = True)
, default is False
.
[81]:
normalizer = malaya.normalize.normalizer()
[82]:
normalizer.normalize('email saya ialah husein.zol05@gmail.com')
[82]:
{'normalize': 'email saya ialah husein.zol05@gmail.com',
'date': {},
'money': {}}
[83]:
normalizer.normalize('email saya ialah husein.zol05@gmail.com', normalize_email = True)
[83]:
{'normalize': 'email saya ialah husein dot zol kosong lima di gmail dot com',
'date': {},
'money': {}}
Normalize year#
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
.
Simply normalizer.normalize(string, normalize_year = True)
, default is True
.
[84]:
normalizer = malaya.normalize.normalizer()
[85]:
normalizer.normalize('$400 pada tahun 1998 berbanding lebih $1000')
[85]:
{'normalize': 'empat ratus dollar pada tahun sembilan belas sembilan puluh lapan berbanding lebih seribu dollar',
'date': {},
'money': {'$400 ': '$400', '$1000': '$1000'}}
[86]:
normalizer.normalize('$400 pada 1970-an berbanding lebih $1000')
[86]:
{'normalize': 'empat ratus dollar pada sembilan belas tujuh puluhan berbanding lebih seribu dollar',
'date': {},
'money': {'$400 ': '$400', '$1000': '$1000'}}
[87]:
normalizer.normalize('$400 pada tahun 1970-an berbanding lebih $1000')
[87]:
{'normalize': 'empat ratus dollar pada tahun sembilan belas tujuh puluhan berbanding lebih seribu dollar',
'date': {},
'money': {'$400 ': '$400', '$1000': '$1000'}}
[88]:
normalizer.normalize('$400 pada tahun 1998 berbanding lebih $1000', normalize_year = False)
[88]:
{'normalize': 'empat ratus dollar pada tahun 1998 berbanding lebih seribu dollar',
'date': {},
'money': {'$400 ': '$400', '$1000': '$1000'}}
Normalize telephone#
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
.
[89]:
normalizer = malaya.normalize.normalizer()
[90]:
normalizer.normalize('no saya 012-1234567')
[90]:
{'normalize': 'no saya kosong satu dua, satu dua tiga empat lima enam tujuh',
'date': {},
'money': {}}
[91]:
normalizer.normalize('no saya 012-1234567', normalize_telephone = False)
[91]:
{'normalize': 'no saya 012-1234567', 'date': {}, 'money': {}}
Normalize date#
if True,
01/12/2001
->satu disember dua ribu satu
.if False, normalize date string to
%d/%m/%y
.
Simply normalizer.normalize(string, normalize_date = True)
, default is True
.
[92]:
normalizer = malaya.normalize.normalizer()
[93]:
normalizer.normalize('saya akan gerak pada 1/11/2021')
[93]:
{'normalize': 'saya akan gerak pada sebelas Januari dua ribu dua puluh satu',
'date': {'1/11/2021': datetime.datetime(2021, 1, 11, 0, 0)},
'money': {}}
[94]:
normalizer.normalize('saya akan gerak pada 1/11/2021', normalize_date = False)
[94]:
{'normalize': 'saya akan gerak pada 11/01/2021',
'date': {'1/11/2021': datetime.datetime(2021, 1, 11, 0, 0)},
'money': {}}
[95]:
normalizer.normalize('1 nov 2019')
[95]:
{'normalize': 'satu November dua ribu sembilan belas',
'date': {'1 nov 2019': datetime.datetime(2019, 11, 1, 0, 0)},
'money': {}}
[96]:
normalizer.normalize('1 nov 2019', normalize_date = False)
[96]:
{'normalize': '01/11/2019',
'date': {'1 nov 2019': datetime.datetime(2019, 11, 1, 0, 0)},
'money': {}}
[97]:
normalizer.normalize('januari 1 1996')
[97]:
{'normalize': 'satu Januari seribu sembilan ratus sembilan puluh enam',
'date': {'januari 1 1996': datetime.datetime(1996, 1, 1, 0, 0)},
'money': {}}
[98]:
normalizer.normalize('januari 1 1996', normalize_date = False)
[98]:
{'normalize': '01/01/1996',
'date': {'januari 1 1996': datetime.datetime(1996, 1, 1, 0, 0)},
'money': {}}
[99]:
normalizer.normalize('januari 2019')
[99]:
{'normalize': 'tujuh belas Januari dua ribu sembilan belas',
'date': {'januari 2019': datetime.datetime(2019, 1, 17, 0, 0)},
'money': {}}
[100]:
normalizer.normalize('januari 2019', normalize_date = False)
[100]:
{'normalize': '17/01/2019',
'date': {'januari 2019': datetime.datetime(2019, 1, 17, 0, 0)},
'money': {}}
Normalize time#
if True,
pukul 2.30
->pukul dua tiga puluh minit
.if False
2:01pm
->pukul 14.01
.
Simply normalizer.normalize(string, normalize_time = True)
, default is True
.
[101]:
normalizer = malaya.normalize.normalizer()
[102]:
s = 'Operasi tamat sepenuhnya pada pukul 1.30 tengah hari'
normalizer.normalize(s, normalize_time = True)
[102]:
{'normalize': 'Operasi tamat sepenuhnya pada pukul satu tiga puluh minit tengah hari',
'date': {},
'money': {}}
[103]:
s = 'Operasi tamat sepenuhnya pada pukul 1.30 tengah hari'
normalizer.normalize(s, normalize_time = False)
[103]:
{'normalize': 'Operasi tamat sepenuhnya pada pukul 01.30 tengah hari',
'date': {},
'money': {}}
[104]:
s = 'Operasi tamat sepenuhnya pada pukul 1:30:50 tengah hari'
normalizer.normalize(s, normalize_time = True)
[104]:
{'normalize': 'Operasi tamat sepenuhnya pada pukul satu tiga puluh minit lima puluh saat tengah hari',
'date': {'1:30:50': datetime.datetime(2022, 12, 17, 1, 30, 50)},
'money': {}}
[105]:
s = 'Operasi tamat sepenuhnya pada pukul 1:30:50 tengah hari'
normalizer.normalize(s, normalize_time = False)
[105]:
{'normalize': 'Operasi tamat sepenuhnya pada pukul 01.30:50 tengah hari',
'date': {'1:30:50': datetime.datetime(2022, 12, 17, 1, 30, 50)},
'money': {}}
[106]:
normalizer.normalize('2:01pm')
[106]:
{'normalize': 'pukul empat belas satu minit',
'date': {'2:01pm': datetime.datetime(2022, 12, 17, 14, 1)},
'money': {}}
[107]:
normalizer.normalize('2:01pm', normalize_time = False)
[107]:
{'normalize': 'pukul 14.01',
'date': {'2:01pm': datetime.datetime(2022, 12, 17, 14, 1)},
'money': {}}
[108]:
normalizer.normalize('2AM')
[108]:
{'normalize': 'pukul dua',
'date': {'2am': datetime.datetime(2022, 12, 17, 2, 0)},
'money': {}}
[109]:
normalizer.normalize('2AM', normalize_time = False)
[109]:
{'normalize': 'pukul 02',
'date': {'2am': datetime.datetime(2022, 12, 17, 2, 0)},
'money': {}}
[110]:
normalizer.normalize('2pm')
[110]:
{'normalize': 'pukul empat belas',
'date': {'2pm': datetime.datetime(2022, 12, 17, 14, 0)},
'money': {}}
[111]:
normalizer.normalize('2pm', normalize_time = False)
[111]:
{'normalize': 'pukul 14',
'date': {'2pm': datetime.datetime(2022, 12, 17, 14, 0)},
'money': {}}
Normalize emoji#
if True,
🔥
->emoji api
Simply normalizer.normalize(string, normalize_emoji = True)
, default is True
.
[112]:
normalizer = malaya.normalize.normalizer()
[113]:
s = 'u are really damn hot 🔥'
normalizer.normalize(s, translator = nmt_func,
language_detection_word = language_detection_word_func)
[113]:
{'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
.
[114]:
normalizer = malaya.normalize.normalizer(corrector, stemmer)
[115]:
normalizer.normalize('saayyyyaa ttttaaak ssssukaaa makaan pedas')
[115]:
{'normalize': 'saya tidak suka makan pedas', 'date': {}, 'money': {}}
[116]:
normalizer.normalize('saayyyyaa ttttaaak ssssukaaa makaan pedas', normalize_elongated = False)
[116]:
{'normalize': 'saayyyyaa ttttaaak ssssukaaa makaan pedas',
'date': {},
'money': {}}
Normalize hingga#
If True,
2011 - 2019
->dua ribu sebelas hingga dua ribu sembilan belas
.2011.01-2019
- >dua ribu sebelas perpuluhan kosong satu hingga dua ribu sembilan belas
.
Simply normalizer.normalize(string, normalize_hingga = True)
, default is True
.
[117]:
normalizer = malaya.normalize.normalizer()
[118]:
normalizer.normalize('2011 - 2019', normalize_hingga = True)
[118]:
{'normalize': 'dua ribu sebelas hingga dua ribu sembilan belas',
'date': {},
'money': {}}
[119]:
normalizer.normalize('2011 - 2019', normalize_hingga = False)
[119]:
{'normalize': '2011 - 2019', 'date': {}, 'money': {}}
[120]:
normalizer.normalize('2011 - 2019', normalize_hingga = False, normalize_cardinal = False, normalize_ordinal = False)
[120]:
{'normalize': '2011 - 2019', 'date': {}, 'money': {}}
Normalize pada hari bulan#
If True,
pada 10/4
->pada sepuluh hari bulan empat
.
Simply normalizer.normalize(string, normalize_pada_hari_bulan = True)
, default is True
.
[121]:
normalizer = malaya.normalize.normalizer()
[122]:
normalizer.normalize('pada 10/ 4', normalize_pada_hari_bulan = True)
[122]:
{'normalize': 'pada sepuluh hari bulan empat', 'date': {}, 'money': {}}
[123]:
normalizer.normalize('pada 10/4', normalize_pada_hari_bulan = False)
[123]:
{'normalize': 'pada sepuluh per empat', 'date': {}, 'money': {}}
Normalize fraction#
If True,
10/4
->sepuluh per empat
.
Simply normalizer.normalize(string, normalize_fraction = True)
, default is True
.
[124]:
normalizer = malaya.normalize.normalizer()
[125]:
normalizer.normalize('10/4', normalize_fraction = True)
[125]:
{'normalize': 'sepuluh per empat', 'date': {}, 'money': {}}
[126]:
normalizer.normalize('201231.1 / 4', normalize_fraction = True)
[126]:
{'normalize': 'dua ratus satu ribu dua ratus tiga puluh satu perpuluhan satu per empat',
'date': {},
'money': {}}
[127]:
normalizer.normalize('201231.1 / 4', normalize_fraction = False)
[127]:
{'normalize': '201231.1 / 4', 'date': {}, 'money': {}}
[128]:
normalizer.normalize('201231.1 / 4', normalize_fraction = False, normalize_cardinal = False,
normalize_ordinal = False)
[128]:
{'normalize': '201231.1 / 4', 'date': {}, 'money': {}}
Normalize money#
If True,
RM10.5
->sepuluh ringgit lima puluh sen
.rm 10.5 sen
->sepuluh ringgit lima puluh sen
.20.2m ringgit
->dua puluh juta dua ratus ribu ringgit
.
And so much more!
Simply normalizer.normalize(string, normalize_money = True)
, default is True
.
[129]:
normalizer = malaya.normalize.normalizer()
[130]:
normalizer.normalize('RM10.5')
[130]:
{'normalize': 'sepuluh ringgit lima puluh sen',
'date': {},
'money': {'rm10.5': 'RM10.5'}}
[131]:
normalizer.normalize('rm 10.5 sen')
[131]:
{'normalize': 'sepuluh ringgit lima puluh sen',
'date': {},
'money': {'rm 10.5': 'RM10.5'}}
[132]:
normalizer.normalize('1015 sen')
[132]:
{'normalize': 'sepuluh ringgit lima belas sen',
'date': {},
'money': {'1015 sen': 'RM10.15'}}
[133]:
normalizer.normalize('rm10.4m')
[133]:
{'normalize': 'sepuluh juta empat ratus ribu ringgit',
'date': {},
'money': {'rm10.4m': 'RM10400000.0'}}
[134]:
normalizer.normalize('$10.4K')
[134]:
{'normalize': 'sepuluh ribu empat ratus dollar',
'date': {},
'money': {'$10.4k': '$10400.0'}}
[135]:
normalizer.normalize('22.5123334k ringgit')
[135]:
{'normalize': 'dua puluh dua ribu lima ratus dua belas ringgit tiga ribu tiga ratus tiga puluh empat sen',
'date': {},
'money': {'22.5123334k ringgit': 'RM22512.3334'}}
[136]:
normalizer.normalize('saya ada 20.2m ringgit')
[136]:
{'normalize': 'saya ada dua puluh juta dua ratus ribu ringgit',
'date': {},
'money': {'20.2m ringgit': 'RM20200000.0'}}
[137]:
normalizer.normalize('22.5123334k ringgit', normalize_money = False)
[137]:
{'normalize': '22.5123334k ringgit',
'date': {},
'money': {'22.5123334k ringgit': 'RM22512.3334'}}
Normalize units#
Able to normalize temperature, distance, volume, duration and weight units.
If True,
61.2 kg
->enam puluh satu perpuluhan dua kilogram
.61.2km
->sepuluh ringgit lima puluh sen
.
And so much more!
Simply normalizer.normalize(string, normalize_units = True)
, default is True
.
[138]:
normalizer = malaya.normalize.normalizer()
[139]:
normalizer.normalize('61.2 KG')
[139]:
{'normalize': 'enam puluh satu perpuluhan dua kilogram',
'date': {},
'money': {}}
[140]:
normalizer.normalize('61.2km')
[140]:
{'normalize': 'enam puluh satu perpuluhan dua kilometer',
'date': {},
'money': {}}
[141]:
normalizer.normalize('61.2c')
[141]:
{'normalize': 'enam puluh satu perpuluhan dua celsius',
'date': {},
'money': {}}
[142]:
normalizer.normalize('61.2 ml')
[142]:
{'normalize': 'enam puluh satu perpuluhan dua milliliter',
'date': {},
'money': {}}
[143]:
normalizer.normalize('61.2 l')
[143]:
{'normalize': 'enam puluh satu perpuluhan dua liter', 'date': {}, 'money': {}}
[144]:
normalizer.normalize('61.2 jam')
[144]:
{'normalize': 'enam puluh satu perpuluhan dua jam',
'date': {'61:2 jam': datetime.datetime(2022, 12, 17, 13, 32, 9, 622569)},
'money': {}}
[145]:
normalizer.normalize('61.2 hari')
[145]:
{'normalize': '61.2 hari', 'date': {}, 'money': {}}
Normalize percents#
If True,
61.2%
->enam puluh satu perpuluhan dua peratus
.
Simply normalizer.normalize(string, normalize_percent = True)
, default is True
.
[146]:
normalizer = malaya.normalize.normalizer()
[147]:
normalizer.normalize('61.2%')
[147]:
{'normalize': 'enam puluh satu perpuluhan dua peratus',
'date': {},
'money': {}}
[148]:
normalizer.normalize('61.2%', normalize_percent = False)
[148]:
{'normalize': '61.2%', 'date': {}, 'money': {}}
Normalize IC#
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
.
[149]:
normalizer = malaya.normalize.normalizer()
[150]:
normalizer.normalize('911111-01-1111')
[150]:
{'normalize': 'sembilan satu satu satu satu satu sempang kosong satu sempang satu satu satu satu',
'date': {},
'money': {}}
[151]:
normalizer.normalize('911111-01-1111', normalize_ic = False)
[151]:
{'normalize': '911111-01-1111', 'date': {}, 'money': {}}
Normalize Numbers#
If the number starts with 0
, will convert into string representation.
If True,
0123
->kosong satu dua tiga
.
Simply normalizer.normalize(string, normalize_number = True)
, default is True
.
[152]:
normalizer = malaya.normalize.normalizer()
[153]:
normalizer.normalize('01234')
[153]:
{'normalize': 'kosong satu dua tiga empat', 'date': {}, 'money': {}}
[154]:
normalizer.normalize('01234', normalize_number = False)
[154]:
{'normalize': '01234', 'date': {}, 'money': {}}
Normalize x kali#
If the word ends with x
and before that is a digit, will convert into string representation.
If True,
10x
->sepuluh kali
.If False,
10x
->10 kali
.
Simply normalizer.normalize(string, normalize_x_kali = True)
, default is True
.
[155]:
normalizer = malaya.normalize.normalizer()
[156]:
normalizer.normalize('saya sokong 10x')
[156]:
{'normalize': 'saya sokong sepuluh kali', 'date': {}, 'money': {}}
[157]:
normalizer.normalize('saya sokong 10x', normalize_x_kali = False)
[157]:
{'normalize': 'saya sokong 10 kali', 'date': {}, 'money': {}}
Normalize Cardinals#
Any numbers will convert using malaya.num2word.to_cardinal
.
If True,
123
->seratus dua puluh tiga
.
Simply normalizer.normalize(string, normalize_cardinal = True)
, default is True
.
[158]:
normalizer = malaya.normalize.normalizer()
[159]:
normalizer.normalize('123')
[159]:
{'normalize': '123', 'date': {}, 'money': {}}
[160]:
normalizer.normalize('123.123421231')
[160]:
{'normalize': '123.123421231', 'date': {}, 'money': {}}
[161]:
normalizer.normalize('123.123421231', normalize_cardinal = False)
[161]:
{'normalize': '123.123421231', 'date': {}, 'money': {}}
Normalize Ordinals#
Any numbers will convert using malaya.num2word.to_cardinal
.
If True,
123
->keseratus dua puluh tiga
.Able to normalize roman numbers,
ke-XXI
->kedua puluh satu
.
Simply normalizer.normalize(string, normalize_ordinal = True)
, default is True
.
[162]:
normalizer.normalize('123', normalize_cardinal = False)
[162]:
{'normalize': '123', 'date': {}, 'money': {}}
[163]:
normalizer.normalize('123', normalize_cardinal = False, normalize_ordinal = False)
[163]:
{'normalize': '123', 'date': {}, 'money': {}}
[164]:
normalizer.normalize('ke-XXI')
[164]:
{'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
.
[165]:
string = 'boleh dtg 8pagi esok tak atau minggu depan? 2 oktober 2019 2pm, tlong bayar rm 3.2k sekali tau'
[166]:
normalizer = malaya.normalize.normalizer(corrector, stemmer)
[167]:
normalizer.normalize(string)
[167]:
{'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, 12, 24, 15, 32, 11, 851487),
'8AM esok': datetime.datetime(2022, 12, 18, 8, 0),
'2 oktober 2019 2pm': datetime.datetime(2019, 10, 2, 14, 0)},
'money': {'rm 3.2k': 'RM3200.0'}}
[168]:
normalizer.normalize(string, normalize_entity = False)
[168]:
{'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': {}}
[169]:
normalizer.normalize(string, normalize_date = False, normalize_time = False, normalize_money = False,
normalize_cardinal = False, normalize_ordinal = False)
[169]:
{'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, 12, 24, 15, 32, 11, 889213),
'8AM esok': datetime.datetime(2022, 12, 18, 8, 0),
'2 oktober 2019 2pm': datetime.datetime(2019, 10, 2, 14, 0)},
'money': {'rm 3.2k': 'RM3200.0'}}