Rules
Contents
Rules#
This tutorial is available as an IPython notebook at Malaya/example/augmentation-rules.
[1]:
import os
os.environ['CUDA_VISIBLE_DEVICES'] = ''
os.environ['TF_FORCE_GPU_ALLOW_GROWTH'] = 'true'
[2]:
%%time
import malaya
CPU times: user 3.17 s, sys: 3.28 s, total: 6.46 s
Wall time: 2.31 s
Why augmentation#
Let say you have a very limited labelled corpus, and you want to add more, but labelling is very costly.
So, text augmentation! We provided few augmentation interfaces in Malaya.
Synonym#
Use dictionary of synonym to replace words with it synonyms. Synonym data from Malaya-Dataset/90k-synonym.
def synonym(
string: str,
threshold: float = 0.5,
top_n = 5,
**kwargs
):
"""
augmenting a string using synonym, https://github.com/huseinzol05/Malaya-Dataset#90k-synonym
Parameters
----------
string: str
this string input assumed been properly tokenized and cleaned.
threshold: float, optional (default=0.5)
random selection for a word.
top_n: int, (default=5)
number of nearest neighbors returned. Length of returned result should as top_n.
Returns
-------
result: List[str]
"""
[3]:
string = 'saya suka makan ayam dan ikan'
text = 'Perdana Menteri berkata, beliau perlu memperoleh maklumat terperinci berhubung isu berkenaan sebelum kerajaan dapat mengambil sebarang tindakan lanjut. Bagaimanapun, beliau yakin masalah itu dapat diselesaikan dan pentadbiran kerajaan boleh berfungsi dengan baik.'
[4]:
tokenizer = malaya.preprocessing.Tokenizer()
[5]:
malaya.augmentation.rules.synonym(' '.join(tokenizer.tokenize(string)))
[5]:
['saya mencinta merampas ternakan dan ikan',
'saya mencinta merampas ternakan dan ikan',
'saya sukanya dilucutkan ternakan dan ikan',
'saya berkenan dilucutkan ternakan dan ikan',
'saya berkenan melucutkan ternakan dan ikan']
[6]:
malaya.augmentation.rules.synonym(' '.join(tokenizer.tokenize(text)))
[6]:
['Perdana Menteri teragak-agak , beliau mandatori melahirkan Laporan terperinci berhubung isu berkenaan di hadapan negeri menggunakannya menggendong sebarang hal lanjut . masih , beliau yakin persoalan itu dapatkan diselesaikan dan pentadbiran kekaisaran boleh berbunyi dengan elok .',
'Perdana uskup teragak-agak , beliau mandatori melahirkan Laporan terperinci berhubung isu berkenaan sebelum ranah menggunakannya menjaga sebarang hal lanjut . masih , beliau yakin persoalan itu dapatkan diselesaikan dan pentadbiran kekaisaran mampu berbunyi dengan cantik .',
'Utama gajah meraba , beliau perlu menggambarkan Pengajian terperinci berhubung isu berkenaan pendahuluan dunia memikul melembutkan sebarang tajuk lanjut . bagaimanapun , beliau beranggapan masalah itu meraih diselesaikan dan pentadbiran kekaisaran layak jalan dengan kecantikan .',
'Tinggi menteri meraba , beliau mustahak menggambarkan Laporan terperinci mencakup isu berkenaan penyertaan dunia makan melembut sebarang tajuk lanjut . masih , beliau beranggapan persoalan itu meraih diselesaikan dan arahan negara layak runut dengan lawa .',
'Tinggi menteri meraba , beliau mustahak menggambarkan Berita terperinci mencakup hal berkenaan lontaran dunia menghabiskan melembut sebarang tajuk memajukan . masih , beliau menyangka masalahnya itu meraih diselesaikan dan tauliah negara layak selat dengan lawa .']
Replace consonants#
def replace_similar_consonants(
word: str,
threshold: float = 0.5,
replace_consonants: Dict[str, List[str]] = {
'n': ['m'],
'r': ['t', 'q'],
'g': ['h'],
'j': ['k'],
'k': ['l'],
'd': ['s', 'f'],
'g': ['f', 'h'],
'b': ['n'],
'f': ['p'],
}
):
"""
Naively replace consonants with another consonants to simulate typo or slang
if after consonants is a vowel.
Parameters
----------
word: str
threshold: float, optional (default=0.5)
Returns
-------
result: List[str]
"""
[7]:
for i in range(5):
print(i, malaya.augmentation.rules.replace_similar_consonants('menunjukkan'))
0 memunjukkan
1 memunjukkan
2 menunkuklam
3 memunkukkan
4 memunkukkam
Replace vowels#
def replace_similar_vowels(
word: str,
threshold: float = 0.5,
replace_vowels: Dict[str, List[str]] = {
'u': ['o'],
'a': ['o'],
'i': ['o'],
'o': ['u'],
}
):
"""
Naively replace vowels with another vowels to simulate typo or slang
if after vowels is a consonant.
Parameters
----------
word: str
threshold: float, optional (default=0.5)
Returns
-------
result: str
"""
[8]:
for i in range(5):
print(i, malaya.augmentation.rules.replace_similar_vowels('menunjukkan'))
0 menunjokkan
1 menonjukkan
2 menunjukkan
3 menunjukkon
4 menonjokkon
Social media word structure#
def socialmedia_form(word: str):
"""
augmenting a word into socialmedia form.
Parameters
----------
word: str
Returns
-------
result: List[str]
"""
[9]:
for i in range(5):
print(i, malaya.augmentation.rules.socialmedia_form('menunjukkan'))
0 []
1 []
2 []
3 []
4 []
[10]:
for i in range(5):
print(i, malaya.augmentation.rules.replace_similar_vowels('katak'))
0 kotok
1 katok
2 katok
3 katak
4 katok
[11]:
for i in range(5):
print(i, malaya.augmentation.rules.replace_similar_vowels('sedara'))
0 sedora
1 sedara
2 sedora
3 sedara
4 sedoro
remove vowel in alternative ways#
[12]:
for i in range(5):
print(i, malaya.augmentation.rules.vowel_alternate('menunjukkan'))
0 menunjkkan
1 menunjkkn
2 mnnjukkn
3 mnnjukkn
4 mennjkkn
Kelantanese word structure#
def kelantanese_form(word: str):
"""
augmenting a word into kelantanese form.
`ayam` -> `ayom`
`otak` -> `otok`
`kakak` -> `kakok`
`barang` -> `bare`
`kembang` -> `kembe`
`nyarang` -> `nyare`
Parameters
----------
word: str
Returns
-------
result: List[str]
"""
[14]:
malaya.augmentation.rules.kelantanese_form('barang')
[14]:
['bare']
[15]:
malaya.augmentation.rules.kelantanese_form('otak')
[15]:
['otok']
[16]:
malaya.augmentation.rules.kelantanese_form('kembang')
[16]:
['kembe']