Tuesday, December 12, 2023

Syllabification of Myanmar Unicode text with Regex

 
My love for our classical music genre of “Yodaya songs” come out of their great melodies and beautiful lyrics. However, lurking underneath is my dream to figure out the missing authorships of some of those songs someday.

I came to know that Stylometric techniques of NLP (Natural Language Processing) could be used for solving cases of missing authorship in literature and music. But my ambition has to lie low for indefinite time before I could become more proficient with R programming in general and Stylometric techniques and related R packages in particular.

To make progress, I would need the materials in an appropriate form. With the Yodaya songs, for example, I think they would have to be segmented into syllables. However, the syllable segmentation program I had devised in R has been pitifully slow. Nevertheless, I have recently discovered Ye Kyaw Thu’s “sylbreak” post here, and Garcia’s “Syllabification with Regex” post here. These inspired me to devise a syllabification code that is short and fast. Previously I was using loops to write the code in R, and it was too slow. Processing just 10,000 sentences took 1 hour and 28 minutes with regular loops and 44 minutes at best with parallel processing (https://bayanathi.blogspot.com/2019/06/cycle2-syllable-segmentation-parallel.html).

With Garcia’s idea of using the str_replace_all() function of the stringr package I was able to reduce the time for processing of the entire corpus of 300,000+ sentences to just 21 seconds!

The new code for syllable segmentation of Myanmar Unicode text

Garcia’s code example

My trial and error test codes

To begin with, I devised a string of Myanmar text (in “Pyidaungsu” Myanmar Unicode font) with features I hoped to cover the important issues of syllable segmentation.

library(stringr)
text <- "ဝင်းဦး၏ - စတီရီယိုသီချင်းကြီး၊ဪအတ္တအနိစ္စဒုက္ခ။၎င်းသေသောသူသည်အင်္ကျီလုံချည်မပါဘဲဤသုဿန်သို့သွား၍သေသည်၊ Farewell to Arms (သွားလေရော့လက်ရုံး)၂၊ဣန္ဒာနွယ်ပါးချိုင့်ကလေးချစ်စရာပင်။"
cat(text)
ဝင်းဦး၏ - စတီရီယိုသီချင်းကြီး၊ဪအတ္တအနိစ္စဒုက္ခ။၎င်းသေသောသူသည်အင်္ကျီလုံချည်မပါဘဲဤသုဿန်သို့သွား၍သေသည်၊ Farewell to Arms (သွားလေရော့လက်ရုံး)၂၊ဣန္ဒာနွယ်ပါးချိုင့်ကလေးချစ်စရာပင်။

Writing Myanmar syllables in unicode begins with consonants so I tried searching for pattern with consonants က to  and replacing it with the found text plus a hyphen.

str_replace_all(string = text, pattern = "([က-အ])", replacement = "-\\1")
[1] "-ဝ-င်းဦး၏ - -စ-တီ-ရီ-ယို-သီ-ချ-င်း-ကြီး၊ဪ-အ-တ္-တ-အ-နိ-စ္-စ-ဒု-က္-ခ။၎-င်း-သေ-သော-သူ-သ-ည်-အ-င်္-ကျီ-လုံ-ချ-ည်-မ-ပါ-ဘဲဤ-သုဿ-န်-သို့-သွား၍-သေ-သ-ည်၊ Farewell to Arms (-သွား-လေ-ရော့-လ-က်-ရုံး)၂၊ဣ-န္-ဒာ-နွ-ယ်-ပါး-ချို-င့်-က-လေး-ချ-စ်-စ-ရာ-ပ-င်။"

Here we notice that the ဪ ဤ ၍ ဣ characters, or on the whole Independant Vowels and Symbols also need to be included in the “pattern” as seen in the chart below.

str_replace_all(text, "([က-အဣ-ဧဩဪဿ၌-၏])", "-\\1")
[1] "-ဝ-င်း-ဦး-၏ - -စ-တီ-ရီ-ယို-သီ-ချ-င်း-ကြီး၊-ဪ-အ-တ္-တ-အ-နိ-စ္-စ-ဒု-က္-ခ။-၎-င်း-သေ-သော-သူ-သ-ည်-အ-င်္-ကျီ-လုံ-ချ-ည်-မ-ပါ-ဘဲ-ဤ-သု-ဿ-န်-သို့-သွား-၍-သေ-သ-ည်၊ Farewell to Arms (-သွား-လေ-ရော့-လ-က်-ရုံး)၂၊-ဣ-န္-ဒာ-နွ-ယ်-ပါး-ချို-င့်-က-လေး-ချ-စ်-စ-ရာ-ပ-င်။"

We need to fix the athat, kinzi and stacked consonants, so:

str_replace_all(text, "([က-အဣ-ဧဩဪဿ၌-၏])", "-\\1") %>% str_replace_all(., "-", " ") %>% str_replace_all(., "\\s([က-အ][့်း]\\s|[က-အ][့်း])", "\\1") %>% str_replace_all(., "\\s([က-အ]္)\\s", "\\1")  %>% str_replace_all(., "(\\s[က-အ]င်္)\\s", "\\1")
[1] " ဝင်း ဦး ၏    စ တီ ရီ ယို သီ ချင်း ကြီး၊ ဪ အတ္တ အ နိစ္စ ဒုက္ခ။ ၎င်း သေ သော သူ သည် အင်္ကျီ လုံ ချည် မ ပါ ဘဲ ဤ သု ဿန် သို့ သွား ၍ သေ သည်၊ Farewell to Arms ( သွား လေ ရော့ လက် ရုံး)၂၊ ဣန္ဒာ နွယ် ပါး ချိုင့် က လေး ချစ် စ ရာ ပင်။"

Next we remove the English text, numerals, punctutions and the leading space for the first syllable.

# removing the English text, numerals, and punctutions
str_replace_all(text, "([က-အဣ-ဧဩဪဿ၌-၏])", "-\\1") %>% str_replace_all(., "-", " ") %>% str_replace_all(., "\\s([က-အ][့်း]\\s|[က-အ][့်း])", "\\1") %>% str_replace_all(., "\\s([က-အ]္)\\s", "\\1")  %>% str_replace_all(., "(\\s[က-အ]င်္)\\s", "\\1") %>% str_remove_all(., "[a-zA-Z0-9၀-၉၊။\\[\\]\\(\\)]|^\\s") 
[1] "ဝင်း ဦး ၏    စ တီ ရီ ယို သီ ချင်း ကြီး ဪ အတ္တ အ နိစ္စ ဒုက္ခ ၎င်း သေ သော သူ သည် အင်္ကျီ လုံ ချည် မ ပါ ဘဲ ဤ သု ဿန် သို့ သွား ၍ သေ သည်     သွား လေ ရော့ လက် ရုံး ဣန္ဒာ နွယ် ပါး ချိုင့် က လေး ချစ် စ ရာ ပင်"

The output contains some mutiple spaces separating the syllables. They could be transformed into single spaces easily using the str_squish() function of the stringr package.

str_replace_all(text, "([က-အဣ-ဧဩဪဿ၌-၏])", "-\\1") %>% str_replace_all(., "-", " ") %>% str_replace_all(., "\\s([က-အ][့်း]\\s|[က-အ][့်း])", "\\1") %>% str_replace_all(., "\\s([က-အ]္)\\s", "\\1")  %>% str_replace_all(., "(\\s[က-အ]င်္)\\s", "\\1") %>% str_remove_all(., "[a-zA-Z0-9၀-၉၊။\\[\\]\\(\\)]|^\\s") %>% str_squish(.)
[1] "ဝင်း ဦး ၏ စ တီ ရီ ယို သီ ချင်း ကြီး ဪ အတ္တ အ နိစ္စ ဒုက္ခ ၎င်း သေ သော သူ သည် အင်္ကျီ လုံ ချည် မ ပါ ဘဲ ဤ သု ဿန် သို့ သွား ၍ သေ သည် သွား လေ ရော့ လက် ရုံး ဣန္ဒာ နွယ် ပါး ချိုင့် က လေး ချစ် စ ရာ ပင်"

We may choose to separate the syllables with hyphen or other characters with:

# replace space with hyphen
str_replace_all(text, "([က-အဣ-ဧဩဪဿ၌-၏])", "-\\1") %>% str_replace_all(., "-", " ") %>% str_replace_all(., "\\s([က-အ][့်း]\\s|[က-အ][့်း])", "\\1") %>% str_replace_all(., "\\s([က-အ]္)\\s", "\\1")  %>% str_replace_all(., "(\\s[က-အ]င်္)\\s", "\\1") %>% str_remove_all(., "[a-zA-Z0-9၀-၉၊။\\[\\]\\(\\)]|^\\s") %>% str_squish(.) %>% str_replace_all(., "\\s", "\\-")
[1] "ဝင်း-ဦး-၏-စ-တီ-ရီ-ယို-သီ-ချင်း-ကြီး-ဪ-အတ္တ-အ-နိစ္စ-ဒုက္ခ-၎င်း-သေ-သော-သူ-သည်-အင်္ကျီ-လုံ-ချည်-မ-ပါ-ဘဲ-ဤ-သု-ဿန်-သို့-သွား-၍-သေ-သည်-သွား-လေ-ရော့-လက်-ရုံး-ဣန္ဒာ-နွယ်-ပါး-ချိုင့်-က-လေး-ချစ်-စ-ရာ-ပင်"

Syllabification of the Myanmar Wikipedia corpus

Finally we are set to test the program with our Myanmar Wikipedia corpus with 300,000+ sentences and see how fast it run.

# the data
load(file='x100_itN_Sen5.rda')
length(x100_itN_Sen.5)
[1] 306405
# view the last six sentences
tail(x100_itN_Sen.5)
[1] "ဉာဏ်တုဉာဏ်ရည်တု အခြေခံသတ်မှတ်ချက်များ ပေးခဲ့သည့် ကနဦးလုပ်ဆောင်သူများအနက် တစ်ဦးဖြစ်သည်။"                                                                                                                                                
[2] "ဉာဏ်ရည်တု ဟူသော ဝေါဟာရကို တီထွင်ကာ အစောပိုင်းဖန်တီးမှုများ ဦးဆောင်ခဲ့ခြင်းက လည်းကောင်း၊ LISP ကွန်ပျူတာဘာသာစကားကို ဖန်တီးခြင်းကာ ALGOL ကွန်ပျူတာဘာသာစကား၏ ဒီဇိုင်းကို လွှမ်းမိုးနိုင်ခဲ့ခြင်းက လည်းကောင်း၊ အချိန်မျှသုံးခြင်း ကို လူသိများစေခြင်းက လည်းကောင်း မက္ကာသီအား ထင်ရှားစေခဲ့သည်။"
[3] "အသက်မွေးဘဝကို စတန်းဖို့ဒ် တက္ကသိုလ်စတန်းဖို့ တက္ကသိုလ်တွင် ကုန်ဆုံးစေခဲ့သည်။"                                                                                                                                                                  
[4] "ဆုတံဆိပ် အများအပြား ရခဲ့ရာ ဉာဏ်ရည်တုတွင် ပါဝင်ဆောင်ရွက်ခြင်းကြောင့် တူရင်းဆုအား ၁၉၇၁ ခုတွင် လည်းကောင်း၊ အမေရိကန်နိုင်ငံ၏ သိပ္ပံဆိုင်ရာ အမျိုးသားဆုတံဆိပ်ကို လည်းကောင်း၊ ကျိုတိုဆုကို လည်းကောင်း ချီးမြှင့်ခံရဖူးသည်။"                                                            
[5] "ကွန်မြူနစ်အဖြစ် မြေတောင်မြှောက်ခံရသော်လည်း ဆိုဗီယက် ဝင်ရောက်မှု ဖြစ်ပြီးသည့် ၁၉၆၈ ခုတွင် ချက်ကိုဆလိုဗားကီးယားနိုင်ငံချက်ကိုစလိုဗေးကီးယားသို့ ၂ ရက်ကြာ ခရီးသွားပြီးနောက် ကွန်ဆာဗေးတစ် ရီပါဗလစ်ကန် (Conservative republican) တစ်ဦး ဖြစ်လာသည်။"                                
[6] "စတန်းဖို့ရှိ နေအိမ်၌ ၂၀၁၁ ခု၊ အောက်တိုဘာလ ၂၄ ရက်တွင် ကွယ်လွန်သည်။"                                                                                                                                                                   

Syllabification took only 20.9 seconds.

system.time(
  myWikiSyl <- str_replace_all(x100_itN_Sen.5, "([က-အဣ-ဧဩဪဿ၌-၏])", "-\\1") %>% str_replace_all(., "-", " ") %>% str_replace_all(., "\\s([က-အ][့်း]\\s|[က-အ][့်း])", "\\1") %>% str_replace_all(., "\\s([က-အ]္)\\s", "\\1")  %>% str_replace_all(., "(\\s[က-အ]င်္)\\s", "\\1") %>% str_remove_all(., "[a-zA-Z0-9၀-၉၊။\\[\\]\\(\\)]|^\\s") %>% str_squish(.)
)
   user  system elapsed 
  19.75    0.38   20.91 
tail(myWikiSyl)
[1] "ဉာဏ် တု ဉာဏ် ရည် တု အ ခြေ ခံ သတ် မှတ် ချက် များ ပေး ခဲ့ သည့် က န ဦး လုပ် ဆောင် သူ များ အ နက် တစ် ဦး ဖြစ် သည်"                                                                                                                                                                        
[2] "ဉာဏ် ရည် တု ဟူ သော ဝေါ ဟာ ရ ကို တီ ထွင် ကာ အ စော ပိုင်း ဖန် တီး မှု များ ဦး ဆောင် ခဲ့ ခြင်း က လည်း ကောင်း ကွန် ပျူ တာ ဘာ သာ စ ကား ကို ဖန် တီး ခြင်း ကာ ကွန် ပျူ တာ ဘာ သာ စ ကား ၏ ဒီ ဇိုင်း ကို လွှမ်း မိုး နိုင် ခဲ့ ခြင်း က လည်း ကောင်း အ ချိန် မျှ သုံး ခြင်း ကို လူ သိ များ စေ ခြင်း က လည်း ကောင်း မက္ကာ သီ အား ထင် ရှား စေ ခဲ့ သည်"
[3] "အ သက် မွေး ဘ ဝ ကို စ တန်း ဖို့ဒ် တက္က သိုလ် စ တန်း ဖို့ တက္က သိုလ် တွင် ကုန် ဆုံး စေ ခဲ့ သည်"                                                                                                                                                                                                
[4] "ဆု တံ ဆိပ် အ များ အ ပြား ရ ခဲ့ ရာ ဉာဏ် ရည် တု တွင် ပါ ဝင် ဆောင် ရွက် ခြင်း ကြောင့် တူ ရင်း ဆု အား ခု တွင် လည်း ကောင်း အ မေ ရိ ကန် နိုင် ငံ ၏ သိပ္ပံ ဆိုင် ရာ အ မျိုး သား ဆု တံ ဆိပ် ကို လည်း ကောင်း ကျို တို ဆု ကို လည်း ကောင်း ချီး မြှင့် ခံ ရ ဖူး သည်"                                                                      
[5] "ကွန် မြူ နစ် အ ဖြစ် မြေ တောင် မြှောက် ခံ ရ သော် လည်း ဆို ဗီ ယက် ဝင် ရောက် မှု ဖြစ် ပြီး သည့် ခု တွင် ချက် ကို ဆ လို ဗား ကီး ယား နိုင် ငံ ချက် ကို စ လို ဗေး ကီး ယား သို့ ရက် ကြာ ခ ရီး သွား ပြီး နောက် ကွန် ဆာ ဗေး တစ် ရီ ပါ ဗ လစ် ကန် တစ် ဦး ဖြစ် လာ သည်"                                                                
[6] "စ တန်း ဖို့ ရှိ နေ အိမ် ၌ ခု အောက် တို ဘာ လ ရက် တွင် ကွယ် လွန် သည်"                                                                                                                                                                                                                

No comments:

Post a Comment