Analisi grammaticale con Python

Stavo seguendo i compiti di un ragazzo alle prese con la grammatica. Sta svolgendo esercizi avanzati di grammatica, ma ha fatto qualche errore di valutazione, però i suoi errori mi hanno fatto pensare a creare un software per fare l’analisi grammaticale di frasi scritte dall’utente.

Essendo io ignorante in genere, non avrò la presunzione di creare un software per l’analisi grammaticale perfetta, ma ne approfitto per spiegarvi come ho inteso procedere io, con il linguaggio Python, ad analizzare le frasi. Infondo non voglio realmente creare un software, ma solo vedere se sono in grado di realizzare il giusto algoritmo per analizzare una frase.

Ho acceso il computer e dopo qualche istante di ragionamento ho pensato di realizzarlo nel modo che vi spiegherò più avanti.

Quindi, per riassumere, ora vi spiego passo passo, come avrei realizzato un semplice software, utile alle scuole elementari, che analizza semplici frasi. Starà a voi poi prendere l’idea, migliorarla, svilupparla, anche con i suggerimenti che vi darò alla fine.




La spiegazione che seguirà adesso, sarà esattamente il ragionamento che ho fatto per ideare il mio personalissimo software. Come sempre, ogni programmatore potrebbe trovare soluzioni diverse, e ben venga per lui.

Ah, utilizzerò Python 3.

INIZIAMO

Prima di tutto ho pensato a frasi semplici da analizzare, in modo da capire cosa far fare al programma:

  • Giuseppe mangia la pasta
  • Il cane grande corre in strada

Come potete notare, le frasi sono davvero semplici. Analizziamole:

“Giuseppe mangia la pasta” verrà analizzata così:

  • Giuseppe = nome proprio di persona
  • mangia = verbo
  • la = articolo determinativo
  • pasta = nome di cosa

“Il cane grande corre in strada”

  • Il = articolo determinativo
  • cane = nome di animale
  • grande = aggettivo qualificativo
  • corre = verbo
  • in = preposizione semplice
  • strada = nome di cosa

Perchè le abbiamo analizzate? Perchè se non sappiamo analizzarle, come facciamo ad insegnare al computer cosa fare? Bene, avete già capito così che fare il programmatore equivale a voler diventare Superman, perchè per sviluppare un software bisogna conoscere perfettamente l’argomento di cui svilupperemo il software, altrimenti il nostro software sarà ignorante come noi 😉

La prima istruzione che scriverò sarà la domanda da fare all’utente per fargli scrivere la frase da analizzare:

 

Questa istruzione di input, aspetterà che l’utente scriva la frase, quindi la memorizzerà nella variabile frase.

Ora creo una funzione che dividerà la frase dove trova ogni spazio, e la inserirà in una lista. Per esempio, per la frase “Giuseppe mangia la pasta”, voglio che Python crei una lista così: [“Giuseppe”,”mangia”,”la”,”pasta”] in modo da poter analizzare parola per parola.


 

La funzione qui sopra l’ho nominata dividi, proprio perchè si occuperà di dividere le parole, quindi gli ho metto un argomento tra parentesi che ho chiamato ricevuto, e che conterrà la frase che l’utente avrà scritto. Poi l’istruzione che segue, inserirà nella lista parole, tutte le parole, splittate nello spazio, cioè divise dove viene trovato lo spazio, della frase contenuta in ricevuto, che ricordiamo contenere la frase scritta dall’utente. Infine con l’istruzione return, rimando a Python la lista parole, che conterrà la frase divisa parola per parola. Insomma, parole conterrà [“Giuseppe”,”mangia”,”la”,”pasta”]

Ora inserisco la chiamata alla funzione, per far dividere la frase scritta dall’utente. Ecco tutte le istruzioni fino ad ora scritte:

 

 

 

 

La chiamata alla funzione è: diviso=dividi(frase) che equivale a dire a Python: “Hey Python, nella lista diviso inserisci ciò che ti restituisce la funzione dividi, a cui ho dato in pasto la stringa frase.

La stringa frase conteneva “Giuseppe mangia la pasta”. La funzione dividi ha splittato (diviso) la frase convertendola in lista di parole [“Giuseppe”,”mangia”,”la”,”pasta”], quindi la lista diviso conterrà [“Giuseppe”,”mangia”,”la”,”pasta”] che ha ricevuto dalla funzione.

Ora che ho ogni singola parola che contiene la frase, facciamola analizzare al programma, per rilevare articoli, nomi, verbi, oggetti, ecc…

Per fare questo, creo un’altra funzione che farà il lavoro per noi. Preoccupandomi solo delle parole presenti nella prima frase, farò cercare l’articolo determinativo “la” che è presente nella frase “Giuseppe mangia la pasta”. In questo modo farò riconoscere al programma la presenza dell’articolo determinativo “la”

 

 

 

Nella funzione sopra, viene eseguito un ciclo for che inserisce nella variabile x, ogni parola della lista ricevuto. In pratica la variabile x, in successione, prima conterrà “Giuseppe”, poi conterrà “mangia”, poi conterrà “la” e poi conterrà “pasta”.

Dato che sarà processata una parola alla volta, faremo verificare al programma, se la parola in esame, è uguale all’articola “la”. Se la parola processata è uguale all’articolo “la”, allora verrà scritto “la – è un articolo determinativo”, altrimenti verrà scritta la parola non riconosciuta con il testo “- non so cos’è”.

Bene, inseriamo la chiamata a questa funzione nel programma come mostrato nel programma completo qui sotto:

 

 

 

 

 

 

La chiamata alla funzione analisi viene fatta nell’ultima riga del programma, e alla funzione diamo in pasto la lista diviso, che come ricordiamo, contiene [“Giuseppe”,”mangia”,”la”,”pasta”]

Se eseguiamo il programma, ci verrà chiesta la frase da scrivere, e noi gli scriveremo “Giuseppe mangia la pasta”:

 

 

 

Quando premeremo sulla tastiera il tasto INVIO, avremo questo risultato:

 

 

 

 

Come potete notare, il programma ha riconosciuto solo l’articolo determinativo “la”.

Bene. Possiamo ritenerci molto soddisfatti. Il programma funziona. Ora facciamo in modo che il programma riconosca anche gli altri articoli determinativi che sono, oltre a “la” gli articoli “il, lo, i, gli, le”

Aggiungiamo, nella funzione analisi, una lista contenente tutti gli articoli determinativi:

 

 

 

 

 

 

La lista che contiene tutti gli articoli determinativi, l’ho chiamata artdet, così mi ricorda articoli determinativi.

Ora che ho questa lista, modifico la funzione analisi, per fargli verificare se la parola che sta processando, è uno degli articoli determinativi della lista artdet.

 

 

 

 

 

Come vedete dal rettangolo evidenziato, ho fatto processare con for x in artdet, anche gli articoli della lista artdet. Se la parola processata è uguale ad uno degli articoli, allora scriverà che è un articolo determinativo, altrimenti scriverà “non so cos’è”.

Proviamo ad eseguire il programma:

 

 

 

 

 

 

 

 

 

Come vedete abbiamo un bug, ovvero un problema. Infatti, quando vengono processati tutti gli articoli determinativi, se non sono uguali a “la”, presente nella frase, scriverà che non è riconosciuto.

Per evitare questo problema, eliminiamo l’istruzione else, che, nell’immagine sotto, vi indico con le righe rosse sopra. In questo modo il programma non ci dirà più le parole che non riconosce, ma solo quelle che riconosce:

 

 

 

 

 

 

Se ora proviamo ad eseguire il programma (eliminando le righe che ho indicato sopra), ecco cosa succede:

 

 

Come potete notare, è stato riconosciuto solo l’articolo determinativo “la”. Il vantaggio di aver aggiunto la verifica della lista degli articoli determinativi, ci permette di scrivere qualsiasi frase, e il programma sarà in grado di riconoscere qualsiasi articolo:

 

 

Come vedete, in un esempio in cui ho scritto una frase con più articoli determinativi, sono stati riconosciuti tutti gli articoli determinativi.

A titolo di esempio, aggiungiamo una nuova lista che contenga qualche nome proprio di persona:

 

 

 

 

 

Ho evidenziato la nuova lista che ho chiamato nompropers, che significherà nompropio di persona.

Ora faccio verificare al programma, se nella frase c’è uno di questi nomi propri di persona. Per rendere tutto il più comprensibile, ho usato stessi nome variabile usati per la verifica degli articoli determinativi, sperando sia utile e semplice per voi:

 

 

 

 

 

 

Se eseguiamo il programma, riusciremo a far riconoscere al software gli articoli determinativi e i nomi di persona:

 

 

Prima di andare avanti a far riconoscere altre cose, sistemiamo un problema che riguarda le maiuscole e minuscole. Infatti, se scriverete una frase tutta in maiuscolo, come “GIUSEPPE MANGIA LA PASTA”, oppure una frase in cui scrivete i nomi propri di persona in minuscolo, come ad esempio “giuseppe mangia la pasta”, il programma non riconoscerà le parole. Ecco perchè è utile mettere tutto in minuscolo e far verificare le frasi convertite in minuscolo. Quindi, prima di tutto mettiamo tutti nomi propri di persona, contenuti nella lista nompropers in minuscolo:

 

 

 

 

 

 

Poi facciamo in modo che il programma converta in minuscolo ogni parola presente nella frase, in modo da essere confrontata correttamente, con l’analisi del programma. L’istruzione da usare è .lower() che converte le stringhe in minuscolo. Chiaramente la inseriremo solo nella variabile che contiene la parola della frase, dato che non sappiamo se l’utente scriverà in maiuscolo o minuscolo:

 

 

 

 

 

 

Ora il programma è in grado di analizzare nomi propri di persone e articoli determinativi eventualmente scritti anche con caratteri maiuscoli.

Facciamogli riconoscere anche i verbi aggiungendo una lista con i verbi:

 

 

 

 

 

 

 

Ora aggiungiamo qualche nome di cosa, in modo da fargli fare il riconoscimento completo della nostra frase:

 

 

 

 

 

 

 

 

 

Come vedete il ragionamento del software funziona bene, ma è chiaro che vanno inserite molte parole e verbi da far riconoscere, diciamo…un vocabolario di parole 😉

L’obiettivo di questa spiegazione è principalmente quello di spiegare come un software che sembrerebbe complesso, in realtà poi è frutto di un banale algoritmo realizzato in pochi minuti. L’unica cosa che allunga il programma sono i termini del vocabolario da inserire, ma l’algoritmo che fa ragionare il programma è costituito da due semplici funzioni.




Abbiamo anche imparato, ancora una volta, che per poter programmare un software, dobbiamo conoscere bene l’argomento che dobbiamo trattare, quindi per un programmatore, l’istruzione generale è fondamentale. Non esiste un bravo programmatore che conosce a memoria i linguaggi di programmazione ma poi è ignorante in matematica, italiano e le altre materie…non è così?

Se volete migliorare ulteriormente il ragionamento del software, potete fargli distinguere in modo più dettagliato le parole o gli altri elementi grammaticali. Ad esempio potete creare una lista per gli articoli determinativi maschili singolari: [“il”,”lo”], una per gli articoli determinativi femminili singolari [“la”], una per gli articoli determinativi maschili plurali [“i”,”gli”], uno per quelli determinativi femminili plurali [“le”], ecc… per quanto riguarda verbi, coniugazioni, ed altro…

Divertitevi a programmare…