Pada tutorial sebelumnya kita telah membuat dataframe yang menyimpan Al-Qur’an dengan variabel q
Sys.setlocale("LC_ALL", "arabic" )
## [1] "LC_COLLATE=Arabic_Saudi Arabia.1256;LC_CTYPE=Arabic_Saudi Arabia.1256;LC_MONETARY=Arabic_Saudi Arabia.1256;LC_NUMERIC=C;LC_TIME=Arabic_Saudi Arabia.1256"
q = read.csv("data/quran-simple-clean.txt", header=F, stringsAsFactor=F, encoding="UTF-8", sep="|")
str(q)
## 'data.frame': 6236 obs. of 3 variables:
## $ V1: int 1 1 1 1 1 1 1 2 2 2 ...
## $ V2: int 1 2 3 4 5 6 7 1 2 3 ...
## $ V3: chr "بسم الله الرحمن الرحيم" "الحمد لله رب العالمين" "الرحمن الرحيم" "مالك يوم الدين" ...
colnames(q) = c("surat", "ayat", "teks")
Mari unduh dan gunakan tm
package sebagai bahan eksperimen kita
library(tm)
## Loading required package: NLP
Langkah pertama adalah membuat sebuah corpus
yang terdiri dari ayat-ayat sebagai Vectorscopus
qCorpus = Corpus(VectorSource(q$teks))
Tampilkan isi dari “Corpus”
inspect(qCorpus[1:5])
## <<SimpleCorpus>>
## Metadata: corpus specific: 1, document level (indexed): 0
## Content: documents: 5
##
## [1] بسم الله الرحمن الرحيم الحمد لله رب العالمين الرحمن الرحيم
## [4] مالك يوم الدين إياك نعبد وإياك نستعين
Mari kita membuat “term document matrix”
qTerms = DocumentTermMatrix(qCorpus)
qTerms
## <<DocumentTermMatrix (documents: 6236, terms: 14865)>>
## Non-/sparse entries: 73995/92624145
## Sparsity : 100%
## Maximal term length: 11
## Weighting : term frequency (tf)
Pada hasil diatas menghasilkan sebuah matriks dokumen yang panjang terhadap istilah-istilah Al-Qur’an. Mari kita lihat sebagian matriks ini dengan melihat ke dalam dokumen 1 sampai 7 yaitu surat Al-Fatihah dan term 1000 sampai 1005
inspect(qTerms[1:7,1000:1005])
## <<DocumentTermMatrix (documents: 7, terms: 6)>>
## Non-/sparse entries: 0/42
## Sparsity : 100%
## Maximal term length: 6
## Weighting : term frequency (tf)
## Sample :
## Terms
## Docs وجه ولله اتخذ سبحانه قانتون ولدا
## 1 0 0 0 0 0 0
## 2 0 0 0 0 0 0
## 3 0 0 0 0 0 0
## 4 0 0 0 0 0 0
## 5 0 0 0 0 0 0
## 6 0 0 0 0 0 0
## 7 0 0 0 0 0 0
Perhatikan output diatas tidak satupun 5 term ini muncul di salah satu 7 dokumen pertama. Sparsity adalah masalah yang dikenal dalam term document matrix
Mari kita temukan beberapa istilah umum dalam Al-Qur’an. apa aja term
yang sering digunakan pada Al-Qur’an ?
findFreqTerms(qTerms,100)
## [1] "الرحمن" "الرحيم" "الله" "بسم" "رب" "لله"
## [7] "يوم" "الذين" "عليهم" "ولا" "الكتاب" "ذلك"
## [13] "فيه" "لا" "بما" "من" "هم" "والذين"
## [19] "وما" "أولئك" "ربهم" "على" "أم" "إن"
## [25] "كفروا" "لم" "عذاب" "الناس" "بالله" "ومن"
## [31] "آمنوا" "إلا" "في" "كانوا" "إنما" "الأرض"
## [37] "قالوا" "لهم" "وإذا" "ولكن" "إلى" "إنا"
## [43] "الذي" "فلما" "ما" "أو" "السماء" "والله"
## [49] "شيء" "كل" "ولو" "أيها" "ربكم" "يا"
## [55] "به" "فلا" "لكم" "كنتم" "مما" "وإن"
## [61] "النار" "فإن" "أن" "فيها" "قبل" "هذا"
## [67] "وهم" "الحق" "بعد" "ثم" "عليم" "هو"
## [73] "وهو" "إني" "ربك" "قال" "السماوات" "والأرض"
## [79] "إنه" "عليه" "عليكم" "عن" "موسى" "خير"
## [85] "عند" "قوم" "حتى" "قد" "منكم" "ولقد"
## [91] "كان" "منهم" "قل" "الدنيا" "بل" "يشاء"
## [97] "له" "ربنا" "إذ" "إذا"
Perhatikan hasilnya kata dasar diulang dengan berbagai afiks sebagai kata yang berbeda.
Bahkan kita dapat membuat list terms yang paling sering dan menyimpannya dalam data frame
freq = sort(colSums(as.matrix(qTerms)),decreasing = T)
head(freq, 10)
## من الله في ما إن لا الذين على إلا ولا
## 2763 2265 1185 1013 966 812 810 670 664 658
wf = data.frame(word=names(freq), freq=freq)
mari kita plot menggunakan ggplot2
package
library(ggplot2)
##
## Attaching package: 'ggplot2'
## The following object is masked from 'package:NLP':
##
## annotate
#menampilkan term terbanyak pada data frame
wfplot = subset(wf,freq>300)
ggplot(wfplot, aes(word, freq)) +
geom_bar(stat="identity")+
theme(axis.text.x=element_text(angle=45, hjust = 1))
Sekarang mari kita visualisasi agar lebih keren dengan Word Cloud menggunakan wordcloud
package.
library(wordcloud)
## Loading required package: RColorBrewer
set.seed(114)
wordcloud(names(freq), freq, min.freq=50, scale=c(5,.5),colors=brewer.pal(6,"Dark2"), rot.per=0.2)
Mari eksplor lebih banyak mengenai word length pada Al-Qur’an. Pertama kumpulkan semua kata dalam data frame word
dan word length pada wLen
words = as.matrix(colnames(qTerms))
wLen = data.frame(nletters=nchar(words))
Mari visualisasikan
ggplot(wLen, aes(x=nletters))+
geom_histogram(binwidth=1) +
geom_vline(xintercept=mean(nchar(words)),
colour="green", size=1, alpha=.5)+
labs(x="Number of Letters", y="Number of Words")
Hal ini menunjukkan bahwa rerata ukuran kata mendekati 5 huruf. Dan disini tidak membahas tentang kata dasar, melainkan raw words dengan prefiks dan sufiks
Selanjutnya kita menyimpulkan dengan menganalisis frekuensi huruf. Pertama kita perlu menginstal beberapa package
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(stringr)
##
## Attaching package: 'stringr'
## The following object is masked _by_ '.GlobalEnv':
##
## words
library(qdap)
## Loading required package: qdapDictionaries
## Loading required package: qdapRegex
##
## Attaching package: 'qdapRegex'
## The following object is masked from 'package:dplyr':
##
## explain
## The following object is masked from 'package:ggplot2':
##
## %+%
## Loading required package: qdapTools
##
## Attaching package: 'qdapTools'
## The following object is masked from 'package:dplyr':
##
## id
##
## Attaching package: 'qdap'
## The following objects are masked from 'package:tm':
##
## as.DocumentTermMatrix, as.TermDocumentMatrix
## The following object is masked from 'package:NLP':
##
## ngrams
## The following objects are masked from 'package:base':
##
## Filter, proportions
letter = str_split(words,"")
letter = sapply(letter, function(x) x[-1])
letter = unlist(letter)
letter = dist_tab(letter)
letter
adalah data frame yang bagus yang memberikan list huruf dengan frekuensi dan persentase frekuensi kumulatifnya. Mari kita buat grafiknya
letterMutate = mutate(letter,Letter=factor(letter$interval, levels=letter$interval[order(letter$freq)]))
ggplot(letterMutate, aes(letterMutate$Letter, weight=percent)) +
geom_bar()+
coord_flip()+
ylab("Proportion")+
xlab("Letter")+
scale_y_continuous(breaks=seq(0,12,2),
label=function(x) paste0(x,"%"),
expand=c(0,0), limits=c(0,12))
## Warning: Use of `letterMutate$Letter` is discouraged. Use `Letter` instead.
## Warning: Removed 1 rows containing missing values (geom_bar).