# Text Mining
eng <- read.table("http://www-01.sil.org/linguistics/wordlists/english/wordlist/wordsEn.txt", stringsAsFactors = FALSE)
library(tidyverse)
library(stringr)
#--------------------------------------------------------------------------------------------------------
# 1. Làm việc với chữ cái trong tiếng anh
#--------------------------------------------------------------------------------------------------------
eng <- eng %>% mutate(n_w = str_count(V1))
theme_set(theme_minimal())
# 1.1. Phân bố số lượng chữ cái trong Tiếng Anh:
eng %>%
group_by(n_w) %>%
count() %>%
ggplot(aes(n_w, n)) + geom_col() +
labs(x = NULL, y = NULL)
# 1.2. Các nguyên âm:
vowels <- c("a", "e", "i", "o", "u")
num_vowels <- vector(mode = "integer", length = 5)
for (j in seq_along(vowels)) {
num_aux = str_count(eng$V1, vowels[j])
num_vowels[j] = sum(num_aux)
}
df1 <- data.frame(N = num_vowels, nguyen_am = vowels)
# 1.3. Tần suất xuất hiện các nguyên âm:
library(hrbrthemes)
df1 %>%
ggplot(aes(reorder(nguyen_am, N), N)) +
geom_col() + labs(x = NULL, y = NULL) + coord_flip() +
scale_y_continuous(breaks = seq(0, 110000, by = 10000)) +
theme_ipsum(grid = "X")
# 1.4. Tần suất xuất hiện của các chữ cái trong tiếng Anh:
u <- strsplit(eng$V1, "")
k <- unlist(u)
let <- eng$V1 %>% strsplit("") %>% unlist()
let <- data.frame(l = let)
let %>% group_by(l) %>% count() %>%
mutate(per = 100*n / nrow(let)) %>%
mutate_if(is.numeric, function(x) round(x, 2)) %>%
ggplot(aes(reorder(l, per), per)) + geom_col() +
coord_flip() +
labs(x = NULL, y = NULL) +
theme_ipsum(grid = "X") +
scale_y_continuous(breaks = seq(1, 12, by = 1))
# Load các gói:
pakg <- c('tm',
'SnowballC',
'wordcloud',
'RColorBrewer')
lapply(pakg, require, character.only = TRUE)
#--------------------------------------------------------------------------------------------------------
# 2. Làm việc với các files pdf
#--------------------------------------------------------------------------------------------------------
# http://data.library.virginia.edu/reading-pdf-files-into-r-for-text-mining/
# 2.1. Đọc các file pdf
setwd("D:/pdftotext/")
files <- list.files(pattern = "pdf$") # lập danh sách file pdf để đọc
Rpdf <- readPDF(control = list(text = "-layout"))
corp2 <- Corpus(URISource(files),
readerControl = list(reader = Rpdf))
# -----------------------------------------------------------------
# So sánh với cách đọc của gói pdftools
library(pdftools)
mk <- lapply(files,pdf_text) # Dùng gói pdftools
corp <- Corpus(VectorSource(mk))
print(corp)
print(corp2)
# -----------------------------------------------------------------
# 2.2. Loại những từ không liên quan
# Bỏ các từ như cengage, learning vì cengage learning là tên của nhà in. Sẽ không hợp lí nếu tính chúng vào phân tích:
corp <- corp %>% tm_map(removeWords, c("cengage", "learning"))
# Xóa tất cả các loại dấu câu như chấm, phẩy
# Sử dụng hàm này tốt hơn so với hàm mặc định
replacePunctuation <- function(x) {
gsub("[[:punct:]]+", " ", x) }
corp <- corp %>% tm_map(replacePunctuation)
# corp <- corp %>% tm_map(removePunctuation) # Do hàm này sẽ không để khoảng trống khi remove .
# Ví dụ:
removePunctuation("hello...world")
#
# Bỏ các Stop Word trong tiếng Anh:
corp <- corp %>% tm_map(removeWords, stopwords("english")) # tùy thuộc stopwords trong từng hàm, số lượng từ bị xóa sẽ khác nhau
# Chuyển hóa tất về chữ in thường:
corp <- corp %>% tm_map(content_transformer(tolower))
# Chuyển động từ về nguyên dạng, không chia, không nên dùng, vì nó bỏ hết cả chữ e cuối từ
corp <- corp %>% tm_map(PlainTextDocument)
corp <- corp %>% tm_map(stemDocument, "english")
# Bỏ các con số:
corp <- corp %>% tm_map(removeNumbers)
# Xóa khoảng trắng
corp <- corp %>% tm_map(stripWhitespace)
# 2.3. Chuyển hóa về Document Matrix: -------------------------------------------------------------
# Nếu có lỗi dùng hàm dưới
# corp <- tm_map(corp, content_transformer(function(x) iconv(enc2utf8(x), sub = "byte")))
tdm <- TermDocumentMatrix(corp)
# Kiểm tra tdm
inspect(tdm[1:10,])
m <- as.matrix(tdm)
v <- sort(rowSums(m), decreasing = TRUE)
d <- data.frame(word = names(v), freq = v)
str(d)
# Chuyển hóa factor về character:
d$word <- as.character(d$word)
# Danh sách của 500 từ xuất hiện nhiều nhất trong
# cuốn sách của Gujarati cùng tần suất tương ứng:
knitr::kable(d %>% slice(1:500))
# 500 từ này chiếm 75.9% tất cả các từ vựng mà tác giả dùng để viết sách:
sum(d$freq[1:500]) / sum(d$freq)
# Trong khi đó 500 từ kế tiếp chỉ chiếm 12.5%
sum(d$freq[1:1000]) / sum(d$freq)
#-----------------------------------------------------
# Dưới đây chúng ta lọc ra hai bộ dữ liệu riêng biệt.
# Bộ thứ nhất là những từ thuộc bộ từ điển tiếng Anh.
# Bộ còn lại không thuộc.
#-----------------------------------------------------
# Bộ thứ nhất chủ yếu là các từ phổ thông:
gu_eng <- d %>% filter(word %in% eng$V1)
# Bộ thứ hai hầu hết là từ chuyên ngành Thống kê - Kinh tế lượng:
gu_non_eng <- dplyr::setdiff(d, gu_eng)
# Tổng số từ vựng sử dụng để viết sách là 9078:
nrow(d)
nrow(gu_eng)
nrow(gu_non_eng)
nrow(gu_non_eng) / nrow(d)
knitr::kable(gu_non_eng %>% filter(freq >= 100))
knitr::kable(head(gu_non_eng, 200))
#--------------------------------------------------------------------------------------------------------
# 3. Vẽ đám mây từ
#--------------------------------------------------------------------------------------------------------
# Cho 100 từ xuất hiện nhiều nhất ở bộ 1:
par(bg = "black")
set.seed(15888)
wordcloud(words = gu_eng$word,
freq = gu_eng$freq,
# Chỉ hiện thị từ nào xuất hiện ít nhất 100 lần:
min.freq = 100,
# Số từ hiển thị trên wordcloud tối đa là 200:
max.words = 200,
# Ngẫu nhiên thứ tự:
random.order = FALSE,
# 35% số từ được hiển thị theo chiều thẳng đứng
rot.per = 0.35,
# Chọn kích cỡ chữ:
font = 2,
# Tô màu cho chữ:
colors = brewer.pal(8, "Dark2"))
# Cho 100 từ xuất hiện ở bộ 2:
set.seed(1409)
wordcloud(words = gu_non_eng$word,
freq = gu_non_eng$freq,
# Chỉ hiện thị từ nào xuất hiện ít nhất 10 lần
min.freq = 10,
# Số từ hiển thị trên wordcloud tối đa là 200:
max.words = 200,
# Ngẫu nhiên thứ tự:
random.order = FALSE,
# 35% số từ được hiển thị theo chiều thẳng đứng
rot.per = 0.35,
# Chọn kích cỡ chữ:
font = 2,
# Tô màu cho chữ:
colors = brewer.pal(8, "Dark2"))