Text Mining Dengan Al-Qur’an

Moh. Ainur Rohman dan Prof. Dr. Suhartono, M.Kom.

UIN Maulana Malik Ibrahim Malang

Magister Informatika
9 November 2021

Langkah Pertama Text Mining Pada Al-Qur’an

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")

Text Mining Package

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

Beberapa operasi dari Document Term Matrices

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))

Word Cloud

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)

Word Length

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

Letter frequencies

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).

Referensi

[1] http://textminingthequran.com/tutorial/tm.html