Ricerca Sociale con R

Una wiki per l'analisi dei dati con R

Strumenti Utente

Strumenti Sito


Il Laboratorio di Analisi dei Dati con R, dell'Università di Teramo su piattaforma Meet, inizia il 9 aprile 2021 - Iscrizione - email
r:analisi-testuale:correzione_ortografia

Correzione ortografica dei testi

Tratto da: Strumenti per l'analisi testuale e il text mining in R, capitolo: Strumenti per la preanalisi del testo

Correttore ortografico open-source ampiamente utilizzato da numerosi software, e molto affidabile 1), 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.txt
(fonte: WikiSource).

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.

Script di esempio


1) Ooms, Jeroen, e VVAA. 2018. Hunspell: High-Performance Stemmer, Tokenizer, and Spell Checker (versione 3.0). https://CRAN.R-project.org/package=hunspell.
r/analisi-testuale/correzione_ortografia.txt · Ultima modifica: 08/09/2021 13:00 da admin