Laporan ini bertujuan untuk menyajikan analisis eksplorasi data awal (Exploratory Data Analysis) sebagai langkah dasar pengembangan algoritma prediksi kata dan aplikasi web Shiny. Proyek ini memproses corpus teks bahasa Inggris yang terdiri dari tiga sumber data: dokumen blogs, news, dan twitter. Fokus utama analisis ini adalah pembersihan data, pembuatan struktur N-gram, serta perencanaan model prediktif yang efisien dan ringan memori.
Berikut adalah tabel statistik dasar dari ketiga dataset teks asli sebelum proses sampling dan pembersihan data dilakukan:
# Menghitung statistik file asli
size_blogs <- file.info("en_US.blogs.txt")$size / (1024^2)
size_news <- file.info("en_US.news.txt")$size / (1024^2)
size_twitter <- file.info("en_US.twitter.txt")$size / (1024^2)
blogs <- readLines("en_US.blogs.txt", encoding = "UTF-8", skipNul = TRUE)
news <- readLines("en_US.news.txt", encoding = "UTF-8", skipNul = TRUE)
twitter <- readLines("en_US.twitter.txt", encoding = "UTF-8", skipNul = TRUE)
summary_table <- data.frame(
File_Name = c("en_US.blogs.txt", "en_US.news.txt", "en_US.twitter.txt"),
File_Size_MB = round(c(size_blogs, size_news, size_twitter), 2),
Line_Count = c(length(blogs), length(news), length(twitter)),
Word_Count = c(sum(stri_count_words(blogs)), sum(stri_count_words(news)), sum(stri_count_words(twitter)))
)
kable(summary_table, caption = "Tabel 1: Statistik Ringkasan Dataset Teks")
| File_Name | File_Size_MB | Line_Count | Word_Count |
|---|---|---|---|
| en_US.blogs.txt | 200.42 | 899288 | 37546806 |
| en_US.news.txt | 196.28 | 1010206 | 34761151 |
| en_US.twitter.txt | 159.36 | 2360148 | 30096690 |
Untuk keperluan pemrosesan yang efisien, diambil sampel sebesar 1% dari total data. Teks diseragamkan menjadi huruf kecil, tanda baca serta angka dihapus, kemudian dipisah menjadi struktur unigram, bigram, dan trigram.
set.seed(123)
sample_blogs <- sample(blogs, length(blogs) * 0.01)
sample_news <- sample(news, length(news) * 0.01)
sample_twitter <- sample(twitter, length(twitter) * 0.01)
raw_sample <- c(sample_blogs, sample_news, sample_twitter)
corpus <- VCorpus(VectorSource(raw_sample))
corpus <- tm_map(corpus, content_transformer(tolower))
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, removeNumbers)
corpus <- tm_map(corpus, stripWhitespace)
df_sample <- data.frame(text = unlist(sapply(corpus, `[`, "content")), stringsAsFactors = FALSE)
unigrams <- df_sample %>% unnest_tokens(word, text) %>% count(word, sort = TRUE)
bigrams <- df_sample %>% unnest_tokens(bigram, text, token = "ngrams", n = 2) %>% count(bigram, sort = TRUE)
trigrams <- df_sample %>% unnest_tokens(trigram, text, token = "ngrams", n = 3) %>% count(trigram, sort = TRUE)
unigrams %>%
head(15) %>%
ggplot(aes(x = reorder(word, n), y = n)) +
geom_col(fill = "steelblue") +
coord_flip() +
labs(title = "Top 15 Unigram Paling Sering Muncul", x = "Kata", y = "Frekuensi") +
theme_minimal()
bigrams %>%
head(15) %>%
ggplot(aes(x = reorder(bigram, n), y = n)) +
geom_col(fill = "darkgreen") +
coord_flip() +
labs(title = "Top 15 Bigram Paling Sering Muncul", x = "Bigram", y = "Frekuensi") +
theme_minimal()
trigrams %>%
head(15) %>%
ggplot(aes(x = reorder(trigram, n), y = n)) +
geom_col(fill = "coral") +
coord_flip() +
labs(title = "Top 15 Trigram Paling Sering Muncul", x = "Trigram", y = "Frekuensi") +
theme_minimal()
Berdasarkan temuan eksplorasi data di atas, langkah selanjutnya yang akan dilakukan adalah: