How to do Tamil Text Analysis & NLP in R
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
udpipe is a beautiful R package for Text Analytics and NLP and helps in Topic Extraction. While most Text Analytics resources online are only about English, This post picks up a different lanugage – Tamil and fortuntely, udpipe
has got a Tamil Language Model.
Loading
library(udpipe)
Tamil Text
Below is part extracted from a Tamil Movie Review
text <- data.frame(tamil = "கரு - கோமாவால் 16 வருட வாழக்கையை இழந்தவன் மனிதத்தை இந்த கால மனிதர்களுக்கு நினைவுபடுத்து தான் கோமாளி படத்தின் கரு.கதை - 1986 பள்ளி இறுதியாண்டில் படிக்கும் ஜெயம் ரவி காதல் சொல்லும் தருணத்தில் விபத்துக்குள்ளாகிறார். அதனால் நினைவிழந்து கோமாவுக்கு செல்லும் அவர் 2016ல் மீண்டு வருகிறார். உலக மாற்றங்களை புரிந்து கொள்ள முடியாமல், தன்னை அதற்கு ஏற்றவாறு பொருத்திக்கொள்ள முடியாமல் தவிக்கிறார். இன்னொருபுறம் அவரது குடும்பம் கடும் பணக்கஷ்டத்தில் இருக்க அவரிடம் இருந்த சிலை ஒன்று விலைமதிப்பற்ற ராஜ வமசத்தை சேர்ந்தது என்றும், தனியார் அருங்காட்சியகத்தால் அது பாதுகாக்கப்பட்டு வருவதும் தெரிந்து அதை கொள்ளையடிக்க முயல்கிறார். முடிவில் என்ன நடந்தது என்பதே கதை. விமர்சனம் -ஜெயம் ரவி தொடர்ந்து வித்தியாசமான ஜானர்களை தேர்ந்தெடுத்து நடித்து வருகிறார். இதில் நினைவை இழந்தவனின் கதையை தொட்டுள்ளார். 1980 களின் உலகத்திற்கும் தற்போதைய காலத்தின் வித்தியாசத்தையும் மையமாக வைத்து தான் மொத்தக் கதையும். ஆனால் அதன் ஊடாக காமெடியாக தமிழ் சினிமா மசாலாவில் ஒரு கதையை சொல்லியிருக்கிறார்கள். மண்டையை பிய்த்துகொள்ளும் சிக்கலான திரைக்கதையாக இல்லாமல் தற்கால யூடியூப் வீடியோக்கள் போல திரைக்கதை எழுதப்பட்டிருப்பது நலம். ஒவ்வொரு காட்சியும் காமெடியாக ஆரம்பித்து சென்டிமெண்ட்டாக மாறிவிடுகிறது. ஜெயம் ரவி 1980 களின் வாழ்க்கையில் இருந்து கொண்டு அவர் செய்யும் குறும்புகள் சிரிப்பு. 1980களின் மனநிலையில் ஒருவன் இருந்தால என்னாகும் என்பதை இன்னும் ஆழமாக சொல்லியிருக்கலாம். காஜலுடன் காதல், சிலைத்திருட்டு என்று படம் வேறு பாதைக்கு ஓடி விடுகிறது. ஜெயம் ரவி ஸ்கூல் பையனாக உடல் இளைத்து, 2016ஐ புரிந்து கொள்ளாமல் தவிப்பது, காதல் சொல்ல தடுமாறுவது, பிள்ளைகளுடன் விளையாடுவது என கலக்கியிருக்கிறார். காமெடி என முடிவெடுத்து செய்திருக்கிறார்கள். அதை ஒழுங்காகவும் செய்து முடித்துள்ளாரகள். ஆனால் படத்திற்குள்ளாக ஜானர் மாறிக்கொண்டிருப்பது ஏனோ! காஜல் அழகாக இருக்கிறார். ஆனால் அவருக்கு நடிக்க பெரிய வாய்ப்பு இல்லை. படத்தில் மிகப்பெரிய நட்சத்திர பட்டாளம், யோகி பாபு நண்பனாக சமீபத்தில் நிறைய வசீகரிக்கிறார். ஆனால் அவர் ஐடி வேலை என்பது உட்டாலக்கடி. கே. எஸ் ரவிக்குமார் ஆச்சரியமான வில்லனாக வருகிறார். வரும் சில இடங்களிலும் கவனம் ஈர்த்திருக்கிறார். மொத்தத்தில் 90கிட்ஸ் மூவி ஃபீலிங்கில் அருமையான படைப்பை தந்திருக்கலாம் ஆனால் தமிழ் சினிமா மசாலாவில் சிக்கி சராசரியான காமெடிப் படமாக ஆகிவிட்டது. இயக்குநர் புதுமுகம் நல்ல நல்ல ஐடியாக்கள் பலவற்றை எழுதி ஒரே படத்தில் திணிக்க முயன்றிருக்கிறார். சராசரி ரசிகனின் ரசிப்பை நம்பி திரைக்கதை எழுதியுள்ளார். ஆனால் பாதி நிறைவேறியிருக்கிறது. பல இடங்களில் இரட்டை அர்த்த வசனம் தேவை தானா? 16 வருடங்கள் கழித்து ரவி இப்போதைய டிரெண்ட் வசனங்கள் பேசுவது எப்படி? ஆனால் எல்லாம் தாண்டி மேக்கிங்கில் கவனம் ஈர்த்துள்ளார்கள். எடிட்டிங் படத்தின் தரத்தை அழகாக்கியிருக்கிறது. இசை ஹிப்ஹாப் பல வருடங்களாக போட்டுக்கொண்டிருக்கும் அதே இசை. இன்னும் எத்தனை ஆண்டுகள் என்பது தெரியவில்லை. கிருஷ்ணராஜுக்கு கதைக்கு நன்றி சொல்லியிருக்கிறார்கள் நன்று. கோமாளி கவனம் ஈர்க்கும் நகைச்சுவை சினிமா.பலம் - காமெடியான திரைக்கதை, கதையின் மையம், ஜெயம் ரவி, காமெடி வசனங்கள்.பலவீனம் - ஜானர் மாறிக்கொண்டே இருப்பது.இறுதியாக - சிரித்து மகிழ ஒரு நல்ல காமெடி சினிமா, ஆனால் அடல்ட் மட்டுமே! ",stringsAsFactors = F)
Downloading and Loading Tamil Language Model
For the first time, The Tamil language model has to be downloaded from the internet but from then we can refer the downloaded file which is usually stored in your current working directory.
# ta <- udpipe::udpipe_download_model("tamil") model <- udpipe_load_model("~/Downloads/tamil-ttb-ud-2.3-181115.udpipe")
Annotation
Annotation is the very first step in any NLP or Text Analytics project where we use the language model to annotate the text that we’ve got. During annotation, the text is tokenized and then tagged (as NOUN, VERB and so on)
annt <- udpipe::udpipe_annotate(model, text$tamil) annt_df <- as.data.frame(annt) head(annt_df) ## doc_id paragraph_id sentence_id ## 1 doc1 1 1 ## 2 doc1 1 1 ## 3 doc1 1 1 ## 4 doc1 1 1 ## 5 doc1 1 1 ## 6 doc1 1 1 ## sentence ## 1 கரு - கோமாவால் 16 வருட வாழக்கையை இழந்தவன் மனிதத்தை இந்த கால மனிதர்களுக்கு நினைவுபடுத்து தான் கோமாளி படத்தின் கரு.கதை - 1986 பள்ளி இறுதியாண்டில் படிக்கும் ஜெயம் ரவி காதல் சொல்லும் தருணத்தில் விபத்துக்குள்ளாகிறார். ## 2 கரு - கோமாவால் 16 வருட வாழக்கையை இழந்தவன் மனிதத்தை இந்த கால மனிதர்களுக்கு நினைவுபடுத்து தான் கோமாளி படத்தின் கரு.கதை - 1986 பள்ளி இறுதியாண்டில் படிக்கும் ஜெயம் ரவி காதல் சொல்லும் தருணத்தில் விபத்துக்குள்ளாகிறார். ## 3 கரு - கோமாவால் 16 வருட வாழக்கையை இழந்தவன் மனிதத்தை இந்த கால மனிதர்களுக்கு நினைவுபடுத்து தான் கோமாளி படத்தின் கரு.கதை - 1986 பள்ளி இறுதியாண்டில் படிக்கும் ஜெயம் ரவி காதல் சொல்லும் தருணத்தில் விபத்துக்குள்ளாகிறார். ## 4 கரு - கோமாவால் 16 வருட வாழக்கையை இழந்தவன் மனிதத்தை இந்த கால மனிதர்களுக்கு நினைவுபடுத்து தான் கோமாளி படத்தின் கரு.கதை - 1986 பள்ளி இறுதியாண்டில் படிக்கும் ஜெயம் ரவி காதல் சொல்லும் தருணத்தில் விபத்துக்குள்ளாகிறார். ## 5 கரு - கோமாவால் 16 வருட வாழக்கையை இழந்தவன் மனிதத்தை இந்த கால மனிதர்களுக்கு நினைவுபடுத்து தான் கோமாளி படத்தின் கரு.கதை - 1986 பள்ளி இறுதியாண்டில் படிக்கும் ஜெயம் ரவி காதல் சொல்லும் தருணத்தில் விபத்துக்குள்ளாகிறார். ## 6 கரு - கோமாவால் 16 வருட வாழக்கையை இழந்தவன் மனிதத்தை இந்த கால மனிதர்களுக்கு நினைவுபடுத்து தான் கோமாளி படத்தின் கரு.கதை - 1986 பள்ளி இறுதியாண்டில் படிக்கும் ஜெயம் ரவி காதல் சொல்லும் தருணத்தில் விபத்துக்குள்ளாகிறார். ## token_id token lemma upos xpos ## 1 1 கரு கரு PROPN NEN-3SN-- ## 2 2 - - PUNCT Z:------- ## 3 3 கோமாவால் கோமாவால் ADV AA------- ## 4 4 16 16 NUM U=------- ## 5 5 வருட வருட ADJ Jd-D----A ## 6 6 வாழக்கையை வாழக்கை NOUN NNA-3SN-- ## feats head_token_id dep_rel deps ## 1 Case=Nom|Gender=Neut|Number=Sing|Person=3 6 nmod <NA> ## 2 PunctType=Comm 5 punct <NA> ## 3 <NA> 5 advmod <NA> ## 4 NumForm=Digit 5 nummod <NA> ## 5 Polarity=Pos|Tense=Past|VerbForm=Part 6 amod <NA> ## 6 Case=Acc|Gender=Neut|Number=Sing|Person=3 12 obj <NA> ## misc ## 1 <NA> ## 2 <NA> ## 3 <NA> ## 4 <NA> ## 5 <NA> ## 6 <NA>
Beginning Tamil Text Analytics
Our Tamil Text (Movie Review) is now annotated to give us a dataframe (structured) and ready for Text Analytics. Before we begin with some insights, if we have to validate this model’s annotation, we can check if the lemmatization has worked properly - at least to a certain extend.
annt_df[c(6,56),c("token","lemma")] ## token lemma ## 6 வாழக்கையை வாழக்கை ## 56 இருக்க இரு
These examples indicate that the lemmatization has been good but at the same time you can go through some other words where the lemmatization hasn’t been as great as it happens with English.
Most used Nouns
library(tidyverse) library(extrafont) loadfonts() #font_import("Latha") annt_df %>% filter(upos %in% 'NOUN') %>% count(lemma) %>% arrange(desc(n)) %>% head(10) %>% ggplot() + geom_bar(aes(reorder(lemma,-n),n), stat = "identity", fill = "#ea37a4") + labs(title = "படம் - மினி விமர்சனம்", x = "count")+ theme_minimal() + theme(text=element_text(family="InaiMathi"))
The plot above is awesome suggesting us the most frequently occured Nouns. The plot has an issue with the font-type where some Tamil words are misspelt and I couldn’t fix it at this moment, so will leave that for another post.
Most used Adjectives
library(tidyverse) library(extrafont) loadfonts() #font_import("Latha") annt_df %>% filter(upos %in% 'ADJ') %>% count(lemma) %>% arrange(desc(n)) %>% head(10) %>% ggplot() + geom_bar(aes(reorder(lemma,-n),n), stat = "identity", fill = "#ea37a4") + labs(title = " படம் - மினி விமர்சனம்", x = "count")+ theme_minimal() + theme(text=element_text(family="InaiMathi"))
Summary
Hopefully, This is a good start from people (like me) who speak Tamil Language to use their Data Science skills on Tamil Text. But this is quite extensible with any other Non-English Language that has a udpipe
language model.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.