library(koRpus) # TreeTagger e text analysis
library(koRpus.lang.it)
library(spacyr) # Spacy
L’articolo è stato ricavato dal web:
(ANSA) - SANREMO, FEB - “Ve lo dico, da ospite al festival di Sanremo non tornerò più. L’ ho fatto già troppe volte. Da conduttore non è proprio il caso. Ma potrei tornare da cantante”. Tra il serio e il faceto Fiorello apre alla possibilità in un futuro di tornare a cantare e di farlo al Festival. “Mi piacerebbe tornare a fare il cantante serio, Ho anche un sacco di amici che potrebbero scrivere per me canzoni davvero belle. Da Lorenzo Jovanotti a Giuliano Sangiorgi”. “Il momento che mi ha colpito di più? Achille Lauro mi ha fatto morire”, dice Fiorello nella sua incursione a sorpresa in sala stampa. “L’ esibizione del cantante è stata teatro, spettacolo. L’ ho visto entrare in scena e ho pensato, guarda c’ è Belfagor. Poi mi sono girato un attimo e l’ ho visto nudo. Mi ha divertito molto”. Con Amadeus, racconta, “eravamo d’ accordo che dopo il numero iniziale sarei andato via e mi sarei fatto sentire magari al telefono. Invece ho pensato: ma dove vado? Solo in albergo? E sono rimasto lì. Tutto quello che è successo dopo è nato così, anche gli sketch con Amadeus. So quello che sa fare. poco, ma lo fa bene. fa ridere perché lo fa a modo suo”. Quanto agli ascolti della prima serata, oltre milioni di spettatori, “non pensavo che andasse così bene. Mi vesto da De Filippi come ho promesso? Non lo so, ci sto pensando anche se sui social insistono”.Nella seconda serata del festival, stasera febbraio, annuncia lo showman, “canterò una canzone inedita talmente bella che se fosse stata in gara avrebbe avuto l’ opportunità di vincere qualcosa, La classica canzone di Sanremo”. (ANSA).
Text | Types | Tokens | Sentences |
---|---|---|---|
text1 | 196 | 351 | 24 |
La punteggiatura è stata conservata, per identificare le frasi e migliorare il riconoscimento delle parti grammaticali. Quindi il conteggio include anche i segni di punteggiatura.
Per la lemmatizzazione in R, è necessario installare TreeTagger e/o Python (miniconda o Anaconda + Spacy), e ricorrere a pacchetti che permettono il loro utilizzo in ambiente R.
Effettuiamo la lemmatizzazione con TreeTagger. La funzione treetag()
è inclusa nel pacchetto koRpus. Impostazioni e modelli della lingua italiana vengono caricati con il pacchetto koRpus.lang.it (per installazione e uso: https://reaktanz.de/?c=hacking&s=koRpus).
I file devono essere in formato txt (dunque contenuti in una cartella, e non oggetti dell’environment) e con codifica UTF-8.
lemmiart.t <- treetag(
"../dati/articolo.txt", # file in UTF-8
encoding = "UTF-8",
treetagger="manual",
stopwords = sw, # sw è un vettore carattere
lang="it",
TT.options=list(
path="C:/TreeTagger",
preset = "it"
)
)
Eseguiamo poi la lemmatizzazione con spacyr, dopo aver caricato il relativo pacchetto (per installazione e uso: https://spacyr.quanteda.io/).
spacy_initialize(model = "it")
lemmiart.s <- spacy_parse(articolo)
In entrambi i casi, gli argomenti delle funzioni consentono un uso più estensivo delle librerie.
lemmiart.t@TT.res %>% head()
doc_id | token | tag | lemma | lttr | wclass | desc | stop | stem | idx | sntc |
---|---|---|---|---|---|---|---|---|---|---|
NA | ( | PON | ( | 1 | punctuation | NA | FALSE | NA | 1 | 1 |
NA | ANSA | NOM | ansa | 4 | noun | NA | FALSE | NA | 2 | 1 |
NA | ) | PON | ) | 1 | punctuation | NA | FALSE | NA | 3 | 1 |
NA | - | PON | - | 1 | punctuation | NA | FALSE | NA | 4 | 1 |
NA | SANREMO | NOM | 7 | noun | NA | FALSE | NA | 5 | 1 | |
NA | , | PON | , | 1 | punctuation | NA | FALSE | NA | 6 | 1 |
lemmiart.s %>% head()
doc_id | sentence_id | token_id | token | lemma | pos | entity |
---|---|---|---|---|---|---|
text1 | 1 | 1 | ( | ( | PUNCT | |
text1 | 1 | 2 | ANSA | ANSA | PROPN | ORG_B |
text1 | 1 | 3 | ) | ) | PUNCT | |
text1 | 1 | 4 | - | - | PUNCT | |
text1 | 1 | 5 | SANREMO | SANREMO | PROPN | MISC_B |
text1 | 1 | 6 | , | , | PUNCT |
Notiamo in primo luogo che spacy include fra i tokens anche alcuni spazi, con la conseguenza che abbiamo 357 righe nel dataframe risultante, anziché 351, come le occorrenze effettive.
Le forme non riconosciute da TreeTagger sono 10. Si tratta dell’articolo apostrofato (“l”, 2 occ) e dei nomi. spacy, invece, non segnala lemmi non riconosciuti.
lemmiart.t@TT.res %>% filter(lemma == "<unknown>")
doc_id | token | tag | lemma | lttr | wclass | desc | stop | stem | idx | sntc |
---|---|---|---|---|---|---|---|---|---|---|
NA | SANREMO | NOM | 7 | noun | NA | FALSE | NA | 5 | 1 | |
NA | FEB | NOM | 3 | noun | NA | FALSE | NA | 7 | 1 | |
NA | Sanremo | NOM | 7 | noun | NA | FALSE | NA | 19 | 1 | |
NA | Sangiorgi | VER:impe | 9 | verb | NA | FALSE | NA | 100 | 7 | |
NA | Belfagor | NOM | 8 | noun | NA | FALSE | NA | 159 | 11 | |
NA | l | VER:impe | 1 | verb | NA | TRUE | NA | 168 | 12 | |
NA | Amadeus | NOM | 7 | noun | NA | FALSE | NA | 181 | 14 | |
NA | Amadeus | NOM | 7 | noun | NA | FALSE | NA | 238 | 19 | |
NA | l | VER:infi | 1 | verb | NA | TRUE | NA | 334 | 26 | |
NA | Sanremo | NOM | 7 | noun | NA | FALSE | NA | 345 | 26 |
Controllando infine i risultati “a vista”, scorrendo cioè direttamente i dataframe, sono state individuate le forme riconosciute erroneamente:
spacyr | TreeTagger | |
---|---|---|
volte | volto | — |
cantante | cantare | — |
serio | seriare | — |
farlo | farlo | — |
sorpresa (n) | sorpreso (agg) | — |
sala | salare | — |
stampa | stampare | — |
visto | vistare | — |
accordo | accordare | — |
numero | numerare | — |
telefono | telefonare | — |
fosse | fossa | — |
canzoni | — | canzonare |
TOTALE (su 196 forme) | 6.1% | 0.5% |
Al momento sembrerebbe che TreeTagger sia molto più affidabile di Spacy, che resta una libreria da tenere d’occhio per il futuro.