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