I am too lazy to check for problems with my last corpus QDC-4(x100_itN_Sen.5). I’m pretending it is fine and immediately start working.
length(x100_itN_Sen.5)
[1] 306405
set.seed(52819)
SAMP <- sample(1:306405, 20000)
x20k_itN_Sen.5 <- x100_itN_Sen.5[SAMP]
str(x20k_itN_Sen.5)
chr [1:20000] "<U+1002><U+1030><U+1002><U+1032><U+104F> <U+101E><U+102F><U+100A><U+1005><U+102E><U+1019><U+1036><U+1000><U+102"| __truncated__ ...
cat(x20k_itN_Sen.5[c(1,2000,10000,20000)])
ဂူဂဲ၏ သုညစီမံကိန်း(Project Zero) လေ့လာရှာဖွေသူဖြစ်သည့် ဂျန်းဟွန်းက ကွတ်ကီးများသည် ကြားခံများဖြစ်သည့် ဝိုင်ဖိုင်ထောက်ပံ့သများက ဖတ်ရှုနိုင်သည်။ သို့နှင့် မဂ္ဂဇင်းမှတဆင့် သတင်းစာကိုပါ တိုးချဲ့ လိုက်သော အခါတွင် ‘ဘက်ပတစ်’ ကျောင်းသို့ မပြန်တော့ဘဲ ထိုမဂ္ဂဇင်း၊ သတင်းစာနှစ်ခုစလုံးတွင်ပင် တည်းဖြတ်သည့်ဘက်မှ ဆက်လက် လုပ်ကိုင်လေတော့သည်။ အကယ်၍ ပြည့်စုံလုံလောက်ခြင်း မဖြစ်ပါက တစ်လအတိုင်းအရှည် (ကာလပတ်လုံး) ထိုရဟန်းသည် ယုတ်လျော့သော သင်္ကန်း၏ ပြည့်စုံလုံလောက်ခြင်းငှါ မျှော်လင့်ချက်ရှိလတ်သော် ထိုသင်္ကန်းကို ထားရာသည်။ ထိုအခါ မိခင်ဖြစ်သူသည် “မိမိတို့တွင် အမွေဆက်ခံမည့် အမွေခံသား မရှိပေ။
As done before, I break up the sentences in the sample into syllables in two steps.
Breaking up into “quateda” style characters:
Breaking up into “quateda” style characters:
library(quanteda)
system.time(
x20k.t <- tokens(x20k_itN_Sen.5, what="character")
)
user system elapsed
5.19 0.08 5.32
Create syllables from characters for the first 10,000 sentences:
system.time({
x20k_syllA <- list()
# M <- length(x20k.t)
for (k in 1:10000) {
x20k_syllA.k <- list()
TEMP <- x20k.t[[k]][1]
j <- 1
L <- length(x20k.t[[k]])
for(i in 2:L) {
y <- grepl("[\u102b-\u102c\u1038-\u1039\u103a]",x20k.t[[k]][i])
if (y == TRUE){
TEMP <- paste0(TEMP,x20k.t[[k]][i])
} else {
my.1 <- grepl("[\u1040-\u1049]", x20k.t[[k]][i])
my.0 <- grepl("[\u1040-\u1049]", x20k.t[[k]][i-1])
if (my.1 == TRUE){
if (my.0 == TRUE){
TEMP <- paste0(TEMP,x20k.t[[k]][i])
} else {
x20k_syllA.k[[j]] <- TEMP
j <- j+1
TEMP <- x20k.t[[k]][i]
}
} else {
if (my.0 == TRUE){
x20k_syllA.k[[j]] <- TEMP
j <- j+1
TEMP <- x20k.t[[k]][i]
} else {
# for stacked consonant
if (grepl("[\u1039]",x20k.t[[k]][i-1])==TRUE){
TEMP <- paste0(TEMP,x20k.t[[k]][i])
} else {
x20k_syllA.k[[j]] <- TEMP
j <- j+1
TEMP <- x20k.t[[k]][i]
}
}
}
}
}
if (i == L){
x20k_syllA.k[[j]] <- TEMP
}
x20k_syllA[[k]] <- paste(unlist(x20k_syllA.k))
}
})
user system elapsed
3176.32 0.97 4880.07
Before I ran the above code chunk for 10,000 sentences, I tested it with 100 and 1000 sentences. For 1000 sentences it took about 5 minutes. So I was expecting to get 50 minutes or an hour or so for 10,000. But it came out to be 1 hour and 28 minutes. It would be good to understand why it was so slow. On the other hand, I found the clue that if I use “doParallel” with “foreach” package for the same task, it could speed up the operation two times or better.
But for the time being, let’s check the results.
cat(unlist(x20k_syllA[c(1,10000)]))
ဂူ ဂဲ ၏ သု ည စီ မံ ကိန်း ( P r o j e c t Z e r o ) လေ့ လာ ရှာ ဖွေ သူ ဖြစ် သည့် ဂျန်း ဟွန်း က ကွတ် ကီး များ သည် ကြား ခံ များ ဖြစ် သည့် ဝိုင် ဖိုင် ထောက် ပံ့ သ များ က ဖတ် ရှု နိုင် သည် ။ အ ကယ် ၍ ပြည့် စုံ လုံ လောက် ခြင်း မ ဖြစ် ပါ က တစ် လ အ တိုင်း အ ရှည် ( ကာ လ ပတ် လုံး ) ထို ရ ဟန်း သည် ယုတ် လျော့ သော သင်္ကန်း ၏ ပြည့် စုံ လုံ လောက် ခြင်း ငှါ မျှော် လင့် ချက် ရှိ လတ် သော် ထို သင်္ကန်း ကို ထား ရာ သည် ။
Create dfm of sentence endings from the 10,000 sample of sentences partitioned into syllables.
library(quanteda)
# create quanteda corpus of syllables
x20k_syllAc <- corpus(t(data.frame(lapply(x20k_syllA, paste0, collapse = " "))))
# create tokens with syllables as words
x20k_syllAc.t <- tokens(x20k_syllAc, what = "fasterword")
# create bigrams
xx <- tokens_ngrams(x20k_syllAc.t, n = 2, concatenator = "")
# convert to dfm
dfmxx <- dfm(xx)
# retain only the sentence endings
senEnd <- dfm_select(dfmxx, "\u104b$", selection = "keep", valuetype = "regex")
First we look at the 50 sentence endings with the highest frequencies.
topf <- topfeatures(senEnd, n=50)
df.topf <- data.frame(name = names(topf), n = topf, stringsAsFactors = F)
utf8::utf8_print(do.call("paste",c(sep = " - ", df.topf)))
[1] "သည်။ - 7990" "၏။ - 798" "တယ်။ - 262" "မည်။ - 165" "ချေ။ - 140" [6] "ပေ။ - 134" "ပါ။ - 104" "တည်း။ - 28" "ပြီ။ - 27" "မယ်။ - 24" [11] "ဘူး။ - 21" "ခြင်း။ - 20" "ရ။ - 17" "ပဲ။ - 17" "စေ။ - 8" [16] "ရှိ။ - 8" "လေ။ - 6" "နည်း။ - 6" "ကြောင်း။ - 6" "ပေါ့။ - 6" [21] "များ။ - 5" "လေး။ - 5" "ကား။ - 5" "ခဲ့။ - 5" "ဘဲ။ - 4" [26] "စို့။ - 4" "တဲ့။ - 4" "လော့။ - 4" "ရာ။ - 4" "လဲ။ - 3" [31] "၊။ - 3" "နိုင်။ - 3" "ကို။ - 3" "ထွက်။ - 3" "သေး။ - 3" [36] "ဟုတ်။ - 3" "လား။ - 3" "ရား။ - 3" "နှင့်။ - 3" "ယော။ - 3" [41] "ပင်။ - 3" "မြို့။ - 3" "နော်။ - 3" "တတ်။ - 2" "ဘုံ။ - 2" [46] "ဆာ။ - 2" "လော။ - 2" "ပုံ။ - 2" "ငယ်။ - 2" "လတ္တံ့။ - 2"
In the above list, all except the 31st, 34th, 38th, 40th, 42nd, 45th, 46th, 48th, 49th seems suspect to me. Now we look at all the 162 categories of distinct endings.
senEnd_tf <- textstat_frequency(senEnd)[,1:2]
utf8::utf8_print(do.call("paste", c(sep= " - ", senEnd_tf)))
[1] "သည်။ - 7990" "၏။ - 798" "တယ်။ - 262" "မည်။ - 165" "ချေ။ - 140" [6] "ပေ။ - 134" "ပါ။ - 104" "တည်း။ - 28" "ပြီ။ - 27" "မယ်။ - 24" [11] "ဘူး။ - 21" "ခြင်း။ - 20" "ရ။ - 17" "ပဲ။ - 17" "စေ။ - 8" [16] "ရှိ။ - 8" "လေ။ - 6" "နည်း။ - 6" "ကြောင်း။ - 6" "ပေါ့။ - 6" [21] "များ။ - 5" "လေး။ - 5" "ကား။ - 5" "ခဲ့။ - 5" "ဘဲ။ - 4" [26] "စို့။ - 4" "တဲ့။ - 4" "လော့။ - 4" "ရာ။ - 4" "လဲ။ - 3" [31] "၊။ - 3" "နိုင်။ - 3" "ကို။ - 3" "ထွက်။ - 3" "သေး။ - 3" [36] "ဟုတ်။ - 3" "လား။ - 3" "ရား။ - 3" "နှင့်။ - 3" "ယော။ - 3" [41] "ပင်။ - 3" "မြို့။ - 3" "နော်။ - 3" "တတ်။ - 2" "ဘုံ။ - 2" [46] "ဆာ။ - 2" "လော။ - 2" "ပုံ။ - 2" "ငယ်။ - 2" "လတ္တံ့။ - 2" [51] "သောင်း။ - 2" "ဦး။ - 2" "စဉ်။ - 2" "ဆောင်။ - 2" "စေ့။ - 2" [56] "သူ။ - 1" "ယူ။ - 1" "ခဲ။ - 1" "မန္အားျ။ - 1" "အံ့။ - 1" [61] "နယ်။ - 1" "နှာ။ - 1" "ချက်။ - 1" "သည့်။ - 1" "ဘော။ - 1" [66] "ဒါန်း။ - 1" "ထိန်။ - 1" "ထာ။ - 1" "ပြီး။ - 1" "ဇံ။ - 1" [71] "ပ။ - 1" "ကောင်း။ - 1" "မှတ်။ - 1" "့။ - 1" "နစ်။ - 1" [76] "နေ။ - 1" "ရုဏ်း။ - 1" "စု။ - 1" "နိုး။ - 1" "နှိုက်။ - 1" [81] "မြင်။ - 1" "မျိုး။ - 1" "ခါ။ - 1" "လို။ - 1" "စွာ။ - 1" [86] "သို့။ - 1" "တီ။ - 1" "တင့်။ - 1" "တွဲ။ - 1" "မျဉ်။ - 1" [91] "ဒိုင်း။ - 1" "ကြောဝ်။ - 1" "စမ်း။ - 1" "တမ်း။ - 1" "ခတ်။ - 1" [96] "တော့။ - 1" "ခွင့်။ - 1" "ခေါက်။ - 1" "နား။ - 1" "ငှေါဝ်။ - 1" [101] "သာ။ - 1" "မှု။ - 1" "ထိံ။ - 1" "ဆယ်။ - 1" "ကျောင်း။ - 1" [106] "တွေ။ - 1" "သင့်။ - 1" "ကွယ်။ - 1" "ခန့်။ - 1" "ရောက်။ - 1" [111] "လုံး။ - 1" "ထား။ - 1" "ရေး။ - 1" "မြတ်။ - 1" "ဝေ။ - 1" [116] "နန္ဒီ။ - 1" "နံ။ - 1" "ရူး။ - 1" "ဖြင့်။ - 1" "ကြိုက်။ - 1" [121] "တို။ - 1" "သွင်။ - 1" "အဗ္ဘုဂ္ဂစ္ဆိ။ - 1" "ဖျား။ - 1" "ဖွယ်။ - 1" [126] "ဖိုး။ - 1" "ဆီ။ - 1" "ထင်။ - 1" "လွမ်း။ - 1" "ခု။ - 1" [131] "လက္ခန်။ - 1" "လျက်။ - 1" "မိ။ - 1" "ဉာဏ်။ - 1" "လှ။ - 1" [136] "ဘို့။ - 1" "နိုင်း။ - 1" "သက်။ - 1" "ညှား။ - 1" "ယှဉ်။ - 1" [141] "စွ။ - 1" "ဗျာယ်။ - 1" "ဖြစ်။ - 1" "ရွား။ - 1" "သွား။ - 1" [146] "ပြတ်။ - 1" "ညျ။ - 1" "ရည်။ - 1" "ပါး။ - 1" "တောင်း။ - 1" [151] "ယာ။ - 1" "မင်း။ - 1" "ဖုံး။ - 1" "ရန်။ - 1" "တိုင်း။ - 1" [156] "တော်။ - 1" "အား။ - 1" "ညီ။ - 1" "ထောင်။ - 1" "ကျပ်။ - 1" [161] "နစ္ပါ။ - 1" "တော။ - 1"
My guess is that the sentence ending that seems suspect are mostly so because they are not complete or proper sentences. It would be interesting to confirm that by inspecting the underlying sentences. As usual my easy way out would be to remove the sentences with suspect sentence endings!
In the above list, the 56th to 162nd ending would be 105/10000 or only 1.05% of the 10000 endings. That means removing sentences with lowest frequencies would involve very little risk. A more logical approach would be to determine the common or usual sentence endings and retain the sentences with such endings and remove the rest.