Saturday, January 18, 2020

A tribute to Yodayas - III: Corpus of songs


It seems futile to wait for others to give me feedback with the corrected version of songs from the raw text of 35 Mahagita Yodaya songs that I’d shared with my last post. So I tried correcting them on my own and I found something interesting even in this seemly simple task.
Although we have access to a significant number of standard Mahagita anthologies, there seems to be a considerable number of differences in wording for some lyrics. I hurriedly skimmed them, particularly with the Yodaya songs, but understandably, even trying to understand the issues was way beyond me. For example, reading through the songs I found that the phrase “သည်မှာကုံဆန်း” in the Yodaya song No. 27 of the original Mahagita anthology and the phrase “သည်မှာကုန်ဆန်း” in song No. 10 of the same anthology. The two phrases, each consisting of four syllables are voiced exactly the same but have different meanings because the third syllables were spelled differently. What is interesting is that the second phrase comes from the Yodaya song with known authorship and the first one comes from a Yodaya song written by an unknown author. Lacking proper knowledge I have to leave it as such. May be someone would sort it out in the meantime, or may be it already had been sorted out, I don’t know.
Now, I’ve my raw Yodaya songs cleaned and is being shared here.
Note that I’m sharing the file as is, and it could still contain errors. Furthermore, I have added “(NA)” to mark the songs with unknown author, and the characters: “<<SE>>” to mark the end of a song, for use in the present exercise.
library(readtext)
x <- readtext("MahaGita_yodaya 1-35_df.odt", encoding = "ÜTF-8")
str(x)
Classes ‘readtext’ and 'data.frame':    1 obs. of  2 variables:
 $ doc_id: chr "MahaGita_yodaya 1-35_df.odt"
 $ text  : chr "<U+1041><U+104B> <U+1021><U+101C><U+103D><U+1019><U+103A><U+1038><U+1018><U+103D><U+1032><U+1037><U+101A><U+102"| __truncated__
summary(x)
    doc_id              text          
 Length:1           Length:1          
 Class :character   Class :character  
 Mode  :character   Mode  :character  
Remove line breaks from text:
y <- gsub("\n","",x[,2])
Split into songs, and view the first and fourth songs:
library(quanteda)
y.s <- strsplit(y, "<<SE>>") %>%
  unlist
cat(y.s[c(1,4)])
၁။ အလွမ်းဘွဲ့ယိုးဒယား(မြဝတီမင်းကြီး) (လွမ်းပိုအောင်၊ ညိုမင်းလွင်၊ လေပြေပျိုး၊ တိမ်ခိုးဆင်) ၂။ မျှော်တိုင်း မှိုင်းလွင်၊ ရွှေဘွင်ကြုံရ၊ ပင်နန်းသာထွေ၊ နွေရာမင်းငယ်၊ သာသည်လေ၊ အို ကြုံရ လွမ်းဘွယ်၊ လှိုင်ကြွယ်သင်းကြူ၊ ဂေါ်ဇင်ကြိုင်ပျံ့ရှား၊ ရွှေဆပ်သွား၊ ခိုင်မဉ္ဇူ။ ။ ၄။ ဘုန်းတော်ဘွဲ့ယိုးဒယား (NA)(မြမန်းဂီရိသေလာတောင်၊ နန်းတည်ထောင် ဘုန်းရောင်နေသို့လင်း။ နောင် ညီကို၊ ရွှေဘိုနွယ်တော်ရင်း။ ရာဆူဆူ၊ ပြည်သူခဝပ်စင်း။ ရွှေဘုန်းတော်၊ နှုန်းလျော်စံပျော်ခင်း။ တေဇာတိုးလို့ဖြိုးဝေ၊ မန်းဌာနေ၊ အောင်ဇေယျာပြည်မင်း)၂။ [(ပြောင်လူးနာဂရုစာ၊ သော်တာငွေလျှံ၊ မျိုးမြတ်ဆဒ္ဒန်။ ရွှေနန်းဘုံတော်၊ရောက်ရာ ရွှေကိုယ်တော်၊ ပြည်တော်နိုင်ငံရွှေဘုံတွင်း)၂။ ဆန်းမူရာ၊ သူဇာရွေ ခပင်း၊ ရွှေဘုန်းတော်၊ နှုန်းလျော်စံ‌ပျော်ခင်း။ တေဇာတိုးလို့ ဖြိုးဝေ၊ မန်းဌာနေ၊ အောင်ဇေယျာပြည်မင်း]၂။ ။
Extract the names of authors:
library(stringr)
author <- str_extract(y.s, "\\([\\s\u1000-\u1021\u1024-\u1027\u1029-\u1032\u1036-\u104f]*\\)|\\(NA\\)")
cat(author)
(မြဝတီမင်းကြီး) (NA) (ပြင်စည်မင်းသား) (NA) (NA) (NA) (NA) (ယိုးဒယားပန်းချီဝန် ဦးထောင်ဘို) (ပြင်စည်မင်းသား) (မြဝတီဝန်ကြီး) (မြဝတီမင်းကြီး) (NA) (မြဝတီမင်းကြီး) (NA) (NA) (NA) (NA) (NA) (NA) (NA) (မြဝတီဝန်ကြီး) (မြဝတီဝန်ကြီး) (ပြင်စည်မင်းသား) (ပြင်စည်မင်းသား) (ပြင်စည်မင်းသား) (NA) (ပြင်စည်မင်းသား) (ပြင်စည်မင်းသား) (ပြင်စည်မင်းသား) (NA) (ပြင်စည်မင်းသား) (ပြင်စည်မင်းသား) (ဝက်မစွတ်ဝန်ထောက်) (NA) (ပြင်စည်မင်းသား)
Extract the names of songs and remove white spaces and view a sample of titles:
TE <- regexpr("\\(", y.s)-1
title <-  trimws(substr(y.s, 1, TE))
title[1:9]
[1] "၁။ အလ\u103dမ\u103aးဘ\u103dဲ့ယိုးဒယား"                    
[2] "၂။ ကန\u103aဆင\u103aးယိုးဒယား"                          
[3] "၃။ မန္တလေးမ\u103cို့ဘ\u103dဲ့ယိုးဒယား"                       
[4] "၄။ ဘုန\u103aးတော\u103aဘ\u103dဲ့ယိုးဒယား"                  
[5] "၅။ မန္တလေးမ\u103cို့ဘ\u103dဲ့ယိုးဒယား"                       
[6] "၆။ မိုးဘ\u103dဲ့ယိုးဒယား"                                  
[7] "၇။ တောတောင\u103aဘ\u103dဲ့ယိုးဒယား"                       
[8] "ဂ။ အလ\u103dမ\u103aးဘ\u103dဲ့ယိုးဒယား"                    
[9] "၉။ ရာမဇာတ\u103aထ\u103dက\u103aသမင\u103aလိုက\u103aယိုးဒယား"
In the song-text part, we need to remove the title and author, that is, remove that part from column1 to column up to the first paranthesis mark “)”, and trim all white spaces.
TnAE <- regexpr("\\)", y.s)
song <- trimws(substring(y.s, TnAE+1))
Create dataframe from title, author, and song-text, and list songs with known authors and those without known authors.
yodayaSongs <- data.frame(title, author, song, stringsAsFactors = FALSE)
summary(yodayaSongs)
    title              author              song          
 Length:35          Length:35          Length:35         
 Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character  
author.N <- yodayaSongs[which(yodayaSongs$author == "(NA)"),1:2]
author.Y <- yodayaSongs[which(!yodayaSongs$author == "(NA)"),1:2]
utf8::utf8_print(sapply(author.N, paste0))
      title                 author
 [1,] "၂။ ကန်ဆင်းယိုးဒယား"      "(NA)"
 [2,] "၄။ ဘုန်းတော်ဘွဲ့ယိုးဒယား"    "(NA)"
 [3,] "၅။ မန္တလေးမြို့ဘွဲ့ယိုးဒယား"  "(NA)"
 [4,] "၆။ မိုးဘွဲ့ယိုးဒယား"        "(NA)"
 [5,] "၇။ တောတောင်ဘွဲ့ယိုးဒယား"   "(NA)"
 [6,] "၁၂။ တောဘွဲ့ယိုးဒယား"      "(NA)"
 [7,] "၁၄။ တောဘွဲ့ယိုးဒယား"      "(NA)"
 [8,] "၁၅။ တောဘွဲ့ယိုးဒယား"      "(NA)"
 [9,] "၁၆။ မှော်ပြန်ယိုးဒယား"    "(NA)"
[10,] "၁၇။ တောဘွဲ့ယိုးဒယား"      "(NA)"
[11,] "၁၈။ ရာမဇာတ်ထွက်ယိုးဒယား"  "(NA)"
[12,] "၁၉။ တောဘွဲ့ယိုးဒယား"      "(NA)"
[13,] "၂၀။ ရေလားယိုးဒယား"     "(NA)"
[14,] "၂၆။ ရာမဇာတ်ဖြည့်ယိုးဒယား" "(NA)"
[15,] "၃၀။ မန္တလေးမြို့ဘွဲ့ယိုးဒယား" "(NA)"
[16,] "၃၄။ ရာမဇာတ်ဖြည့်ယိုးဒယား" "(NA)"
utf8::utf8_print(sapply(author.Y, paste0))
      title                              author                   
 [1,] "၁။ အလွမ်းဘွဲ့ယိုးဒယား"                   "(မြဝတီမင်းကြီး)"           
 [2,] "၃။ မန္တလေးမြို့ဘွဲ့ယိုးဒယား"               "(ပြင်စည်မင်းသား)"          
 [3,] "ဂ။ အလွမ်းဘွဲ့ယိုးဒယား"                   "(ယိုးဒယားပန်းချီဝန် ဦးထောင်ဘို)"
 [4,] "၉။ ရာမဇာတ်ထွက်သမင်လိုက်ယိုးဒယား"           "(ပြင်စည်မင်းသား)"          
 [5,] "၁၀။ မြင်းတက်ယိုးဒယား"                 "(မြဝတီဝန်ကြီး)"            
 [6,] "၁၁။ စက်တော်ချင်း"                    "(မြဝတီမင်းကြီး)"           
 [7,] "၁၃။ အီနောင်ဇာတ်ဖြည့်ယိုးဒယား"            "(မြဝတီမင်းကြီး)"           
 [8,] "၂၁။ အီနောင်ဇာတ်ထွက်ယိုးဒယား"             "(မြဝတီဝန်ကြီး)"            
 [9,] "၂၂။ အီနောင်ဇာတ်ထွက်ယိုးဒယား"             "(မြဝတီဝန်ကြီး)"            
[10,] "၂၃။ တောဘွဲ့ယိုးဒယား"                   "(ပြင်စည်မင်းသား)"          
[11,] "၂၄။ အလွမ်းဘွဲ့ယိုးဒယား"                  "(ပြင်စည်မင်းသား)"          
[12,] "၂၅။ တောဘွဲ့ယိုးဒယား"                   "(ပြင်စည်မင်းသား)"          
[13,] "၂၇။ တောဘွဲ့ယိုးဒယား"                   "(ပြင်စည်မင်းသား)"          
[14,] "၂၈။ တောဘွဲ့ယိုးဒယား"                   "(ပြင်စည်မင်းသား)"          
[15,] "၂၉။ တောဘွဲ့ယိုးဒယား"                   "(ပြင်စည်မင်းသား)"          
[16,] "၃၁။မင်းတုန်းမင်းတရားကြီးဘုန်းတော်ဘွဲ့ယိုးဒယား" "(ပြင်စည်မင်းသား)"          
[17,] "၃၂။ အလွမ်းဘွဲ့ယိုးဒယား"                  "(ပြင်စည်မင်းသား)"          
[18,] "၃၃။ နန်းသိမ်းယိုးဒယား"                 "(ဝက်မစွတ်ဝန်ထောက်)"          
[19,] "၃၅။ ရာမဇာတ်ထွက်ယိုးဒယား"               "(ပြင်စည်မင်းသား)"          
Create corpus from above data frame:
Ysong.c <- corpus(yodayaSongs,   docid_field = "title",   text_field = "song")
docvars(Ysong.c,"title") <- yodayaSongs$title 
docvars(Ysong.c,"author") <- yodayaSongs$author 
str(Ysong.c)
List of 4
 $ documents:'data.frame':  35 obs. of  3 variables:
  ..$ texts : chr [1:35] "(<U+101C><U+103D><U+1019><U+103A><U+1038><U+1015><U+102D><U+102F><U+1021><U+1031><U+102C><U+1004><U+103A><U+104"| __truncated__ "(<U+101B><U+103D><U+103E><U+1031><U+1000><U+103C><U+1000><U+103A><U+1000><U+101A><U+103A><U+101F><U+1014><U+103"| __truncated__ "<U+101D><U+1031><U+1007><U+101A><U+1014><U+1039><U+1010><U+102C><U+1014><U+1014><U+103A><U+1038><U+1018><U+102F"| __truncated__ "(<U+1019><U+103C><U+1019><U+1014><U+103A><U+1038><U+1002><U+102E><U+101B><U+102D><U+101E><U+1031><U+101C><U+102"| __truncated__ ...
  ..$ author: chr [1:35] "(<U+1019><U+103C><U+101D><U+1010><U+102E><U+1019><U+1004><U+103A><U+1038><U+1000><U+103C><U+102E><U+1038>)" "(NA)" "(<U+1015><U+103C><U+1004><U+103A><U+1005><U+100A><U+103A><U+1019><U+1004><U+103A><U+1038><U+101E><U+102C><U+1038>)" "(NA)" ...
  ..$ title : chr [1:35] "<U+1041><U+104B> <U+1021><U+101C><U+103D><U+1019><U+103A><U+1038><U+1018><U+103D><U+1032><U+1037><U+101A><U+102"| __truncated__ "<U+1042><U+104B> <U+1000><U+1014><U+103A><U+1006><U+1004><U+103A><U+1038><U+101A><U+102D><U+102F><U+1038><U+101"| __truncated__ "<U+1043><U+104B> <U+1019><U+1014><U+1039><U+1010><U+101C><U+1031><U+1038><U+1019><U+103C><U+102D><U+102F><U+103"| __truncated__ "<U+1044><U+104B> <U+1018><U+102F><U+1014><U+103A><U+1038><U+1010><U+1031><U+102C><U+103A><U+1018><U+103D><U+103"| __truncated__ ...
 $ metadata :List of 2
  ..$ source : chr "C:/DATA/GITA_EX/* on x86-64 by mtnn"
  ..$ created: chr "Sat Jan 18 15:48:04 2020"
 $ settings :List of 12
  ..$ stopwords          : NULL
  ..$ collocations       : NULL
  ..$ dictionary         : NULL
  ..$ valuetype          : chr "glob"
  ..$ stem               : logi FALSE
  ..$ delimiter_word     : chr " "
  ..$ delimiter_sentence : chr ".!?"
  ..$ delimiter_paragraph: chr "\n\n"
  ..$ clean_tolower      : logi TRUE
  ..$ clean_remove_digits: logi TRUE
  ..$ clean_remove_punct : logi TRUE
  ..$ units              : chr "documents"
  ..- attr(*, "class")= chr [1:2] "settings" "list"
 $ tokens   : NULL
View song No. 8, and all songs for which authorship is unknown. Note that output of song texts are truncated to save space.
utf8::utf8_print(texts(Ysong.c)[8])
ဂ။ အလွမ်းဘွဲ့ယိုးဒယား                                                                 
"(ဆန်းနွေဦး လေရူးဆော်ပြန်လာ၊ မွှေးပျံ့ကြိုင်လှိုင်စွာ၊ မာလာဝတ်မှုန် ပင်စုံ မြိုင်)၂။ (ငှက်မောင်မယ် ဘာသာသူတို့နွှဲ၊ …"
utf8::utf8_print(texts(corpus_subset(Ysong.c, author == "(NA)")))
၂။ ကန်ဆင်းယိုးဒယား                                                                 
"(ရွှေကြက်ကယ်ဟန်ချီ၊ လင်းလုပြီနော်မေ၊ ရောင်နီလာဖြာဖြာဝင်း၊ မောင် မယ်ဆင်း၊ ဆင်းစို့ကွယ်။ရွှေဝါးရုံခက်သွယ်၊ …"
၄။ ဘုန်းတော်ဘွဲ့ယိုးဒယား                                                               
"(မြမန်းဂီရိသေလာတောင်၊ နန်းတည်ထောင် ဘုန်းရောင်နေသို့လင်း။ နောင် ညီကို၊ ရွှေဘိုနွယ်တော်ရင်း။ ရာဆူဆူ၊ ပြည်သူခ…"
၅။ မန္တလေးမြို့ဘွဲ့ယိုးဒယား                                                             
"(အောင်မင်္ဂလာ၊ သိင်္ဂဆောင်ဘွေ တောင်ခြေရစ်သန်း၊ စကြာဆူဆူ၊ ရှစ်ဖြူ ကာလွှမ်း၊ ကျက်သရေလျှမ်း၊ ပြည်တော်ရွှေ…"
၆။ မိုးဘွဲ့ယိုးဒယား                                                                   
"(ဆန်းဆန်းသဉ္စာညောင်၊ နန်းမြင့်ဘွေဆောင်၊ သဉ္ဇာကြာညောင်၊နန်း မြင့်ဘွေဆောင်) ၂။ ။(ရွှေညဉ့်လွှာရုံညဉ့်လွှာရုံ)…"
၇။ တောတောင်ဘွဲ့ယိုးဒယား                                                              
"[(မြိုင်ဟေမာ ကန္တာလမ်း၊ ဆန်းထွေလာ၊ တောင်သေလာငူ၊ ချောင်ရွှေဝါဂူ၊ လေပြေသုတ်ကာယူ၊ တောလုံးကြူ)၂။ ။(…"
၁၂။ တောဘွဲ့ယိုးဒယား                                                                 
"( ကန္တာ တောခြေ၊ အိုးဝေမြည်သံ၊ ငှက်ပေါင်း ပျော်စံ၊ မြူးကြလူဟန်၊ ဖန်ဖန် ခေါ်ကာ၊ အော်ရှာကြွေးတယ်၊ …" 
၁၄။ တောဘွဲ့ယိုးဒယား                                                                 
"(တောဟေဝန်လယ်၊ တိမ်နယ်တောင်စွယ် ဝေယန်ဦး၊ ရာပြည်တန်၊ ရောင်လျှံ ထိန်ထိန်၊ ဖလ်ရှိန်နေသို့မြူး၊ ထူးအံ့ဘွယ်သွယ်)၂။ …"
၁၅။ တောဘွဲ့ယိုးဒယား                                                                 
"[တောနှင့်တောင်စွယ်၊ ပြောကြမောင်မယ် (ငှက်ကယ်လူလို သံချိုနှောလို ပြောကြပြန်သကို )၂]၂။ [(သိုက်မြုံမှာလေစာခွံ့…"  
၁၆။ မှော်ပြန်ယိုးဒယား                                                               
"(နန်းသီဟိုဠ်၊ ရေညိုဝန်း ခွေရံကာ၊ မိမာတာသည်းချာ လှော်ရွှေသွေး၊ ခွန်ယူ ကျွေးတဲ့မှော်ရဂုံ၊ တူပျော်စုံ၊ သာဂုံဂန္ဓာ…"
၁၇။ တောဘွဲ့ယိုးဒယား                                                                 
"(ပန်းဟေဝန်၊ ခုနှစ်ခွေ မျှော်လေယောင်၊ ညိုပြာရီမှောင်၊ တိမ်တောင်နီလာ သွေး၊ ဆွေးဘွယ်၊ သွယ်သွယ်ထွေလာနှော၊ ရေ…"
၁၈။ ရာမဇာတ်ထွက်ယိုးဒယား                                                             
"[(တောမြိုင်စွန်းက၊ လွမ်းအောင်ဖန်၊ မကြံနိုင်၊ ကိုယ်ထူးကြုံရပြန်) ၂။ ချစ်တဲ့သူ သခင်မြင်လာအုံးဖျ၊ သုံးရွေရင်။ ဘု…"
၁၉။ တောဘွဲ့ယိုးဒယား                                                                 
"(မြိုင်ဂန္ဓမာ၊ ပန်းမျိုးစုံစွာပေါကြ၊ တောလေသည် ဟေမာ၊ ဇင်မင်း ဆင်း ရွှေဝါ၊ ဇီဇဝါငယ်လေ ခတ္တာနှော၊ သ…"
၂၀။ ရေလားယိုးဒယား                                                                
"(သောင်းသောင်းညံ၊ ကြင်ဖေါ် စင်ရော်မောင်နှံတွဲလို့ဝဲကာပျံ) ၂။ (မောင်နှံ တောင်ပံရိုက်ဆော်သွင်း၊ သောင်တင်း ခေါ…"
၂၆။ ရာမဇာတ်ဖြည့်ယိုးဒယား                                                            
"[(ပန်းညောင်လှိုင်ဖွဲ့ဘွေဆိုင်၊ ကေခိုင်ကုံးငယ်၊ ခွေယိုင်နုန်းတယ်၊သုံးရွေလယ်၊ ဘုန်းမယ်ဒါရူ သည်းအူဗျာလှိုင်ကြွယ်၊ ကျွမ်းလော…"
၃၀။ မန္တလေးမြို့ဘွဲ့ယိုးဒယား                                                            
"[မန်းတောင်လက်ျာ၊ ဘုန်းနေလ၊ နှုန်းလေတေဇာဝေဖြာ၊ ဝင်းထိန်လို့ဝါ (များစွာဗိုလ်ခြေ ဝေနေပေါင်း)၂။ ကော…"
၃၄။ ရာမဇာတ်ဖြည့်ယိုးဒယား                                                            
"[(ကြို့ညိုစံရာ၊ သုကျိတ်မင်းမှာ ယောက်ချင်းလေ ပျော်ရရှာ) ၂။ ။ မြင်လာအုံး ဘုန်းသုဘတ္တာ၊ သည်မောင်ပူရတုန်းပါ…"
For the purpose of NLP, I first remove all characters that are not Myanmar characters including Myanmar numbers, including spaces in text, then split text by minor or major section mark. By this each of the songs has been split into song “phrases”. The number of such phrases in a song could be counted by using the str_count() function.
song0 <- gsub("[[:punct:][:blank:]]","",song) %>%
  gsub("[\u1040-\u1049]", "", .) %>%
  gsub("[\u104a\u104b]", " ", .) %>%
  trimws(., which = "right")
cat(song0[1])
လွမ်းပိုအောင် ညိုမင်းလွင် လေပြေပျိုး တိမ်ခိုးဆင် မျှော်တိုင်းမှိုင်းလွင် ရွှေဘွင်ကြုံရ ပင်နန်းသာထွေ နွေရာမင်းငယ် သာသည်လေ အိုကြုံရလွမ်းဘွယ် လှိုင်ကြွယ်သင်းကြူ ဂေါ်ဇင်ကြိုင်ပျံ့ရှား ရွှေဆပ်သွား ခိုင်မဉ္ဇူ
# count "words"
library(stringr)
str_count(song0[1], "\\S+")
[1] 14
I create a dataframe of Yodaya songs with song-text split into phrases (to be formed into tokens for the purpose of NLP):
Ysong0 <- data.frame(title, author, song0, stringsAsFactors = FALSE)
summary(Ysong0)
    title              author             song0          
 Length:35          Length:35          Length:35         
 Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character  
Create corpus from data frame. The song-text from this corpus could be accessed using the texts() function.
Ysong0.c <- corpus(Ysong0,   docid_field = "title",   text_field = "song0")
docvars(Ysong0.c,"title") <- Ysong0$title 
docvars(Ysong0.c,"author") <- Ysong0$author 
cat(texts(Ysong0.c[1]))
လွမ်းပိုအောင် ညိုမင်းလွင် လေပြေပျိုး တိမ်ခိုးဆင် မျှော်တိုင်းမှိုင်းလွင် ရွှေဘွင်ကြုံရ ပင်နန်းသာထွေ နွေရာမင်းငယ် သာသည်လေ အိုကြုံရလွမ်းဘွယ် လှိုင်ကြွယ်သင်းကြူ ဂေါ်ဇင်ကြိုင်ပျံ့ရှား ရွှေဆပ်သွား ခိုင်မဉ္ဇူ

2 comments:

  1. Second paragraph, line-5 should be replaced by "found that the phrase “သည်မှာကုံဆန်း” in the Yodaya song No. 17 of the original Mahagita".

    ReplyDelete
  2. Pardon! Corrected line number 10 and 11 of text.

    ReplyDelete