Niezbędne biblioteki do całej analizy:
library(tidytext)
library(dplyr)
library(textstem)
library(wordcloud)
library(tidyr)
library(ggplot2)
library(tm)
library(stringr)
library(quanteda)
library(e1071)
library(gmodels)
library(caret)
library(topicmodels)
library(kableExtra)
library(proxy)
library(dendextend)
library(rmdformats)
library(knitr)
Poddane analizie są książki Juliusza Verne’a:
“W 80 dnii dookoła świata”
“Wokół księżyca”
Wczytywane są w podziale na rozdziały.
<- "https://raw.githubusercontent.com/ncola/Verne_books-analysis-text-mining/master/Around_the_World_in_Eighty_Days.txt"
url
<- readLines(url) %>%
eighty_days paste(collapse = " ") %>%
strsplit(split = "(CHAPTER\\s+)", perl = TRUE) %>%
unlist() %>%
data.frame(chapter = 0:(length(.) - 1), text = ., stringsAsFactors = FALSE)
<- eighty_days[-1, ] # usunięcie pierwszego pustego wiersza
eighty_days
<- head(eighty_days$text,5)
wys <- tibble(Chapter = 1:5, "Część tekstu" = paste0(substr(wys, 1, 250), "[...]"))
wyswietlenie kable(wyswietlenie, format = "html", align = "c", table.attr = "class='table table-striped'", row.names = FALSE, caption = "W 80 dni dookoła świata w podziale na rozdziały") %>%
kable_styling()
Chapter | Część tekstu |
---|---|
1 | I. IN WHICH PHILEAS FOGG AND PASSEPARTOUT ACCEPT EACH OTHER, THE ONE AS MASTER, THE OTHER AS MAN Mr. Phileas Fogg lived, in 1872, at No. 7, Saville Row, Burlington Gardens, the house in which Sheridan died in 1814. He was one of the most noticeable […] |
2 |
|
3 |
|
4 |
|
5 | V. IN WHICH A NEW SPECIES OF FUNDS, UNKNOWN TO THE MONEYED MEN, APPEARS ON ’CHANGE Phileas Fogg rightly suspected that his departure from London would create a lively sensation at the West End. The news of the bet spread through the Reform Club, an[…] |
<- "https://raw.githubusercontent.com/ncola/Verne_books-analysis-text-mining/master/All_around_the_moon.txt"
url2
<- readLines(url2) %>%
all_moon paste(collapse = " ") %>%
strsplit(split = "(CHAPTER\\s+)", perl = TRUE) %>%
unlist() %>%
data.frame(chapter = 1:length(.), text = ., stringsAsFactors = FALSE)
<- head(all_moon$text,5)
wys2 <- tibble(Chapter = 1:5, "Część tekstu" = paste0(substr(wys2, 1, 250), "[...]"))
wyswietlenie2 kable(wyswietlenie2, format = "html", align = "c", table.attr = "class='table table-striped'", row.names = FALSE, caption = "Wokół księżyca w podziale na rozdziały") %>%
kable_styling()
Chapter | Część tekstu |
---|---|
1 | PRELIMINARY CHAPTER, RESUMING THE FIRST PART OF THE WORK AND SERVING AS AN INTRODUCTION TO THE SECOND. A few years ago the world was suddenly astounded by hearing of an experiment of a most novel and daring nature, altogether unprecedented in the […] |
2 |
|
3 |
|
4 |
|
5 |
|
Z tekstu usuwamy znaki interpunkcyjne, podwójne i pojedyńcze cudzysłowy, apostrofy i cyfry.
<- function(df) {
clean_text $text <- str_remove_all(df$text, "[[:punct:]]")
df$text <- str_remove_all(df$text, "\"")
df$text <- str_remove_all(df$text, "'")
df$text <- str_replace_all(df$text, "(\\b)'(\\w+)'(\\b)", "\\1\\2\\3")
df$text <- str_remove_all(df$text, "\\d+")
dfreturn(df)
}
<- clean_text(eighty_days)
eighty_days <- clean_text(all_moon) all_moon
<- eighty_days %>%
eighty_days_tokens unnest_tokens(word, text)
<- all_moon %>%
all_moon_tokens unnest_tokens(word, text)
<- get_stopwords(source = "smart") #wybieram smart ponieważ zaiwera najwięcej stop wordów
stopwords <- data.frame(Word = c(stopwords[[1]], 'passepartout', 'phileas', 'fogg', 'foggs', 'auouda','aouda' ,'francis', 'ardan', 'captain', 'barbican', 'mnicholl', 'mr', 'passepartouts', 'marston', 'fix'))
stopwords
<- anti_join(eighty_days_tokens, stopwords, by = c("word" = "Word"))
eighty_days_tidy <- anti_join(all_moon_tokens, stopwords, by = c("word" = "Word")) all_moon_tidy
Do stop words dodane zostały postacie z książek (imiona, naziwska itd) ponieważ zajmowały zdecydowaną część chmury, nie wnosząc nic do analizy. Są to:
fogg - Phileas Fogg (“W 80 dni dookoła świata”)
phileas - Phileas Fogg (“W 80 dni dookoła świata”)
passepartout - Jean Passepartout (oraz passepartouts ponieważ lemmatyzacja sobie nie poradziła) (“W 80 dni dookoła świata”)
auouda - postać (zapisywana również aouda) (“W 80 dni dookoła świata”)
francis - postać (“W 80 dni dookoła świata”)
Ardan - Michel Ardan (“Wokół księżyca”)
Barbican - Przedyent barbican (“Wokół księżyca”)
mnicholl - Captain M’nicholl (“Wokół księżyca”)
marston - J.K Marston, postac (“Wokół księżyca”)
fix - postać (“Wokół księżyca”)
<- nrow(eighty_days_tokens)
eighty_num <- nrow(eighty_days_tidy)
eighty_stop_num <- (eighty_num - eighty_stop_num) / eighty_num * 100
eighty_per
<- nrow(all_moon_tokens)
moon_num <- nrow(all_moon_tidy)
moon_stop_num <- (moon_num - moon_stop_num) / moon_num * 100
moon_per
cat("'W 80 dni dookoła świata'\n",
"Liczba tokenów przed usunięciem stopwords:", eighty_num, "\n",
"Liczba tokenów po usunięciu stopwords:", eighty_stop_num, "\n",
"% usuniętych:", sprintf("%.2f%%", eighty_per), "\n\n",
"'Wokół księżyca'\n",
"Liczba tokenów przed usunięciem stopwords:", moon_num, "\n",
"Liczba tokenów po usunięciu stopwords:", moon_stop_num, "\n",
"% usuniętych:", sprintf("%.2f%%", moon_per), "\n"
)
## 'W 80 dni dookoła świata'
## Liczba tokenów przed usunięciem stopwords: 62659
## Liczba tokenów po usunięciu stopwords: 24361
## % usuniętych: 61.12%
##
## 'Wokół księżyca'
## Liczba tokenów przed usunięciem stopwords: 97940
## Liczba tokenów po usunięciu stopwords: 38626
## % usuniętych: 60.56%
Można zauważyć, że w w powieści “80 dnii dookoła świata” zostało usunięte 61.12% tokenów, a w powieści “Wokół księżyca” 60.56% jako stop words.
Ogólnie rzecz biorąc, usunięcie stopwords znacznie zmniejszyło liczbę tokenów w obu przypadkach. Pozwala to na bardziej precyzyjne analizowanie istotnych słów w tekście, eliminując słowa powszechnie używane, które nie niosą dużo informacji.
Na tym etapie do wyboru mamy:
lemmatyzacje,
stemming.
Do obróbki tokenów została wybrana lemmatyzacja, jako że sprowadza token do jego podstawej wersji, co uznałam za czytelniejsze. Ponadto lemmatyzacja jest bardziej zaawansowaną techniką, która uwzględnia morfologię języka i może generować bardziej dokładne wyniki. Jest szczególnie przydatna w przypadku analizy semantycznej, gdzie zachowanie znaczenia słowa jest ważne.
<- eighty_days_tidy %>%
eighty_days_lem mutate(word_lemma = lemmatize_words(word, language = "english")) %>%
select(chapter, word_lemma)
<- all_moon_tidy %>%
all_moon_lem mutate(word_lemma = lemmatize_words(word, language = "english")) %>%
select(chapter, word_lemma)
W celu utworzenia korpusu i dalszej analizy, oczyszczone tokeny zostały złączone z powrotem do ciągu tekstu jako konkretne rozdziały.
<- books_list <- eighty_days_lem %>%
eighty_days_text group_by(chapter) %>%
summarize(text = paste(word_lemma, collapse = " ")) %>%
ungroup()
<- books_list <- all_moon_lem %>%
all_moon_text group_by(chapter) %>%
summarize(text = paste(word_lemma, collapse = " ")) %>%
ungroup()
<- rbind(eighty_days_text, all_moon_text)
books_docs nrow(books_docs)
## [1] 62
Mamy 62 rozdziały (dokumenty) z dwóch książek:
wiersze 1:37 - “W 80 dni dookoła świata”,
wiersze 38:62 - “Wokół ksieżyca”