library(readxl)
## Warning: package 'readxl' was built under R version 4.2.3
library(ggplot2)
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
setwd("C:\\Users\\FARHAN ABDILLAH\\Documents\\SURE 2024")
data <- read_excel("Data Gelarrasa (1).xlsx")
head(data)
## # A tibble: 6 × 2
## full_text Label…¹
## <chr> <chr>
## 1 "ANGKA AMIN PREDIKSI SLOVAKIA 01 NOVEMBER 2023 • ANGKA MAIN • 1… N
## 2 "@Melihat_Indo Apa aku bilang kan.dukungan utk pak Ganjar selalu ada" P
## 3 "@Gus_Raharjo Fokus untuk memenangkan pak ganjar mahfud untuk indones… P
## 4 "@KangManto123 @jokowi @ganjarpranowo @prabowo @aniesbaswedan @susipu… P
## 5 "@ariaranti ï¸\u008fï¸\u008f Engga apa-apa lah, partai yang satu itu… P
## 6 "@AlianiFebriana @prabowo @kikysaputrii salam dari WT https://t.co/w9… P
## # … with abbreviated variable name ¹​Labeling
label_counts <- data %>%
count(Labeling)
# Membuat plot
ggplot(label_counts, aes(x = Labeling, y = n, fill = Labeling)) +
geom_bar(stat = "identity") +
labs(title = "Distribusi Labeling",
x = "Labeling",
y = "Frekuensi") +
theme_minimal()
data <- data %>%
filter(!is.na(Labeling))
Cleaning adalah proses di mana karakter yang dianggap tidak penting seperti nama pengguna (@), hashtag (#), URL, tanda baca, angka, dan emoticon dihapus dari teks.
library(stringr)
clean_text <- function(text) {
if (!is.na(text) && !is.null(text)) {
text <- str_replace_all(text, "@\\S+", "") # remove @username
text <- str_replace_all(text, "#\\w+", "") # remove #hashtag
text <- str_replace_all(text, "http\\S+|www.\\S+", "") # remove urls
text <- str_replace_all(text, "[^a-zA-Z]", " ") # remove non alphabetic characters
} else {
text <- ""
}
return(text)
}
data$full_text <- sapply(data$full_text, clean_text)
data <- as.data.frame(data)
head(data)
## full_text
## 1 ANGKA AMIN PREDIKSI SLOVAKIA NOVEMBER ANGKA MAIN ANGKA IKUT COLOK BEBAS amp TOP LINE D SHIO MONYET
## 2 Apa aku bilang kan dukungan utk pak Ganjar selalu ada
## 3 Fokus untuk memenangkan pak ganjar mahfud untuk indonesia yang lebih maju
## 4 lah jgn koar palestiana nih sodara yg dekat dulu perlu di perbaiki ketahanan pangan nya
## 5 Engga apa apa lah partai yang satu itu kan hiburan banget Mana seragamnya lucu lucu Salam kenal Ranti Jadi selama ini pernah dapat pengalaman paling tak terlupakan
## 6 salam dari WT
## Labeling
## 1 N
## 2 P
## 3 P
## 4 P
## 5 P
## 6 P
str(data)
## 'data.frame': 1000 obs. of 2 variables:
## $ full_text: chr "ANGKA AMIN PREDIKSI SLOVAKIA NOVEMBER ANGKA MAIN ANGKA IKUT COLOK BEB"| __truncated__ " Apa aku bilang kan dukungan utk pak Ganjar selalu ada" " Fokus untuk memenangkan pak ganjar mahfud untuk indonesia yang lebih maju" " lah jgn koar palestiana nih sodara yg dekat dulu perlu di perbaiki ketahanan pangan nya " ...
## $ Labeling : chr "N" "P" "P" "P" ...
library(tokenizers)
## Warning: package 'tokenizers' was built under R version 4.2.3
data$tokens <- tokenize_words(data$full_text)
head(data,3)
## full_text
## 1 ANGKA AMIN PREDIKSI SLOVAKIA NOVEMBER ANGKA MAIN ANGKA IKUT COLOK BEBAS amp TOP LINE D SHIO MONYET
## 2 Apa aku bilang kan dukungan utk pak Ganjar selalu ada
## 3 Fokus untuk memenangkan pak ganjar mahfud untuk indonesia yang lebih maju
## Labeling
## 1 N
## 2 P
## 3 P
## tokens
## 1 angka, amin, prediksi, slovakia, november, angka, main, angka, ikut, colok, bebas, amp, top, line, d, shio, monyet
## 2 apa, aku, bilang, kan, dukungan, utk, pak, ganjar, selalu, ada
## 3 fokus, untuk, memenangkan, pak, ganjar, mahfud, untuk, indonesia, yang, lebih, maju
# Menghapus kata yang kurang dari 4 huruf dari setiap baris token
data$tokens <- lapply(data$tokens, function(tokens) {
tokens <- subset(tokens, nchar(tokens) >= 4)
return(tokens)
})
head(data$tokens)
## [[1]]
## [1] "angka" "amin" "prediksi" "slovakia" "november" "angka"
## [7] "main" "angka" "ikut" "colok" "bebas" "line"
## [13] "shio" "monyet"
##
## [[2]]
## [1] "bilang" "dukungan" "ganjar" "selalu"
##
## [[3]]
## [1] "fokus" "untuk" "memenangkan" "ganjar" "mahfud"
## [6] "untuk" "indonesia" "yang" "lebih" "maju"
##
## [[4]]
## [1] "koar" "palestiana" "sodara" "dekat" "dulu"
## [6] "perlu" "perbaiki" "ketahanan" "pangan"
##
## [[5]]
## [1] "engga" "partai" "yang" "satu" "hiburan"
## [6] "banget" "mana" "seragamnya" "lucu" "lucu"
## [11] "salam" "kenal" "ranti" "jadi" "selama"
## [16] "pernah" "dapat" "pengalaman" "paling" "terlupakan"
##
## [[6]]
## [1] "salam" "dari"
library(quanteda)
## Warning: package 'quanteda' was built under R version 4.2.3
## Warning in stringi::stri_info(): Your current locale is not in the list
## of available locales. Some functions may not work properly. Refer to
## stri_locale_list() for more details on known locale specifiers.
## Warning in stringi::stri_info(): Your current locale is not in the list
## of available locales. Some functions may not work properly. Refer to
## stri_locale_list() for more details on known locale specifiers.
## Package version: 3.3.1
## Unicode version: 13.0
## ICU version: 69.1
## Parallel computing: 8 of 8 threads used.
## See https://quanteda.io for tutorials and examples.
# Baca file stopwords
stopwords_path <- "stopwords_id_satya.txt"
custom_stopwords <- scan(stopwords_path, what = "character", sep = "\n")
# Tambahkan stopwords tambahan
custom_stopwords <- c(custom_stopwords, 'prabowo', 'prabowo subianto', 'subianto', 'gibran', 'anis', 'amin', 'ganjar', 'mahfud', 'politik', 'pemilu', 'kpu', 'presiden', 'pdip', 'partai', 'jokowi')
# Menghapus kata-kata penghubung dari tokenisasi teks
data$tokens <- lapply(data$tokens, function(tokens) {
tokens <- tokens[!tolower(tokens) %in% custom_stopwords]
return(tokens)
})
head(data$tokens)
## [[1]]
## [1] "angka" "prediksi" "slovakia" "november" "angka" "main"
## [7] "angka" "ikut" "colok" "bebas" "line" "shio"
## [13] "monyet"
##
## [[2]]
## [1] "bilang" "dukungan"
##
## [[3]]
## [1] "fokus" "untuk" "memenangkan" "untuk" "indonesia"
## [6] "maju"
##
## [[4]]
## [1] "koar" "palestiana" "sodara" "perlu" "perbaiki"
## [6] "ketahanan" "pangan"
##
## [[5]]
## [1] "engga" "satu" "hiburan" "banget" "seragamnya"
## [6] "lucu" "lucu" "salam" "kenal" "ranti"
## [11] "jadi" "pengalaman" "terlupakan"
##
## [[6]]
## [1] "salam"
# Fungsi stemming
stem_word <- function(word) {
# List of common prefixes and suffixes
prefixes <- c("meng", "me", "peng", "pen", "pem", "di", "ter", "ke", "ber", "bel", "per")
suffixes <- c("kan", "i", "an", "kah", "lah", "tah", "nya", "mu")
# Remove prefixes
for (prefix in prefixes) {
if (startsWith(word, prefix)) {
word <- substr(word, nchar(prefix) + 1, nchar(word))
break
}
}
# Remove suffixes
for (suffix in suffixes) {
if (endsWith(word, suffix)) {
word <- substr(word, 1, nchar(word) - nchar(suffix))
break
}
}
return(word)
}
# Melakukan stemming pada setiap token
data$tokens <- lapply(data$tokens, function(tokens) {
tokens <- sapply(tokens, stem_word)
return(tokens)
})
head(data$tokens)
## [[1]]
## angka prediksi slovakia november angka main angka
## "angka" "prediks" "slovakia" "november" "angka" "main" "angka"
## ikut colok bebas line shio monyet
## "ikut" "colok" "bebas" "line" "shio" "monyet"
##
## [[2]]
## bilang dukungan
## "bilang" "dukung"
##
## [[3]]
## fokus untuk memenangkan untuk indonesia maju
## "fokus" "untuk" "menang" "untuk" "indonesia" "maju"
##
## [[4]]
## koar palestiana sodara perlu perbaiki ketahanan
## "koar" "palestiana" "sodara" "lu" "baik" "tahan"
## pangan
## "pang"
##
## [[5]]
## engga satu hiburan banget seragamnya lucu lucu
## "engga" "satu" "hibur" "banget" "seragam" "lucu" "lucu"
## salam kenal ranti jadi pengalaman terlupakan
## "salam" "nal" "rant" "jad" "alam" "lupa"
##
## [[6]]
## salam
## "salam"
# Hapus kata yang kurang dari 4 huruf dari setiap baris token
data$tokens <- lapply(data$tokens, function(tokens) {
tokens <- subset(tokens, nchar(tokens) >= 4)
return(tokens)
})
head(data$tokens)
## [[1]]
## angka prediksi slovakia november angka main angka
## "angka" "prediks" "slovakia" "november" "angka" "main" "angka"
## ikut colok bebas line shio monyet
## "ikut" "colok" "bebas" "line" "shio" "monyet"
##
## [[2]]
## bilang dukungan
## "bilang" "dukung"
##
## [[3]]
## fokus untuk memenangkan untuk indonesia maju
## "fokus" "untuk" "menang" "untuk" "indonesia" "maju"
##
## [[4]]
## koar palestiana sodara perbaiki ketahanan pangan
## "koar" "palestiana" "sodara" "baik" "tahan" "pang"
##
## [[5]]
## engga satu hiburan banget seragamnya lucu lucu
## "engga" "satu" "hibur" "banget" "seragam" "lucu" "lucu"
## salam ranti pengalaman terlupakan
## "salam" "rant" "alam" "lupa"
##
## [[6]]
## salam
## "salam"
head(data)
## full_text
## 1 ANGKA AMIN PREDIKSI SLOVAKIA NOVEMBER ANGKA MAIN ANGKA IKUT COLOK BEBAS amp TOP LINE D SHIO MONYET
## 2 Apa aku bilang kan dukungan utk pak Ganjar selalu ada
## 3 Fokus untuk memenangkan pak ganjar mahfud untuk indonesia yang lebih maju
## 4 lah jgn koar palestiana nih sodara yg dekat dulu perlu di perbaiki ketahanan pangan nya
## 5 Engga apa apa lah partai yang satu itu kan hiburan banget Mana seragamnya lucu lucu Salam kenal Ranti Jadi selama ini pernah dapat pengalaman paling tak terlupakan
## 6 salam dari WT
## Labeling
## 1 N
## 2 P
## 3 P
## 4 P
## 5 P
## 6 P
## tokens
## 1 angka, prediks, slovakia, november, angka, main, angka, ikut, colok, bebas, line, shio, monyet
## 2 bilang, dukung
## 3 fokus, untuk, menang, untuk, indonesia, maju
## 4 koar, palestiana, sodara, baik, tahan, pang
## 5 engga, satu, hibur, banget, seragam, lucu, lucu, salam, rant, alam, lupa
## 6 salam
library(wordcloud)
## Warning: package 'wordcloud' was built under R version 4.2.3
## Loading required package: RColorBrewer
# Menggabungkan semua token menjadi satu teks
all_tokens <- unlist(data$tokens)
all_text <- paste(all_tokens, collapse = " ")
# Membuat Wordcloud
wordcloud(words = all_tokens, freq = table(all_tokens), max.words = 50, random.order = FALSE)
head(data)
## full_text
## 1 ANGKA AMIN PREDIKSI SLOVAKIA NOVEMBER ANGKA MAIN ANGKA IKUT COLOK BEBAS amp TOP LINE D SHIO MONYET
## 2 Apa aku bilang kan dukungan utk pak Ganjar selalu ada
## 3 Fokus untuk memenangkan pak ganjar mahfud untuk indonesia yang lebih maju
## 4 lah jgn koar palestiana nih sodara yg dekat dulu perlu di perbaiki ketahanan pangan nya
## 5 Engga apa apa lah partai yang satu itu kan hiburan banget Mana seragamnya lucu lucu Salam kenal Ranti Jadi selama ini pernah dapat pengalaman paling tak terlupakan
## 6 salam dari WT
## Labeling
## 1 N
## 2 P
## 3 P
## 4 P
## 5 P
## 6 P
## tokens
## 1 angka, prediks, slovakia, november, angka, main, angka, ikut, colok, bebas, line, shio, monyet
## 2 bilang, dukung
## 3 fokus, untuk, menang, untuk, indonesia, maju
## 4 koar, palestiana, sodara, baik, tahan, pang
## 5 engga, satu, hibur, banget, seragam, lucu, lucu, salam, rant, alam, lupa
## 6 salam
# Filter data berdasarkan sentimen
sentimen_positif <- data[data$Labeling == "P", ]
sentimen_negatif <- data[data$Labeling == "N", ]
sentimen_netral <- data[data$Labeling == "R", ]
# Menggabungkan token-token dari setiap kategori sentimen menjadi satu teks
all_tokens_positif <- unlist(sentimen_positif$tokens)
all_text_positif <- paste(all_tokens_positif, collapse = " ")
all_tokens_negatif <- unlist(sentimen_negatif$tokens)
all_text_negatif <- paste(all_tokens_negatif, collapse = " ")
all_tokens_netral <- unlist(sentimen_netral$tokens)
all_text_netral <- paste(all_tokens_netral, collapse = " ")
# Membuat wordcloud untuk masing-masing sentimen
wordcloud(words = all_tokens_positif, freq = table(all_tokens_positif), max.words = 50, random.order = FALSE, main = "Wordcloud Sentimen Positif")
wordcloud(words = all_tokens_negatif, freq = table(all_tokens_negatif), max.words = 50, random.order = FALSE, main = "Wordcloud Sentimen Negatif")
wordcloud(words = all_tokens_netral, freq = table(all_tokens_netral), max.words = 50, random.order = FALSE, main = "Wordcloud Sentimen Netral")