Saturday, April 27, 2019

Cycle2: QDC2 hiccup


It must have been a piece of routine activity for XML and NLP gurus. But I was jubilant in being able to find and extract the Myanmar Wikipedia articles created by robots. No mean achievement for an old guy and a dummy, I thought. It won’t last long, however.
Recall that I have created my second quick and dirty corpus by, (i) removing the articles created by robots from the data in the Myanmar Wikipedia dump file, (ii) removed all non-Myanmar language characters and blank lines, (iii) split paragraphs into sentences, (iv) removed sentences shorter than 90 character in length. That has been reported in my last two posts. The end result is that I’ve got 250,291 sentences in the vector senP_nc90.
From that base, I’ve drawn a random sample of 25K sentences. Then I realize it is still too big to work on, and so I chose to do the syllable segmentation on just the first 10K sentences. Finishing that, I looked up the 9999th sentence before and after the syllable segmentation planning to show them in my next post.
set.seed(42519)
n <- length(senP_nc90)
senP_s25K <- senP_nc90[sample(1:n, 25000)]
cat(senP_s25K[9999])
ကမ်းယံလူမျိုးအာရှတိုက်အလယ်ပိုင်းတွင်နေထိုင်ကြသောမွန်ဂိုလူမျိုးတို့သည်မိမိတို့ဒေသ၌အစာရေစာရှားပါးသဖြင့်ရှေးနှစ်ပေါင်းများစွာကပင်တောင်ဖက်သို့တသုတ်ပြီးတသုတ်ပြောင်းရွှေ့လာကြရာမြန်မာနိုင်ငံသို့ရှေးဦးစွာဝင်လာသူများမှာမွန်ခမာလူမျိုးများဖြစ်၍ဒုတိယအသုတ်မှာတိဘက်မြန်မာလူမျိုးများဖြစ်ကြသည်။
cat(unlist(sen25K_syll[9999]))
ကမ်း ယံ လူ မျိုး အာ ရှ တိုက် အ လယ် ပိုင်း တွင် နေ ထိုင် ကြ သော မွန် ဂို လူ မျိုး တို့ သည် မိ မိ တို့ ဒေ သ ၌ အ စာ ရေ စာ ရှား ပါး သ ဖြင့် ရှေး နှစ် ပေါင်း များ စွာ က ပင် တောင် ဖက် သို့ တ သုတ် ပြီး တ သုတ် ပြောင်း ရွှေ့ လာ ကြ ရာ မြန် မာ နိုင် ငံ သို့ ရှေး ဦး စွာ ဝင် လာ သူ များ မှာ မွန် ခ မာ လူ မျိုး များ ဖြစ် ၍ ဒု တိ ယ အ သုတ် မှာ တိ ဘက် မြန် မာ လူ မျိုး များ ဖြစ် ကြ သည် ။
Looks fine. But wait! The first four syllables ကမ်းယံလူမျိုး seems to be the heading and not a part of the sentence in question. That’s my hiccup.
Then I retrieved the nodeset for the article with the title = “ကမ်းယံလူမျိုး”.
library(xml2)
xdoc <- read_xml("mywiki-20190201-pages-articles.xml", encoding = "UTF-8")
xml_ns(xdoc)
d1  <-> http://www.mediawiki.org/xml/export-0.10/
xsi <-> http://www.w3.org/2001/XMLSchema-instance
kns <- xml_find_all(xdoc, "//d1:page[./d1:title = 'ကမ်းယံလူမျိုး']/d1:revision/d1:text")
cat(xml_text(kns))
==ကမ်းယံလူမျိုး==
အာရှတိုက် အလယ်ပိုင်းတွင် နေထိုင်ကြ သော မွန်ဂိုလူမျိုးတို့သည် မိမိတို့ဒေသ၌ အစာရေစာ ရှားပါး သဖြင့် ရှေးနှစ်ပေါင်းများစွာကပင် တောင်ဖက်သို့ တသုတ်ပြီး 
တသုတ် ပြောင်းရွှေ့လာကြရာ မြန်မာနိုင်ငံသို့ ရှေးဦးစွာ ဝင်လာသူများမှာ [[မွန်ခမာ]]လူမျိုးများဖြစ်၍ ဒုတိယအသုတ်မှာ တိဘက်မြန်မာလူမျိုးများ ဖြစ်ကြသည်။

သူတို့သည် အရှေ့ဖက်လမ်း၊ အနောက်ဖက်လမ်းဟူ၍ လမ်းနှစ်သွယ်ဖြင့် ဝင်ရောက်လာကြသည်။ အရှေ့ဖက်လမ်းဖြင့် ဝင်ရောက်လာသူသည် မဲခေါင်မြစ်ကြောင်း၊ သံလွင်မြစ်ကြောင်း 
တို့ဖြင့် ဝင်ရောက်လာကြသည်။ အနောက်ဖက်လမ်းဖြင့် ဝင်ရောက်လာသူတို့အနက် အချို့မှာ ဒီဟောင်းခေါ် ဗြဟ္မပုတ္တရမြစ်ဝှမ်းအတိုင်း ဆင်းလာကြပြီးလျှင် အာသံနယ်၌ မြို့ပြ 
တည်ထောင်နေထိုင်ကြသည်။ အချို့မှာ ဧရာဝတီမြစ်ကြောင်း၊ ချင်းတွင်းမြစ်ကြောင်းတို့ဖြင့် ဝင်ရောက်လာကြသည်။ ဤသို့ဖြင့် သူတို့သည် ဗြဟ္မပုတ္တရမြစ်နှင့် ဧရာဝတီမြစ်များအကြားရှိ 
ရေဝေကုန်းတန်းကြီးတွင် မှီတင်းနေထိုင်လာကြရာ နောင်ကာလ ကြာမြင့်သော် တောင်ဘက်သို့ ပြန့်နှံ့လျက် နေထိုင်ကြလေသည်။

တိဘက်မြန်မာတို့သည် မြန်မာနိုင်ငံတွင်းသို့ ရောက်လာ သောအခါ ပျူ၊ ကမ်းယံ၊ သက်ဟူ၍ အမျိုးသုံးစား ကွဲပြားခဲ့ သည်။ ဧရာဝတီမြစ်ကမ်းတလျှောက်တွင် ပျူတို့မြို့ပြ တည် 
ထောင်နေထိုင်ကြသည်။ အနောက်ရိုးမတစ်လျှောက်ဖြစ်သော တောင်ကုန်းဒေသများတွင် နေထိုင်သူများကို သက်ဟု ခေါ်တွင်သည်။ အနောက်ရိုးမ၏ တောင်ဘက်စွန်းဖြစ်သော 
ရခိုင်ရိုးမနှင့် ဘင်္ဂလားအော်အကြားရှိ ပင်လယ်ကမ်းခြေ အရပ် ဒေသတွင် နေထိုင်ကြသူများကို ကမ်းယံဟု ခေါ်ကြသည်။ ကာလကြာမြင့်သော် ပျူတို့သည် ကွယ်ပျောက်၍ မြန်မာအစု 
တွင် ပါဝင်လာကြသည်ဟု ဆိုသည်။ သက်နှင့် ကမ်းယံ များကိုမူ ချင်း၊ ရခိုင်အစုများတွင် ထည့်သွင်းရေတွက်ကြ လေသည်။

ကမ်းယံတို့ မှီတင်းနေထိုင်ရာဒေသမှာ သံတွဲမှစ၍ တောင်စဉ်ခုနစ်ခရိုင်ဖြစ်ကြောင်း၊ သရေခေတ္တရာတွင် ပျူတို့ ကောင်းစားစဉ် ရခိုင်ပြည်တောင်ပိုင်းတွင် ကမ်းယံတို့ရှိခဲ့ကြောင်း
ယင်းတို့မှာ ဗုဒ္ဓဝါဒီများဖြစ်ကြောင်း သိရသည်။<ref>မြန်မာ့စွယ်စုံကျမ်း၊ အတွဲ(၁)</ref>

== ကိုးကား ==
<references/>

{{မြန်မာပြည် လူမျိုးများ}}

[[Category:မြန်မာနိုင်ငံလူမျိုးများ]]
We look at the characters of the retrieved nodeset, we can see the line break characters “\n” below:
We now have an explanation for the problem. When we remove all the non-Myanmar Unicode characters, we also happened to remove the line break characters and that is good, because we get the whole sentences. On the other hand, the title in the article becomes part of the first sentence!
Having seen that, the formula for getting it right seems simple: for each of the nodesets (body text of articles) retrieved, isolate the first line and delete it!  May be you have a better idea?

Wednesday, April 24, 2019

The second cycle: QD Corpus 2


This may yet be an another ambitious cycle that begins with a false start. But, as I’ve reported in my last post, I’ve got some solid material to begin working on. Till now I’ve removed the articles and related text created by robots. Next, (i) I’ll remove all non-Myanmar language characters, (ii) split the text into sentences and remove non-sentence text fragments, (iii) remove “sentences” below a certain number of characters so that we have a better chance of getting only genuine sentences. Then, (iv) segment the sentences into syllables. Then we can go on to look at the sentence ending syllables again, and other interesting analyses.
library(xml2)
system.time(
  xdoc_textNodeSet <- xml_find_all(xdoc, "//text()")
)
   user  system elapsed 
  19.90    0.23   20.50 
# convert to character vector
xdocTNS.t <- xml_text(xdoc_textNodeSet)
str(xdocTNS.t)
 chr [1:890935] "<U+101D><U+102E><U+1000><U+102E><U+1015><U+102E><U+1038><U+1012><U+102E><U+1038><U+101A><U+102C><U+1038>" ...
# remove all characters not Myanmar Unicode
system.time(
  my_xdocTNS.t <- gsub("[^\u1000-\u104f]", "", xdocTNS.t)
)
   user  system elapsed 
  34.36    0.04   34.65 
# remove blank lines
myNbl_xdocTNS.t <- my_xdocTNS.t[!my_xdocTNS.t==""]
The following code block gives us the number of lines in our text (= 184,415), and also a sample of 30 lines. Note that the second line of text is not shown completely.
length(myNbl_xdocTNS.t)
[1] 184415
utf8::utf8_print(myNbl_xdocTNS.t[1:30])
 [1] "ဝီကီပီးဒီးယား"                                                                            
 [2] "စိုင္္စိုင္္စိုင္္"                                                                               
 [3] "ဗဟိုစာမျက်နှာ"                                                                            
 [4] "ဵဗဟိုစာမဵကနာဗဟိုစာမဵကနာဗဟိုစာမျက်နှာယူနီကုဒ်"                                                        
 [5] "မှတ်ချက်။ဤနေရာသည်အက်ဒမင်များစီမံခန့်ခွဲသူများအားမေးခွန်းများမေးမြန်းရန်နေရာမဟုတ်သလိုအက်ဒမင်အဖြစ်လျောက်ထားရန်နေ…"
 [6] "ဝက်ဘ်ဝီကီပီးဒီးယားမြန်မာယူနီကုဒ်"                                                                
 [7] "ဝီကီပီးဒီးယားထိန်းသိမ်းရေး"                                                                   
 [8] "ဝီကီပီးဒီးယားထိန်းသိမ်းရေး"                                                                   
 [9] "ဗဟိုစာမျက်နှာ"                                                                            
[10] "ဝီကီပီးဒီးယားမှကြိုဆိုပါသည်။နိဒါန်းမည်သူမဆိုကြည့်ရှုပြင်ဆင်နိုင်သောအခမဲ့လွတ်လပ်စွယ်စုံကျမ်းဖြစ်ပါသည်။အကြောင်းအရာပေါင်းခုကိုမြန်…"
[11] "ယူနီကုဒ်"                                                                                 
[12] "ယူနီကုဒ်"                                                                                 
[13] "ယူနီကုဒ်"                                                                                 
[14] "ယူနီကုဒ်"                                                                                 
[15] "ပြင်ဆင်ရန်အလိုအလျောက်အတည်ပြုထားသောအသုံးပြုသူများကိုသာခ"                                             
[16] "ဗဟုိစာမ္ယက္န္ဟာဗဟိုစာမဵကနာဗဟုိစာမ္ယက္န္ဟာဝိကိပိဒိယအခမဲ့လ္ဝတ္လပ္စ္ဝယ္စုံက္ယမ္းဝီကီပီးဒီးယားမြန်မာယူနီကုဒ်"                  
[17] "ယူနီကုဒ်"                                                                                 
[18] "ဝီကီပီးဒီးယားထိန်းသိမ်းရေး"                                                                   
[19] "ဝီကီပီးဒီးယားထိန်းသိမ်းရေး"                                                                   
[20] "ဝီကီပီးဒီးယားမြန်မာယူနီကုဒ်"                                                                   
[21] "ယူနီကုဒ်"                                                                                 
[22] "ယူနီကုဒ်"                                                                                 
[23] "ဘော့အလိုအလျောက်ရှင်းလင်းခဲ့သည်"                                                                 
[24] "ဤစာသားကိုမဖျက်ရကျေးဇူးပြု၍ဤစာသားကိုမဖျက်ပါနှင့်ဝီကီပီးဒီးယားမှကြိုဆိုပါတယ်ကျေးဇူးပြု၍ဤအပိုင်းကိုသည်အတိုင်းထားပေးပါ။ဤ…"
[25] "ဗမာစာ"                                                                                
[26] "ဘော့မြန်မာဘာသာစကားသို့ပြန်ညွှန်းနှစ်ထပ်ဖြစ်နေသည်ကိုပြင်နေသည်"                                           
[27] "မြန်မာဘာသာစကား"                                                                        
[28] "မြန်မာဝီကီပိဒီးယားကိုယူနီကုတ်စာသားအသုံးပြု၍ရေးသားသည်။ယူနီကုတ်မြန်မာစာကိုမြန်မာဘာသာဖြင့်ရေးသားသောအင်တာနက်စာမျက်နှာ…"
[29] "ဝီကီပီးဒီးယားမြန်မာယူနီကုဒ်"                                                                   
[30] "ဝီကီပီးဒီးယားမြန်မာယူနီကုဒ်"                                                                   
We find out the number of sentences contained in lines 1-30 (above), and read line-24 containing three sentences.
nchar(gsub("[^\u104b]","", myNbl_xdocTNS.t[1:30]))
 [1]  0  0  0  0 14  0  0  0  0  7  0  0  0  0  0  0  0  0  0  0  0  0  0  3  0  0  0  4  0
[30]  0
cat(myNbl_xdocTNS.t[24])
ဤစာသားကိုမဖျက်ရကျေးဇူးပြု၍ဤစာသားကိုမဖျက်ပါနှင့်ဝီကီပီးဒီးယားမှကြိုဆိုပါတယ်ကျေးဇူးပြု၍ဤအပိုင်းကိုသည်အတိုင်းထားပေးပါ။ဤစာမျက်နှာကိုပုံမှန်ရှင်းလင်းပါသည်။သင်၏တည်းဖြတ်မှုစွမ်းရည်ကိုအောက်တွင်လွတ်လပ်စွာစမ်းသပ်နိုင်ပါသည်။
We extract sentences (text segments demarcated by “\u104b” character).
# split into sentences
system.time(
  sen_xdocTNS.t <- char_segment(myNbl_xdocTNS.t, pattern = "\u104b", valuetype = "regex", pattern_position = "after")
)
   user  system elapsed 
  11.50    0.55   12.16 
To complete the sentences we add back the “\u104b” character. Now we have 508,556 separate “sentences”, one per line.
# add \u104b to the end of line
senP_xdocTNS.t <- do.call(paste, c(list(sen_xdocTNS.t),"\u104b",sep = ""))
length(senP_xdocTNS.t)
[1] 508556
To check, we view the three sentences in line 22-24.
utf8::utf8_print(senP_xdocTNS.t[c(22:24)])
[1] "ဤစာသားကိုမဖျက်ရကျေးဇူးပြု၍ဤစာသားကိုမဖျက်ပါနှင့်ဝီကီပီးဒီးယားမှကြိုဆိုပါတယ်ကျေးဇူးပြု၍ဤအပိုင်းကိုသည်အတိုင်းထားပေးပါ။"
[2] "ဤစာမျက်နှာကိုပုံမှန်ရှင်းလင်းပါသည်။"                                                            
[3] "သင်၏တည်းဖြတ်မှုစွမ်းရည်ကိုအောက်တွင်လွတ်လပ်စွာစမ်းသပ်နိုင်ပါသည်။"                                           
We look at the summary of distribution of number of characters per sentence and their percentiles at 5% intervals.
summary(nchar(senP_xdocTNS.t))
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    1.0    57.0    88.0   109.1   135.0 14686.0 
quantile(nchar(senP_xdocTNS.t), prob = seq(0, 1, .05), type = 7)
   0%    5%   10%   15%   20%   25%   30%   35%   40%   45%   50%   55%   60%   65%   70% 
    1    16    32    43    51    57    64    69    75    82    88    96   104   113   123 
  75%   80%   85%   90%   95%  100% 
  135   149   168   196   251 14686 
Roughly, a longer “sentence” is more likely be a genuine sentence than a shorter one, I guess. So I am going to play safe by dropping about half of the “sentences, that is, by taking only those with 90 characters or more. You may like to take a different cut off point, or use a different strategy altogether.
nc <- nchar(senP_xdocTNS.t)
senP_nc90 <- senP_xdocTNS.t[which(nc >= 90)]
length(senP_nc90)
[1] 250291
We read a random sample of 10 sentences.
set.seed(424)
utf8::utf8_print(senP_nc90[sample(1:length(senP_nc90),10)])
 [1] "မိန်နက္ခတာရာအလင်းနှစ်ဂျွန်ဟာရှယ်သည်မိန်နက္ခတာရာရှိနှစ်ဘက်ခုံးဂလက်ဆီဖြစ်ပြီးနေအဖွဲ့အစည်းမှအလင်းနှစ်၁၈၈မီလီယံကွာဝေးသည်။"      
 [2] "မြန်မာနိုင်ငံတွင်နိုင်ငံတည်ဆောက်ရေးကိုအမှန်တကယ်အာရုံစူးစိုက်စတင်တော့မည်ဟုဆိုလျှင်မြန်မာနိုင်ငံ၏နိုင်ငံတည်ဆောက်ရေးဆိုင်ရာမူဝါဒများကိုဝို…"
 [3] "ပို၍တိကျစွာဆိုရသော်တရုတ်နိုင်ငံ၏တောင်ဘက်၊အိန္ဒိယနိုင်ငံ၏အရှေ့ဘက်နှင့်ဩစတေးလျနိုင်ငံ၏မြောက်ဘက်တို့တွင်တည်ရှိသည်။"                 
 [4] "၁၉၄၇ခု၊ဇူလိုင်လ၁၉ရက်၊စနေနေ့၊နံနက်၁ဝနာရီ၄၅မိနစ်တွင်အာဇာနည်ခေါင်းဆောင်ကြီးများကိုလုပ်ကြံသောမသမာသူတို့၏လက်ချက်ဖြင့်ကျဆုံ…"
 [5] "မြန်မာနိုင်ငံတော်ဗဟိုဘဏ်၏လက်ရှိအတိုးနှုန်းမှတစ်နှစ်လျှင်၁၀ဖြစ်ပြီး၊အပ်ငွေအဖြစ်အနည်းဆုံးအတိုးနှုန်းမှာတစ်နှစ်လျှင်၈နှင့်ချေးငွေအပေါ်…"
 [6] "သံမဏိလုပ်ငန်းတိုးတက်လာပြီးသည့်နောက်တွင်၁၉ဝဝပြည့်နှစ်နောက်ပိုင်းမှစ၍ရှက်ဖီးမြို့၏နယ်နိမိတ်ကိုတိုးချဲ့လာရသည်။"                  
 [7] "သူ့တသက်တွင်နိုင်ငံတော်နှင့်အစိုးရအကြီးအကဲစသည့်ရာထူးများကိုမရယူခဲ့သော်လည်းလက်တွေ့တွင်မူ၁၉၇၈ခုနှစ်မှ၁၉၉၀ပြည့်လွန်နှစ်များအထိတရုတ်ပြည်…"
 [8] "၂၀၁၀ခုနှစ်၊မတ်လတွင်ပါတီကိုထပ်မံမှတ်ပုံတင်ရန်နှင့်ရွေးကောက်ပွဲဝင်သင့်ကြောင်းကိုဦးဆောင်ဆွေးနွေးခဲ့သည်။"                     
 [9] "လီနင်ဂရက်မြို့တွင်ကျယ်ပြန့်သောရိပ်သာများ၊နန်းတော်နှင့်ပြည်သူပိုင်အဆောက်အအုံများကြောင့်ထင်ရှားသည်။"                   
[10] "အထက်မြန်မာပြည်နှင့်ရှမ်းကုန်းပြင်မြင့်ဒေသတွင်အခြေချသည့်တရုတ်လူမျိုးအများစုမှာယူနန်ပြည်နယ်ဘက်မှလာသည့်ယူနန်လူမျိုး၊ပန်းသေးမျ…"
I am calling this collection of 250,291 Myanmar-Wikipedia sentences as myWiki-QDC2 and saves it to the text file: myWiki-QDC2.txt. 119MB. Available for download here.
writeLines(senP_nc90, con = "myWiki-QDC2.txt", useBytes = TRUE)