# librerie utilizzate
library(tidyverse)
library(tidytext)
library(wordcloud2)
library(ggthemes)

# lettura del file
promessi_sposi <- read_file("i_promessi_sposi.txt")
# elimino il carattere nascosto \r (carriage return)
promessi_sposi <- str_remove_all(promessi_sposi, "\r")
# elimino le virgolette
promessi_sposi <- str_remove_all(promessi_sposi, "\"")
# elimino i trattini
promessi_sposi <- str_remove_all(promessi_sposi, "-")

# divido la stringa in sfruttando la presenza di almeno 3 \n
capitoli <- str_split(promessi_sposi, "\n{3,}(?=CAPITOLO )")[[1]]

# estraggo i nomi dei capitoli
nomi_capitoli <- str_extract(capitoli, "^[^\n]+")
# e li rimuovo dal testo
capitoli <- str_remove(capitoli, "^[^\n]+\n+")

# costruisco una tabella con due colonne: nomi e contenuto del capitolo
promessi_sposi <- tibble(nomi_capitoli, capitoli)

# creo una tabella dividendo i capitoli per parole
promessi_tidy <- promessi_sposi |> 
  unnest_tokens("token", capitoli, token = "words")

# calcolo la tabella di frequenza di ciascun capitolo
# (lunghezza del capitolo come numero di parole)
promessi_tidy |> 
  count(nomi_capitoli) |> 
  arrange(desc(n)) |> 
  knitr::kable()
  
# rappresentazione grafica della lunghezza dei capitoli
promessi_tidy |> 
  count(nomi_capitoli) |> 
  mutate(nomi_capitoli = factor(nomi_capitoli)) |> 
  ggplot() +
    aes(y = fct_reorder(nomi_capitoli, n), x = n) +
    geom_col() +
  theme_tufte() +
  labs(x = "Numero di parole", 
       y = "",
       title = "Analisi testuale dei Promessi Sposi",
       subtitle = "Alessandro Manzoni",
       caption = "Analisi ottenuta con R")

# tabella delle stop words
ita_stopwords <- read_csv(
  gzfile("sentiment-lang-italian-master/lexicon/exc.words.txt.gz"),
  col_names = "word")
# tabella parole con sentiment positivo
ita_poswords <- read_csv(
  gzfile("sentiment-lang-italian-master/lexicon/pos.words.txt.gz"),
  col_names = "word")
# tabella parole con sentiment negativo
ita_negwords <- read_csv(
  gzfile("sentiment-lang-italian-master/lexicon/neg.words.txt.gz"),
  col_names = "word")

# elimino le stopword
promessi_clean <- anti_join(promessi_tidy, 
                            ita_stopwords, 
                            by = c("token" = "word"))

promessi_clean |> 
  count(token) |> 
  arrange(desc(n)) |> 
  slice_head(n = 10)

promessi_clean |> 
  group_by(nomi_capitoli) |> 
  count(token) |> 
  arrange(desc(n)) |> 
  slice_head(n = 5) |> 
  View()


promessi_clean |> 
  filter(nomi_capitoli == "CAPITOLO I") |> 
  count(token) |> 
  filter(n > 5) |> 
  arrange(desc(n)) |> 
  wordcloud2(shape = "pentagon")


promessi_clean

ita_poswords <- tibble(ita_poswords, sentiment = "positivo")
ita_negwords <- tibble(ita_negwords, sentiment = "negativo")
ita_sentiment <- bind_rows(ita_poswords, ita_negwords)

ita_sentiment |> 
  group_by(nomi_capitoli) |> 
  count(sentiment)
promessi_sentiment <- inner_join(promessi_clean, 
           ita_sentiment, 
           by = c("token" = "word"))

promessi_sentiment |> 
  group_by(nomi_capitoli) |> 
  count(sentiment) |> 
  ungroup() |> 
  pivot_wider(id_cols = nomi_capitoli, 
              names_from = sentiment, 
              values_from = n)
