Sunday, December 17, 2023

Syllabification of Myanmar Unicode text with Regex - 3

 
My syllabification code so far

In my last test text string, I spelled သုသာန် wrongly with . So I have to create the test string with correct instances of the latter.

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

My syllabification code is in R. It is modular with features that could be modified or added as necessary. The following shows how the different features were added successively.

library(stringr)
# segment consonants, independant vowels, symbols
str_replace_all(ttt, "([က-အဣ-ဧဩဪဿ၌-၏])", "-\\1") %>% 
  str_replace_all(., "-", " ")
[1] " ဝ င်း ဦး ၏    စ တီ ရီ ယို သီ ချ င်း ကြီး၊ ဪ အ တ္ တ အ နိ စ္ စ ဒု က္ ခ။ ကျွ န်ု ပ် ၏ ရွှေ တ ပဲ သား ကြော င့် ပြ ဿ နာ တ က် သ ည့် မ နု ဿ ၏ ဒ ဿ န နှ င့် ၎ င်း သ ည် အ င်္ ကျီ လုံ ချ ည် မ ပါ ဘဲ သွား ၍ ဤ သု သာ န် ၌ သေ လ တ္ တံ့၊ Farewell to Arms ( သွား လေ ရော့ လ က် ရုံး)၂၊ ဣ န္ ဒာ နွ ယ် ပါး ချို င့် က လေး ချ စ် စ ရာ ပ င်။"
# + fix athat, aukkamyin, wutsapauk with final consonant
str_replace_all(ttt, "([က-အဣ-ဧဩဪဿ၌-၏])", "-\\1") %>% 
  str_replace_all(., "-", " ") %>% 
  str_replace_all(., "\\s([က-အ][့်း]\\s|[က-အ][့်း])", "\\1")
[1] " ဝင်း ဦး ၏    စ တီ ရီ ယို သီ ချင်း ကြီး၊ ဪ အ တ္ တ အ နိ စ္ စ ဒု က္ ခ။ ကျွန်ုပ် ၏ ရွှေ တ ပဲ သား ကြောင့် ပြ ဿ နာ တက် သည့် မ နု ဿ ၏ ဒ ဿ န နှင့် ၎င်း သည် အင်္ ကျီ လုံ ချည် မ ပါ ဘဲ သွား ၍ ဤ သု သာန် ၌ သေ လ တ္ တံ့၊ Farewell to Arms ( သွား လေ ရော့ လက် ရုံး)၂၊ ဣ န္ ဒာ နွယ် ပါး ချိုင့် က လေး ချစ် စ ရာ ပင်။"
# + fix patsint (virama)
str_replace_all(ttt, "([က-အဣ-ဧဩဪဿ၌-၏])", "-\\1") %>% 
  str_replace_all(., "-", " ") %>% 
  str_replace_all(., "\\s([က-အ][့်း]\\s|[က-အ][့်း])", "\\1") %>% 
  str_replace_all(., "\\s([က-အ]္)\\s", "\\1")  
[1] " ဝင်း ဦး ၏    စ တီ ရီ ယို သီ ချင်း ကြီး၊ ဪ အတ္တ အ နိစ္စ ဒုက္ခ။ ကျွန်ုပ် ၏ ရွှေ တ ပဲ သား ကြောင့် ပြ ဿ နာ တက် သည့် မ နု ဿ ၏ ဒ ဿ န နှင့် ၎င်း သည် အင်္ ကျီ လုံ ချည် မ ပါ ဘဲ သွား ၍ ဤ သု သာန် ၌ သေ လတ္တံ့၊ Farewell to Arms ( သွား လေ ရော့ လက် ရုံး)၂၊ ဣန္ဒာ နွယ် ပါး ချိုင့် က လေး ချစ် စ ရာ ပင်။"
# + fix kinzi
str_replace_all(ttt, "([က-အဣ-ဧဩဪဿ၌-၏])", "-\\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 ( သွား လေ ရော့ လက် ရုံး)၂၊ ဣန္ဒာ နွယ် ပါး ချိုင့် က လေး ချစ် စ ရာ ပင်။"
# + fix ဿ
str_replace_all(ttt, "([က-အဣ-ဧဩဪဿ၌-၏])", "-\\1") %>% 
  str_replace_all(., "-", " ") %>% 
  str_replace_all(., "\\s([က-အ][့်း]\\s|[က-အ][့်း])", "\\1") %>% 
  str_replace_all(., "\\s([က-အ]္)\\s", "\\1")  %>% 
  str_replace_all(., "(\\s[က-အ]င်္|\\င်္)\\s", "\\1")  %>% 
  str_replace_all(., "\\s(ဿ)", "\\1")
[1] " ဝင်း ဦး ၏    စ တီ ရီ ယို သီ ချင်း ကြီး၊ ဪ အတ္တ အ နိစ္စ ဒုက္ခ။ ကျွန်ုပ် ၏ ရွှေ တ ပဲ သား ကြောင့် ပြဿ နာ တက် သည့် မ နုဿ ၏ ဒဿ န နှင့် ၎င်း သည် အင်္ကျီ လုံ ချည် မ ပါ ဘဲ သွား ၍ ဤ သု သာန် ၌ သေ လတ္တံ့၊ Farewell to Arms ( သွား လေ ရော့ လက် ရုံး)၂၊ ဣန္ဒာ နွယ် ပါး ချိုင့် က လေး ချစ် စ ရာ ပင်။"
# + remove English text, numerals, punctuations, and space at the begining of the string
str_replace_all(ttt, "([က-အဣ-ဧဩဪဿ၌-၏])", "-\\1") %>% 
  str_replace_all(., "-", " ") %>% 
  str_replace_all(., "\\s([က-အ][့်း]\\s|[က-အ][့်း])", "\\1") %>% 
  str_replace_all(., "\\s([က-အ]္)\\s", "\\1")  %>% 
  str_replace_all(., "(\\s[က-အ]င်္|\\င်္)\\s", "\\1")  %>% 
  str_replace_all(., "\\s(ဿ)", "\\1") %>%
  str_remove_all(., "[a-zA-Z0-9၀-၉၊။\\[\\]\\(\\)]|^\\s")
[1] "ဝင်း ဦး ၏    စ တီ ရီ ယို သီ ချင်း ကြီး ဪ အတ္တ အ နိစ္စ ဒုက္ခ ကျွန်ုပ် ၏ ရွှေ တ ပဲ သား ကြောင့် ပြဿ နာ တက် သည့် မ နုဿ ၏ ဒဿ န နှင့် ၎င်း သည် အင်္ကျီ လုံ ချည် မ ပါ ဘဲ သွား ၍ ဤ သု သာန် ၌ သေ လတ္တံ့     သွား လေ ရော့ လက် ရုံး ဣန္ဒာ နွယ် ပါး ချိုင့် က လေး ချစ် စ ရာ ပင်"
# + reduce multiple space to single
str_replace_all(ttt, "([က-အဣ-ဧဩဪဿ၌-၏])", "-\\1") %>% 
  str_replace_all(., "-", " ") %>% 
  str_replace_all(., "\\s([က-အ][့်း]\\s|[က-အ][့်း])", "\\1") %>% 
  str_replace_all(., "\\s([က-အ]္)\\s", "\\1")  %>% 
  str_replace_all(., "(\\s[က-အ]င်္|\\င်္)\\s", "\\1")  %>% 
  str_replace_all(., "\\s(ဿ)", "\\1") %>%
  str_remove_all(., "[a-zA-Z0-9၀-၉၊။\\[\\]\\(\\)]|^\\s") %>%
  str_squish(.)

[1] "ဝင်း ဦး ၏ စ တီ ရီ ယို သီ ချင်း ကြီး ဪ အတ္တ အ နိစ္စ ဒုက္ခ ကျွန်ုပ် ၏ ရွှေ တ ပဲ သား ကြောင့် ပြဿ နာ တက် သည့် မ နုဿ ၏ ဒဿ န နှင့် ၎င်း သည် အင်္ကျီ လုံ ချည် မ ပါ ဘဲ သွား ၍ ဤ သု သာန် ၌ သေ လတ္တံ့ သွား လေ ရော့ လက် ရုံး ဣန္ဒာ နွယ် ပါး ချိုင့် က လေး ချစ် စ ရာ ပင်"

The problem with “၊ ။ ၌ ၍ ၎ ၏” in Regex

When I tried using [:punct:] in removing all the English punctuation characters as well as  and  for Myanmar language, I found that all of the “၊ ။ ၌ ၍ ၎ ၏” were also removed! Is that a bug in R? So I have to specify each of the punctuation in the Regex syntax.

# + remove English text, numerals, punctuations (using [:punct:]), and space at the begining of the string
str_replace_all(ttt, "([က-အဣ-ဧဩဪဿ၌-၏])", "-\\1") %>% 
  str_replace_all(., "-", " ") %>% 
  str_replace_all(., "\\s([က-အ][့်း]\\s|[က-အ][့်း])", "\\1") %>% 
  str_replace_all(., "\\s([က-အ]္)\\s", "\\1")  %>% 
  str_replace_all(., "(\\s[က-အ]င်္)\\s", "\\1")  %>% 
  str_replace_all(., "\\s(ဿ)", "\\1") %>%
  str_remove_all(., "[a-zA-Z0-9၀-၉[:punct:]]|^\\s")  # using[:punct:]
[1] "ဝင်း ဦး     စ တီ ရီ ယို သီ ချင်း ကြီး ဪ အတ္တ အ နိစ္စ ဒုက္ခ ကျွန်ုပ်  ရွှေ တ ပဲ သား ကြောင့် ပြဿ နာ တက် သည့် မ နုဿ  ဒဿ န နှင့် င်း သည် အင်္ကျီ လုံ ချည် မ ပါ ဘဲ သွား  ဤ သု သာန်  သေ လတ္တံ့     သွား လေ ရော့ လက် ရုံး ဣန္ဒာ နွယ် ပါး ချိုင့် က လေး ချစ် စ ရာ ပင်"

Earlier when I compiled the Myanmar Wikipedia corpus I didn’t know about this effect. Luckily I did not use [:punct:] at that time. How frequently ၎င်း occurs in that corpus? How much damage would have been done using [:punct:]?

I tried to find out.

length(grep("၎င်း", x100_itN_Sen.5)) %>% paste("No. of sentences with complete syllable '၎င်း' =", .)
[1] "No. of sentences with complete syllable '၎င်း' = 8470"
length(grep("၎", x100_itN_Sen.5)) %>% paste("No. of sentences with complete/incomplete syllable '၎င်း' =", .)
[1] "No. of sentences with complete/incomplete syllable '၎င်း' = 8485"
length(grep("၎", x100_itN_Sen.5, invert = TRUE)) %>% paste("No. of sentences without complete/incomplete syllable '၎င်း' =", .)
[1] "No. of sentences without complete/incomplete syllable '၎င်း' = 297920"
length(x100_itN_Sen.5) %>% paste("Total No. of sentences = ", .)
[1] "Total No. of sentences =  306405"

Additionally there would surely be a lot of “၊ ။ ၌ ၍ ၏” in the corpus and all of them removed as well from the corpus if [:punct:] were used in the regex syntax.

1 comment:

  1. In the "# + fix kinzi" code chunk, last line for kinzi is corrected. So also for the corresponding line in the remaining code chunks for syllabification.

    ReplyDelete