Thursday, July 12, 2018

Rcode pdf to text

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

No comments:

Post a Comment