library(quanteda)
## Package version: 4.2.0
## Unicode version: 15.1
## ICU version: 74.1
## Parallel computing: 8 of 8 threads used.
## See https://quanteda.io for tutorials and examples.
library(readr)

# 1. Load Data
quran_data <- read_csv("D:\\BPS Tuba\\Quran Mining Competition\\surat_ibrahim.csv", col_types = cols(.default = "c"))



# 2. Preprocessing Data (Tokenization + Stopwords Removal + Stemming)
# Ambil teks dari kolom yang ingin diproses, misalnya "teks"
qorpus_text <- quran_data$Text 

# Tokenisasi dengan quanteda
tokens_qorpus <- quanteda::tokens(qorpus_text, remove_punct = TRUE, remove_numbers = TRUE)

# Hapus stopwords
stopwords_id <- c("yang", "di", "ke", "dari", "untuk", "dengan", "ini", "itu", "dan", "dengan", "dia", "diri", "ini", "itu", "kamu", "kepada", "kita", "maka", "mereka", "orang", "saja", "satu", "sebagai", "segala", "seperti", "sesuatu", "sudah", "supaya", "telah", "tidak", "untuk", "yang",  "kami", "engkau", "aku", "sesungguhnya", "demikian", "apabila", "akan", "atas", "bagi", "bahwa", "adalah", "dalam", "pada", "pun", "jika", "sungguh", "kelak", "hingga", "swt", "ayat", "ia", "dapat", "-", "karena", "oleh", "agar", "menjadi", "ada", "pula", "nya", "al", "alif", "lam", "ra", "ia", "dt", "buat", "seperti", "jadi", "sedang", "perlu", "lain", "tempat", "se", "ber", "lain", "berik", "ikut", "laku", "sama")
tokens_qorpus <- tokens_remove(tokens_qorpus, stopwords_id, padding = TRUE)

# Proses Stemming
library(devtools)
## Loading required package: usethis
# devtools::install_github("nurandi/katadasaR")
library(katadasaR)
tokens_character <- as.character(tokens_qorpus)
stemming <- function(x){
  paste(lapply(x,katadasar),collapse = " ")
}
hasil_stemming <- lapply(tokens_character, stemming)
hasil_stemming_char <- as.character(unlist(hasil_stemming))
head(hasil_stemming_char)
## [1] "Surah" ""      "mulai" ""      ""      ""
# 3. Buat DFM & Cek Kata Paling Sering
stemming <- quanteda::tokens(hasil_stemming_char)
dfm_qorpus <- dfm(stemming)

# Hapus dokumen kosong (jika ada)
dfm_qorpus <- dfm_qorpus[rowSums(dfm_qorpus) > 0, ]

# Cek kata paling sering
print(topfeatures(dfm_qorpus, 20)) 
##       allah           n     manusia orang-orang     ibrahim       hidup 
##         351         234         116         103          69          59 
##        nabi       tuhan       agama        atau         doa       dunia 
##          58          50          49          48          48          47 
##        buat        hari       sebut        bumi       tanah        kaum 
##          47          47          46          46          46          43 
##      sampai      nikmat 
##          43          43
# 4. Buat Word Cloud
library(quanteda)
library(wordcloud)
## Loading required package: RColorBrewer
library(RColorBrewer)

# Hitung frekuensi kata dari DFM
freq <- colSums(dfm_qorpus)

# Filter kata yang muncul lebih dari 25 kali
freq <- freq[freq > 25]

# Pastikan tidak ada kata kosong
freq <- freq[names(freq) != ""]

# Buat word cloud yang lebih rapi
wordcloud(
  words = names(freq),
  freq = freq,
  scale = c(4, 0.5),       # Ukuran kata (maksimal 4x lebih besar dari yang terkecil)
  max.words = 100,         # Maksimal 100 kata
  random.order = FALSE,    # Kata dengan frekuensi tinggi ada di tengah
  rot.per = 0.2,           # Hanya 20% kata yang miring
  colors = brewer.pal(8, "Dark2"),
  min.freq = 5             # Hanya kata dengan frekuensi >=5 yang muncul
)

  1. Apakah kata-kata utama sesuai dengan tema syukur?
  2. Masih ada kata-kata umum seperti “yang”, “dan”, dll.? (Kalau iya, bisa perbaiki stopwords-nya)
  3. Apakah ada kata menarik yang muncul lebih sering dari yang diharapkan?

Selanjutnya, untuk mengetahui kata paling relevan dalam tema syukur, gunakan TF-IDF. Apa manfaatnya?

Menemukan kata-kata yang benar-benar penting, bukan hanya sering muncul. Bisa membantu menemukan tema tersembunyi dalam ayat-ayat.

library(quanteda.textstats)

# Hitung TF-IDF
dfm_tfidf <- dfm_tfidf(dfm_qorpus)

# Tampilkan 10 kata dengan nilai TF-IDF tertinggi
topfeatures(dfm_tfidf, 10)
##       allah           n     manusia orang-orang     ibrahim       hidup 
##    497.4387    372.8312    220.1742    200.8164    146.5327    129.3079 
##        nabi       tuhan       agama        atau 
##    127.5468    113.1771    111.3435    109.5010

Selanjutnya, yaitu analisis jaringan kata (co-occurrence analysis) untuk melihat hubungan antara kata-kata seperti syukur, nikmat, rezeki, dan zalim di dalam Surat Ibrahim

# Load library
library(quanteda)
library(quanteda.textstats)
library(igraph)
## 
## Attaching package: 'igraph'
## The following objects are masked from 'package:stats':
## 
##     decompose, spectrum
## The following object is masked from 'package:base':
## 
##     union
library(ggraph)
## Loading required package: ggplot2
library(ggplot2)

# Gabungkan semua dokumen menjadi satu teks panjang
qorpus_text <- paste(hasil_stemming_char, collapse = " ")

# Konversi ke korpus
qorpus <- corpus(qorpus_text)

# Tokenisasi ulang dengan benar
tokens_qorpus <- quanteda::tokens(qorpus, remove_punct = TRUE, remove_numbers = TRUE)

# Buat co-occurrence matrix (FCM)
fcmat <- fcm(tokens_qorpus, context = "window", window = 5)

# Ambil kata yang sering muncul (misalnya lebih dari 10 kali)
word_freqs <- colSums(fcmat)  # Hitung jumlah kemunculan kata
sorted_word_freqs <- sort(word_freqs, decreasing = TRUE)  # Urutkan dari terbesar
print(sorted_word_freqs[1:20])  # Cek 20 kata dengan kemunculan tertinggi
##     Ibrahim           n        hari     manusia         doa       Tuhan 
##         501         364         345         340         298         293 
##       tanah       waktu       agama       putra        azab       salat 
##         272         252         250         233         231         224 
##       Mekah      nikmat        rasa        buat       haram       zalim 
##         222         211         206         205         202         194 
##       Hajar orang-orang 
##         169         167
top_words <- names(head(sorted_word_freqs, 10))

# Cek apakah `top_words` ada dalam fitur `fcmat`
missing_words <- setdiff(top_words, featnames(fcmat))
print(missing_words)  # Kata yang tidak ada di fcmat
## character(0)
top_words <- intersect(names(sorted_word_freqs), featnames(fcmat))


# Filter FCM berdasarkan kata-kata yang dipilih
# FCM (Feature Co-occurrence Matrix) adalah matriks yang menunjukkan seberapa sering kata-kata tertentu muncul bersama dalam suatu teks
fcmat_select <- fcm_select(fcmat, pattern = top_words)

# Konversi ke graph menggunakan igraph
graph_network <- graph_from_adjacency_matrix(as.matrix(fcmat_select), weighted = TRUE, mode = "undirected")
## Warning: The `adjmatrix` argument of `graph_from_adjacency_matrix()` must be symmetric
## with mode = "undirected" as of igraph 1.6.0.
## ℹ Use mode = "max" to achieve the original behavior.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
V(graph_network)$label <- V(graph_network)$name
# Visualisasi dengan ggraph
ggraph(graph_network, layout = "kk") +
  geom_edge_link(aes(edge_alpha = weight), show.legend = FALSE) +
  geom_node_point(size = 7, color = "blue") +
  geom_node_text(aes(label = label), repel = TRUE, max.overlaps = Inf) +
  theme_minimal()

# Apakah kata "syukur" lebih sering terhubung dengan "rezeki" atau "pahala"?
# Apakah ada kata-kata lain yang sering muncul bersama?
# Apakah kata-kata negatif seperti "adzab" atau "kufur" muncul di sekitar kata "syukur"?

Selanjutnya, LDA

library(quanteda)
library(topicmodels)
library(tidytext)
library(LDAvis)
library(stopwords)
library(servr)

# Menjalankan LDA dengan 3 Topik
lda_model <- LDA(dfm_qorpus, k = 3, control = list(seed = 1234))

# Melihat Kata Kunci dalam Setiap Topik
terms(lda_model, 10) # Menampilkan 10 kata teratas per topik
##       Topic 1   Topic 2   Topic 3      
##  [1,] "n"       "allah"   "allah"      
##  [2,] "manusia" "n"       "orang-orang"
##  [3,] "allah"   "manusia" "n"          
##  [4,] "hari"    "zalim"   "ibrahim"    
##  [5,] "jalan"   "agama"   "hidup"      
##  [6,] "hadap"   "tunjuk"  "nabi"       
##  [7,] "nikmat"  "sangat"  "sebut"      
##  [8,] "air"     "buat"    "atau"       
##  [9,] "dunia"   "tetapi"  "sehingga"   
## [10,] "hidup"   "rasa"    "mekah"
# Visualisasi dengan LDAvis
theta <- posterior(lda_model)$topics
phi <- posterior(lda_model)$terms
json_lda <- createJSON(phi, theta, doc.length = rowSums(as.matrix(dfm_qorpus)), vocab = colnames(dfm_qorpus), term.frequency = colSums(as.matrix(dfm_qorpus)))
serVis(json_lda) # Menampilkan visualisasi interaktif

#lihat disini: http://127.0.0.1:4321