Paketen janeaustenr
och harrypotter
(det senare installeras från GitHub) innehåller Jane Austens verk och J.K. Rowlings Harry Potter böcker. Följande kod städar upp och kombinerar böckerna i en gemensam data.frame
kallad tidy_books
.
library(tidyverse)
library(harrypotter)
library(janeaustenr)
library(purrr)
library(stringr)
book_list <- list(
list(text = sensesensibility, title = "Sense and Sensibility", author = "Austen"),
list(text = prideprejudice, title = "Pride and Prejudice", author = "Austen"),
list(text = mansfieldpark, title = "Mansfield Park", author = "Austen"),
list(text = emma, title = "Emma", author = "Austen"),
list(text = northangerabbey, title = "Northanger Abbey", author = "Austen"),
list(text = persuasion, title = "Persuasion", author = "Austen"),
list(text = philosophers_stone, title = "Philosophers Stone", author = "Rowling"),
list(text = chamber_of_secrets, title = "Chamber of Secrets", author = "Rowling"),
list(text = prisoner_of_azkaban, title = "Prisoner of Azkaban", author = "Rowling"),
list(text = goblet_of_fire, title = "Goblet of Fire", author = "Rowling"),
list(text = order_of_the_phoenix, title = "Order of the Phoenix", author = "Rowling"),
list(text = half_blood_prince, title = "Half-Blood Prince", author = "Rowling"),
list(text = deathly_hallows, title = "Deathly Hallows", author = "Rowling")
)
tidy_book <- function(book){
# Attempts to convert a character vector to a vector of lower case words
words <- tolower(book$text) %>%
str_extract_all(boundary("word")) %>%
unlist()
data.frame(words = words, title = book$title, author = book$author,
stringsAsFactors = FALSE)
}
# Mer om map-funktionerna i slutet av kursen!
tidy_books <- map(book_list, tidy_book) %>%
map_df(bind_rows)
Kontrollera ifall några ord innehåller tecken som inte är gemena bokstäver (a-z), ta i så fall bort dessa. Ifall vi vill avgöra om Austen eller Rowlings skrivet en given bok, kan vi helt enkelt undersöka hur ofta “harry” förekommer. Gör en tabell över antalet förekomster av “harry” i böckerna.
För att avgöra om författarna skiljer sig i stil kommer vi istället använda frekvensen av ett antal stoppord (ord var huvudsakliga syfte är att binda ihop texten). En stoppordlista hittar vi med
stop_words <- read_table("https://raw.githubusercontent.com/stopwords-iso/stopwords-en/master/stopwords-en.txt",
col_names = "words")
Rensa även denna från apostrofer och dylikt innan den kopplas ihop med böckerna genom en inner_join
. Välj nu ut de 20 mest frekventa stopporden (i de samlade verken) och skapa med hjälp av spread
en data.frame
med kolumnerna title
, author
samt en kolumn för vart och ett av stopporden innehållande deras relativa frekvenser i respektive verk (d.v.s. en data.frame
med 13 rader och 22 kolumner).
Bilda en matris (13 rader och 20 kolumner) med standardiserade ordfrekvenser (dra ifrån mean
och dela med sd
) och gör en singulärvärdesuppdelning (SVD) med svd
. Plotta de två första kolumnerna i matrisen \(U\) mot varandra och färglägg efter författare.
Gör även en klustring av böckerna med hierarkis klusteranalys (hclust
, valfria parametrar). Plotta ett dendrogram och bestäm resultatet av en klustering i två komponenter.
Bonusuppgift: Använd paketet babynames
för att uppskatta andelen amerikanska Potter-fans som förväxlat namnen “Hermione” och “Hermoine”.