Analisa Terjemahan Al-Qur’an

Pada kali ini kita akan mencoba untuk mengalisaa dan mengelompokkan tiap kata yang ada pada terjemahan Al-Qur’an dengan text mining, lalu kita akan melihat perbandingan seberapa banyak konotasi kata yang berarti baik dan seberapa banyak kata yang berkonotasi buruk (ancaman). Sebelum kita mulai mari kit persiapkan dulu dengan menginstall beberapa package yang diperlukan.

packages=c('dplyr', 'tidyverse', 'tidytext', 'ggplot2', 'ggraph', 'knitr', 'quRan')
for (p in packages){
  if (! require (p,character.only = T)){
    install.packages(p)
  }
library(p,character.only = T)
}
## Loading required package: 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
## Loading required package: tidyverse
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5     v purrr   0.3.4
## v tibble  3.1.5     v stringr 1.4.0
## v tidyr   1.1.4     v forcats 0.5.1
## v readr   2.0.2
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
## Loading required package: tidytext
## Loading required package: ggraph
## Loading required package: knitr
## Loading required package: quRan

Setelah install package yang diperlukan, mari kita coba masukkan dulu surah Al-Fatihah yang merupakan surah pertama dalam Al-Qur’an dalam bentuk text yang akan kita jadikan data frame teks yang rapi. untuk format data surah yang dipakai adalah terjemahan berbahasa indonesia.

text <- c("Dengan nama Allah Yang Maha Pengasih, Maha Penyayang",
          "Segala puji bagi Allah, Tuhan seluruh alam",
          "Yang Maha Pengasih, Maha Penyayang",
          "Pemilik hari pembalasan",
          "Hanya kepada Engkaulah kami menyembah dan hanya kepada Engkaulah kami mohon pertolongan",
          "Tunjukilah kami jalan yang lurus",
          "(yaitu) jalan orang-orang yang telah Engkau beri nikmat kepadanya; bukan (jalan) mereka yang dimurkai, dan bukan (pula jalan) mereka yang sesat")

text
## [1] "Dengan nama Allah Yang Maha Pengasih, Maha Penyayang"                                                                                           
## [2] "Segala puji bagi Allah, Tuhan seluruh alam"                                                                                                     
## [3] "Yang Maha Pengasih, Maha Penyayang"                                                                                                             
## [4] "Pemilik hari pembalasan"                                                                                                                        
## [5] "Hanya kepada Engkaulah kami menyembah dan hanya kepada Engkaulah kami mohon pertolongan"                                                        
## [6] "Tunjukilah kami jalan yang lurus"                                                                                                               
## [7] "(yaitu) jalan orang-orang yang telah Engkau beri nikmat kepadanya; bukan (jalan) mereka yang dimurkai, dan bukan (pula jalan) mereka yang sesat"

Berikutnya kita akan menggunakan klas Tibble yang merupakan data frame yang ada pada R. Tibble ini cukup baik untuk digunakan sebagai salah satu tools merapikan data yang ada pada R.

text_df <- tibble(line = 1:7, text = text)
text_df
## # A tibble: 7 x 2
##    line text                                                                    
##   <int> <chr>                                                                   
## 1     1 Dengan nama Allah Yang Maha Pengasih, Maha Penyayang                    
## 2     2 Segala puji bagi Allah, Tuhan seluruh alam                              
## 3     3 Yang Maha Pengasih, Maha Penyayang                                      
## 4     4 Pemilik hari pembalasan                                                 
## 5     5 Hanya kepada Engkaulah kami menyembah dan hanya kepada Engkaulah kami m~
## 6     6 Tunjukilah kami jalan yang lurus                                        
## 7     7 (yaitu) jalan orang-orang yang telah Engkau beri nikmat kepadanya; buka~

Dapat kita lihat data frame diatas bahwa data yang isinya berupa text tersebut masih belum rapi dan belum siap untuk dianalisis mana kata yang baik dari buruk serta menghitung jumlahnya karna kita belum menyaring kata dari setiap variabel kalimat pada data frame tersebut. Sehingga kita perlu untuk merubah data ini menjadi satu token per kata, per dokumen dan per baris. Token ini merupakan unit teks yang memiliki makna. Pada contoh diatas dokumen yang dipakai hanya 1 yaitu surah Al-Fatihah, namun kita akan mencoba untuk mengeksplorasi surah tersebut, lalu kita akan memecah setiap teksnya menjadi token secara individu (dapat kita sebut proses Tokenization) dan menjadikannya Frame Struktur data yang lebih rapi.

text_df %>%
  unnest_tokens(word, text)
## # A tibble: 62 x 2
##     line word     
##    <int> <chr>    
##  1     1 dengan   
##  2     1 nama     
##  3     1 allah    
##  4     1 yang     
##  5     1 maha     
##  6     1 pengasih 
##  7     1 maha     
##  8     1 penyayang
##  9     2 segala   
## 10     2 puji     
## # ... with 52 more rows

Setelah proses tokenization ini dapat kita lihat bahwa data yang ditampilkan ini sudah terpisah menjadi per kata dan semua tanda bacanya telah dihilangkan. Pada kolom pertama dengan header ‘line’ ini merupakan keterangan bahwa kata tersebut masuk pada ayat ke berapa dari surah Al-Fatihah. Sehingga dapat kita simpulkan bahwa ‘unnest_token’ ini akan mengubah isi kalimat pada setiap surah menjadi 1 kata yang nantikan akan bermanfaat saat kita akan membandingkan dan mengelompokkan data kata lainnya.

Memilih Variabel pada Al-Qur’an

Diawal tadi kita sudah menginstall package quran, disini quran sendiri memiliki 4 versi dimana yang pertama versi quran_ar (Bahasa Arab dengan vokal), quran_ar_min (Bahasa Arab tanpa vokal), quran_en_sahih (Terjemahan dalam bahasa Inggris sesuai Shahih Internasional) dan versi quran_en_yusufali (Quran dalam bahasa Inggris yang diterjemahkan oleh yusuf Ali). untuk kali ini kita akan menggunakan versi quran_en_sahih untuk kita analisa dan kita proses Tokenization berdasarkan variabel berikut.

quranES <- quran_en_sahih %>% select(surah_id, 
                                   ayah_id,
                                   surah_title_en, 
                                   surah_title_en_trans, 
                                   revelation_type, 
                                   text, 
                                   surah, 
                                   ayah, 
                                   ayah_title)
tidyES <- quranES %>%
  unnest_tokens(word, text)
tidyES
## # A tibble: 158,065 x 9
##    surah_id ayah_id surah_title_en surah_title_en_t~ revelation_type surah  ayah
##       <int>   <int> <fct>          <fct>             <chr>           <int> <int>
##  1        1       1 Al-Faatiha     The Opening       Meccan              1     1
##  2        1       1 Al-Faatiha     The Opening       Meccan              1     1
##  3        1       1 Al-Faatiha     The Opening       Meccan              1     1
##  4        1       1 Al-Faatiha     The Opening       Meccan              1     1
##  5        1       1 Al-Faatiha     The Opening       Meccan              1     1
##  6        1       1 Al-Faatiha     The Opening       Meccan              1     1
##  7        1       1 Al-Faatiha     The Opening       Meccan              1     1
##  8        1       1 Al-Faatiha     The Opening       Meccan              1     1
##  9        1       1 Al-Faatiha     The Opening       Meccan              1     1
## 10        1       1 Al-Faatiha     The Opening       Meccan              1     1
## # ... with 158,055 more rows, and 2 more variables: ayah_title <chr>,
## #   word <chr>

Nah disini kita sudah mendapatkan data yang sudah di pecah menjadi 1 kata dengan informasi keberadaannya pada surah apa dan ayat berapa. Untuk proses selanjutkan kita perlu untuk menganalisa kata mana yang perlu dihilangkan seperti kata ‘of’, ‘to’, ‘the’ dan kata-kata lainnya yang bersifat umum. untuk memanipulasinya kita bisa menggunakan ‘dplyr’ lalu menyimpan data kata-kata yang tidak berguna pada sebuah dataset dengan yang kita beri nama ‘stop_word’, setelah itu kita bisa memisahkan sekaligus menghapusnya dengan perintah ‘anti_join’ seperti dibawah ini.

data(stop_words)

tidyES <- tidyES %>%
  anti_join(stop_words)
## Joining, by = "word"

Ploting dan Perhitungan kata

Disini kita bisa juga menggunakan ‘dplyr’s count()’ untuk menemukan kata-kata yang paling banyak disebutkan pada Al-Qur’an secara keseluruhan dan menyusunnya menjadi frame data yang berbeda sehingga frame data ini memungkinkan untuk kita gunakan dengan package ‘ggplot2’. Contohnya jika kita ingin memvisualisasikan kata-kata yang paling sering disebut dalam terjemahan Internasional Qur’an Sahih dengan memploting kata yang sering muncul lebih dari 150 penyebutan seperti dibawah ini.

tidyES %>% count(word, sort = TRUE)
## # A tibble: 4,783 x 2
##    word           n
##    <chr>      <int>
##  1 allah       2973
##  2 lord         971
##  3 people       732
##  4 day          497
##  5 earth        402
##  6 punishment   350
##  7 fear         281
##  8 muhammad     264
##  9 believed     262
## 10 messenger    242
## # ... with 4,773 more rows
tidyES %>%
  count(word, sort = TRUE) %>%
  filter(n > 150) %>%
  mutate(word = reorder(word, n)) %>%
  ggplot(aes(x = word, y = n)) +
  geom_col() +
  xlab(NULL) +
  coord_flip() +
  theme(axis.text = element_text( 
    angle = 0, 
    color="blue", 
    size=10)
  )

Mari kita coba menggunakan cara yang sama unutk Qur’an terjemahan Yusuf Ali

quranEY <- quran_en_yusufali %>% select(surah_id, 
                                   ayah_id,
                                   surah_title_en, 
                                   surah_title_en_trans, 
                                   revelation_type, 
                                   text, 
                                   surah, 
                                   ayah, 
                                   ayah_title)
tidyEY <- quranEY %>%
  unnest_tokens(word, text)
tidyEY
## # A tibble: 167,859 x 9
##    surah_id ayah_id surah_title_en surah_title_en_t~ revelation_type surah  ayah
##       <int>   <int> <fct>          <fct>             <chr>           <int> <int>
##  1        1       1 Al-Faatiha     The Opening       Meccan              1     1
##  2        1       1 Al-Faatiha     The Opening       Meccan              1     1
##  3        1       1 Al-Faatiha     The Opening       Meccan              1     1
##  4        1       1 Al-Faatiha     The Opening       Meccan              1     1
##  5        1       1 Al-Faatiha     The Opening       Meccan              1     1
##  6        1       1 Al-Faatiha     The Opening       Meccan              1     1
##  7        1       1 Al-Faatiha     The Opening       Meccan              1     1
##  8        1       1 Al-Faatiha     The Opening       Meccan              1     1
##  9        1       1 Al-Faatiha     The Opening       Meccan              1     1
## 10        1       2 Al-Faatiha     The Opening       Meccan              1     2
## # ... with 167,849 more rows, and 2 more variables: ayah_title <chr>,
## #   word <chr>

kemudian kita filter dengan acuan kata seperti “kamu” dan “engkau” yang sering disebutkan pada terjemahan ini

my_stopwords <- tibble(word = c('ye', 'verily', 'will', 'said', 'say', 'us', 
                                'thy', 'thee', 'thou', 'hath', 'doth'))
tidyEY <- tidyEY %>%
  anti_join(my_stopwords)
## Joining, by = "word"

MENGGUNAKAN DATA TIDY UNTUK MENGANALISIS SENTIMEN

Salah satu cara yang bisa digunakan untuk menganalisa sentimentil pada sebuah teks adalah dengan mempertimbangkan teks sebagai sebuah kombinasi dari serangkaian kata yang individu dan konten sentimentil dari keseluruhan teks sebagai jumlah sentimentil dari masing-masing kata.

Tidytext menyediakan akses ke beberapa sentimen leksikon seperti AFINN dari Finn rup Nielsen, bing dari Bing Liu dan NRC dari Saif Mohammad dan Peter Turney. Ketiga leksikon ini dasarnya adalah unigran (Kata tunggal). Leksikon ini mengandung banyak kata dalam bahasa Inggris dan memiliki nilai untuk sentimen positif/negatif, dan juga nilai yang menggambarkan emosi seperti kegembiraan, kemarahan, kesedihan, dan sebagainya. Dalam percobaab kali ini, kita akan menggunakan bing leksikon untuk mengkategorikan kata-kata secara biner ke dalam kategori positif dan negatif.

Fungsi get_sentiments() memungkinkan kita untuk menggunakan fungsi dari leksikon sentimentil tertentu. seperti pada syntax yang akan kita gunakan untuk manggil fungsi leksikon “bing”

get_sentiments("bing")
## # A tibble: 6,786 x 2
##    word        sentiment
##    <chr>       <chr>    
##  1 2-faces     negative 
##  2 abnormal    negative 
##  3 abolish     negative 
##  4 abominable  negative 
##  5 abominably  negative 
##  6 abominate   negative 
##  7 abomination negative 
##  8 abort       negative 
##  9 aborted     negative 
## 10 aborts      negative 
## # ... with 6,776 more rows

Berikutnya kita akan mencoba menggunakan count() untuk menghitung seberapa banyak kontribusi sebuah kata pada setiap sentimen baik positif dan negatif yang dihasilkan, setelah itu ditampilkan secara visual.

bing_word_counts <- tidyES %>%
  inner_join(get_sentiments("bing")) %>%
  count(word, sentiment, sort = TRUE) %>%
  ungroup()
## Joining, by = "word"
bing_word_counts
## # A tibble: 972 x 3
##    word       sentiment     n
##    <chr>      <chr>     <int>
##  1 fear       negative    281
##  2 merciful   positive    183
##  3 righteous  positive    167
##  4 mercy      positive    146
##  5 exalted    positive    143
##  6 reward     positive    141
##  7 evil       negative    139
##  8 disbelieve negative    122
##  9 denied     negative    100
## 10 wise       positive     98
## # ... with 962 more rows
bing_word_counts %>%
  group_by(sentiment) %>%
  top_n(20) %>%
  ungroup() %>%
  mutate(word = reorder(word, n)) %>%
  ggplot(aes(word, n, fill = sentiment)) +
  geom_col(show.legend = FALSE) +
  facet_wrap(~sentiment, scales = "free_y") +
  labs(y = "Contribution to sentiment",
       x = NULL) +
  coord_flip() +
  theme(axis.text = element_text( 
    angle = 0, 
    color="blue", 
    size=10))
## Selecting by n

VERSI YUSUF ALI

bing_word_counts <- tidyEY %>%
  inner_join(get_sentiments("bing")) %>%
  count(word, sentiment, sort = TRUE) %>%
  ungroup()
## Joining, by = "word"
bing_word_counts
## # A tibble: 1,249 x 3
##    word    sentiment     n
##    <chr>   <chr>     <int>
##  1 good    positive    278
##  2 fear    negative    274
##  3 evil    negative    268
##  4 faith   positive    257
##  5 penalty negative    229
##  6 wrong   negative    206
##  7 reject  negative    177
##  8 well    positive    177
##  9 right   positive    176
## 10 mercy   positive    164
## # ... with 1,239 more rows
bing_word_counts %>%
  group_by(sentiment) %>%
  top_n(20) %>%
  ungroup() %>%
  mutate(word = reorder(word, n)) %>%
  ggplot(aes(word, n, fill = sentiment)) +
  geom_col(show.legend = FALSE) +
  facet_wrap(~sentiment, scales = "free_y") +
  labs(y = "Contribution to sentiment",
       x = NULL) +
  coord_flip() +
  theme(axis.text = element_text( 
    angle = 0, 
    color="blue", 
    size=10))
## Selecting by n

MELIHAT TINGKAT SENTIMENTIL ANALISYS BERDASARKAN SURAH

bingnegative <- get_sentiments("bing") %>% 
  filter(sentiment == "negative")

wordcounts <- tidyES %>%
  group_by(surah_title_en) %>%
  summarize(words = n())

tidyES %>%
  semi_join(bingnegative) %>%
  group_by(surah_title_en) %>%
  summarize(negativewords = n()) %>%
  left_join(wordcounts, by = c("surah_title_en")) %>%
  mutate(ratio = negativewords/words) %>%
  top_n(20) %>%
  ggplot(aes(x = surah_title_en, y = ratio)) +
  geom_col() +
  xlab(NULL) +
  coord_flip() +
  theme(axis.text = element_text( 
    angle = 0, 
    color="blue", 
    size=10))
## Joining, by = "word"
## Selecting by ratio

bingnegative <- get_sentiments("bing") %>% 
  filter(sentiment == "negative")

wordcounts <- tidyEY %>%
  group_by(surah_title_en) %>%
  summarize(words = n())

tidyES %>%
  semi_join(bingnegative) %>%
  group_by(surah_title_en) %>%
  summarize(negativewords = n()) %>%
  left_join(wordcounts, by = c("surah_title_en")) %>%
  mutate(ratio = negativewords/words) %>%
  top_n(20) %>%
  ggplot(aes(x = surah_title_en, y = ratio)) +
  geom_col() +
  xlab(NULL) +
  coord_flip() +
  theme(axis.text = element_text( 
    angle = 0, 
    color="blue", 
    size=10))
## Joining, by = "word"
## Selecting by ratio

WORDCLOUDS

Dengan menggunakan library wordcloud ini kita dapat memvisualisasikan kata yang sering digunakan atau disebutkan dalam data set teks terjemahan Al Qur’an seperti pada percobaan dibawah ini akan dipanggil sebanyak 100 kata yang paling sering disebut dalam Al Qur’an

library(wordcloud)
## Loading required package: RColorBrewer
tidyES %>%
  count(word) %>%
  with(wordcloud(word, n, max.words = 100))

Kita coba juga pada versi terjemahan Yusuf Ali

library(wordcloud)
tidyEY %>%
  count(word) %>%
  with(wordcloud(word, n, max.words = 100))

library(reshape2)
## 
## Attaching package: 'reshape2'
## The following object is masked from 'package:tidyr':
## 
##     smiths
tidyES %>%
  inner_join(get_sentiments("bing")) %>%
  count(word, sentiment, sort = TRUE) %>%
  acast(word ~ sentiment, value.var = "n", fill = 0) %>%
  comparison.cloud(colors = c("#eb52a6", "#54f0b1"),
                   max.words = 50)
## Joining, by = "word"
## Warning in comparison.cloud(., colors = c("#eb52a6", "#54f0b1"), max.words =
## 50): righteousness could not be fit on page. It will not be plotted.
## Warning in comparison.cloud(., colors = c("#eb52a6", "#54f0b1"), max.words =
## 50): unquestionably could not be fit on page. It will not be plotted.

REFERENSI

[1] S. Julia & R. David, Text Mining with R - A Tidy Approach,

[2] H. Andrew, quRan: Complete Text of the Qur’an

[3] Arnold, Taylor B. 2016. cleanNLP: A Tidy Data Model for Natural Language Processing. https://cran.r-project.org/package=cleanNLP.

[4] Arnold, Taylor, and Lauren Tilton. 2016. coreNLP: Wrappers Around Stanford Corenlp Tools. https://cran.r-project.org/package=coreNLP.

[5] Rinker, Tyler W. 2017. sentimentr: Calculate Text Polarity Sentiment. Buffalo, New York: University at Buffalo/SUNY. http://github.com/trinker/sentimentr.

[6] Pedersen, Thomas Lin. 2017. ggraph: An Implementation of Grammar of Graphics for Graphs and Networks. https://cran.r-project.org/package=ggraph.