Creare un Linguaggio Naturale (NLG)

Uno dei problemi da affrontare, quando si cerca di rendere umano un software, è generare un discorso che non sia troppo schematico. Non vogliamo far parlare un robot come un robot, ma come un umano. Per questo motivo la generazione di un linguaggio naturale è uno dei temi che va affrontato quando si realizzano chat bot testuali o vocali.

La diffusione di dispositivi come Google Home, Alexa, Siri o Smart Watch apre ulteriori campi di utilizzo sfruttando software di Text2Speech.

Le tecnologie per il Natural Language Generator non sono molte e in italiano, una lingua notoriamente complessa, non c’è nulla.

Prima di addentrarci sulle problematiche tecniche proviamo a capire quali sono le regole di generazione dei testi.

Supponiamo di avere dei dati su una partita di calcio e dobbiamo creare una notizia in italiano che non sembri generata da un computer ma da un giornalista.

Nel progettare un software di questo tipo non possiamo generalizzare troppo, ci sono cioè alcuni elementi che devono necessariamente far parte di un dominio, in questo caso il calcio. Altri possono essere inseriti in una libreria più generica, ad esempio la gestione delle ore o dei giorni.

Come dati iniziali usiamo quelli della gazzetta dello sport che li espone liberamente ( qui un esempio json) e iniziamo a leggerli in un’ottica da giornalista. Possiamo prendere spunto dai testi presenti sul sito della gazzetta.

L’Atalanta saluta con una vittoria il proprio pubblico : una frase che può essere usata quando la squadra che vince gioca in casa.

Pareggio tra le squadre della Fiorentina e del Pescara oppure La Fiorentina non sfrutta il vantaggio casalingo e pareggia con il Pescara : le due squadre chiudono in pareggio 0–0 o 1–1

Finisce in parità tra le squadre della Fiorentina e del Pescara nonostante i tanti goal : le due squadre chiudono in pareggio 2–2 3–3- etc

Per rendere umano il risultato dovremmo avere delle varianti sugli stessi dati in modo che le notizie non sembrino troppo dei template. Questo ci consentirà di avere notizie diverse su risultati simili.

I dati presenti nel json della gazzetta contengono anche informazioni sulla terna arbitrale e sull'orario e durata della partita. Tutti dati che possiamo sfruttare per “movimentare” il testo :

La partita è stata arbitrata da Celi Domenico coadiuvato dai guardalinee Mondin Luca e Liberti Stefano oppure La terna arbitrale era composta da Celi Domenico ed i guardalinee Mondin Luca e Liberti Stefano

Al termine dei 95' le due squadre …. / dopo 95' le due squadre … / Risultato finale dopo 95' di gioco … / Fischio finale dopo 95 minuti di gara che fissa il risultato …

Come accennato alcune funzioni potrebbero essere generali mentre altre far parte di un dominio specializzato su un tema.

Per il primo gruppo potremmo aggiungere funzioni sulle date :

  • 24/07/2017 18:04:00 potrebbe indicare nel pomeriggio del 24 Luglio
  • 24/07/2017 20:04:00 potrebbe indicare in serata del 24 Luglio
  • 24/07/2017 09:04:00 potrebbe indicare nella mattinata del 24 Luglio

Costruendo una classe Date con una funzione Date2DayTime( now ) che restituisce a seconda dell’orario stringhe del tipo : nel pomeriggio, in serata, nella mattinata. Potremmo creare un template con il resto della frase : Date2DayTime(now) del Date(‘DD MMM’)

Potremmo aver bisogno di altre varianti sulla data come ad esempio : il pomeriggio del 24 Luglio, la sera del 24 Luglio, la mattina del 24 Luglio

Le informazioni sui marcatori ci daranno la possibilità di generare frasi sia sui giocatori, magari andando su un archivio con ulteriori dati ( nazionalità, età, ultimi goal, etc), che sul risultato. Qualche esempio :

  • Più goal dello stesso giocatore : doppietta/tripletta di Alejandro Dario che si conferma in ottima forma ( goal stagione > 7 )
  • “gol>1" Inizia le marcature Alejandro Dario al 7 minuto del secondo tempo. La Atalanta si porta in vantaggio al 7 minuto del secondo tempo con un goal di Alejandro Dario.
  • “goal >1” stessa squadra” Raddoppio da parte della Juventus …
  • “progressione dei goal con pareggio” Recupera lo svantaggio al 7 minuto …, Pareggio nella seconda metà della partita con …

Aggiungere ulteriori dati come il meteo ci darebbe la possibilità di individuare condizioni come : sotto una pioggia battente, la partita si è giocata in un giornata molto calda e con un elevata umidità.

Proprio il meteo potrebbe essere un dominio specifico in cui generare notizie sulle previsioni del tempo.

Altri domini da esplorare potrebbero essere il traffico con le informazioni su eventuali blocchi alla circolazione, tutti gli sport, le informazioni di borsa, eventi catastrofici come terremoti o inondazioni.

Nel mondo delle IoT i dispositivi potrebbero generare dati in formato JSON che sistemi di NLG trasformerebbero in testo e messaggi vocali. Allarmi, termometri e sensori acquisterebbero facilmente la parola.

Nella pratica tutti quei contesti in cui abbiamo delle informazioni ben strutturate che oggi vengono lette da una persona per generare una notizia.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.