Indice
Correzione ortografica dei testi
Tratto da: Strumenti per l'analisi testuale e il text mining in R: Strumenti per la preanalisi del testo. (vai al capitolo)
Correttore ortografico open-source ampiamente utilizzato da numerosi software, e molto affidabile1), Hunspell è anche il correttore ortografico di RStudio. Si tratta di una risorsa molto versatile per gestire i testi in lingua italiana.
Installiamo il pacchetto, se non fosse già installato nel sistema.
install.packages("Hunspell") library(hunspell)
Possiamo installare i dizionari delle diverse lingue — italiano inclusa — attraverso il menu di RStudio: Tools > Global Options > Spelling. Alla fine della procedura, dovremmo avere installato le seguenti lingue:
list_dictionaries()
[1] "bg_BG" "ca_ES" "cs_CZ" "da_DK" "de_DE" [6] "de_DE_neu" "el_GR" "en_AU" "en_CA" "en_GB" [11] "en_US" "es_ES" "fr_FR" "hr_HR" "hu-HU" [16] "id_ID" "it_IT" "lt_LT" "lv_LV" "nb_NO" [21] "nl_NL" "pl_PL" "pt_BR" "pt_PT" "ro_RO" [26] "ru_RU" "sh" "sk_SK" "sl_SI" "sr" [31] "sv_SE" "uk_UA" "vi_VN"
Testo dell'esempio: sepolcri.txt2).
Controllo ortografico
Importiamo il testo de "I Sepolcri" (Vedi Importazione dei testi):
library(tidyverse) # importazione library(readtext) sepolcri <- readtext("sepolcri.txt")
Controlliamo le parole, con la funzione hunspell():
# definiamo il dizionario it <- dictionary(lang = "it_IT") # vettore delle parole non riconosciute parole <- sepolcri$text %>% hunspell(dict = it) %>% # il risultato è una lista, la trasformiamo in vettore unlist() head(parole, 20)
[1] "All" "danzeran" "udrò" "cor" "spirto" [6] "dell" "spirto" "fia" "Pindemonte" "obblio" [11] "pria" "illusion" "ei" "Dall" "vulgo" [16] "dell" "spirto" "ricovrarsi" "ale" "lddio"
Guardiamo le frequenze delle parole non riconosciute:
table(parole) %>% sort(decreasing = T) %>% head(10)
parole dell all All fur lagrime spirto Troja ale 7 4 3 3 3 3 3 2 allor fe 2 2
Questa è una piccola funzione che velocizza la scrittura del codice (vedi Scrivere le proprie funzioni).
- forme_nr.R
forme_nr <- function(x, format = "text", dict = dictionary("it_IT"), ...) { res <- hunspell::hunspell(x, format, dict, ...) res <- unlist(res) res }
Correzione automatica
In teoria, potremmo correggere automaticamente i testi all'interno di R, usando la funzione hunspell_suggest() per i suggerimenti.
Usiamo qui anche stri_replace_all_fixed() per la sostituzione (Vedi anche: sapply):
frase <- "Lavoro presso l'Unversità di Teramo" # forme non riconosciute errori <- forme_nr(frase) # elenco delle parole corrette automaticamente correz <- sapply(errori, function(x) hunspell_suggest(x, dict = it)[[1]][1]) # correzione stringi::stri_replace_all_fixed(frase, errori, correz, vectorize_all = FALSE)
[1] "Lavoro presso l'Università di Teramo"
Nel caso dei Sepolcri, però, non sarebbe una buona idea ... :):
frase <- "Nè più nel cor mi parlerà lo spirto Delle vergini Muse e dell’Amore, Unico spirto a mia vita raminga" errori <- forme_nr(frase) correz <- sapply(errori, function(x) hunspell_suggest(x, dict = it)[[1]][1]) stringi::stri_replace_all_fixed(frase, errori, correz, vectorize_all = FALSE) %>% cat()
È più nel or mi parlerà lo sporti Delle vergini Muse e del’Amore, Unico sporti a mia vita raminga
Costruzione di un dizionario
Meglio invece costruire un dizionario (lexicon), da correggere e applicare in fase di preanalisi o normalizzazione del testo.
Costruiamo prima la lista delle correzione automatiche per il vettore delle forme non riconosciute:
correz <- sapply(parole, function(x) hunspell_suggest(x, dict = it)[[1]][1])
E poi mettiamo assieme i due vettori in un dizionario, un dataframe cioè con una colonna delle parole da sostituire ('word'), ed una con le sostituzioni ('lexicon'):
diz.sepolcri <- data.frame(cbind(word = parole, lexicon = correz), row.names = NULL) diz.sepolcri %>% head()
word lexicon 1 All Alà 2 danzeran danzerai 3 udrò durò 4 cor or 5 spirto sporti 6 dell del
Il dizionario potrà essere modificato a mano (molte forme non riconosciute sono stopword, quindi possono essere facilmente eliminate dal dizionario ed ignorate nelle correzioni).
Questa struttura di dizionario può essere utilizzata con diversi pacchetti, per la sostituzione delle parole nei testi.