top of page

Sentiment Analysis con Python la guida completa

Contribuiamo a semplificare l'analisi del sentiment usando Python in questo tutorial. Imparerai come costruire il tuo classificatore di analisi del sentimento usando Python e comprenderai le basi della NLP (elaborazione del linguaggio naturale).


Indice articolo sulla Sentiment Analysis con Python:

  • Cos'è la Sentiment Analysis

  • Formulare la dichiarazione del problema della Sentiment Analysis

  • Classificazione Naive Bayes per la Sentiment Analysis

  • Un semplice classificatore di sentimenti in Python

  • Perché la Sentiment Analysis è così importante?

Sentiment Analysis con PythonSentiment Analysis con Python dalla Teoria alla Pratica
Sentiment Analysis con Python dalla Teoria alla Pratica

Introduzione alla Sentiment Analysis con Python

La promessa dell'apprendimento automatico ha mostrato molti risultati sorprendenti in un'ampia varietà di campi. L'elaborazione del linguaggio naturale non fa eccezione, ed è uno di quei campi in cui l'apprendimento automatico è stato in grado di mostrare l'intelligenza artificiale generale (non del tutto ma almeno in parte) ottenendo risultati brillanti per compiti davvero complicati.


Ora, la NLP (elaborazione del linguaggio naturale) non è un campo nuovo e nemmeno l'apprendimento automatico. Ma la fusione di entrambi i campi è abbastanza contemporanea e promette solo di fare progressi. Questa è una di quelle applicazioni ibride che tutti (con uno smartphone economico) incontrano quotidianamente. Ad esempio, prendi "suggerimento di parole da tastiera" nell'account o completamenti automatici intelligenti; questi sono tutti i sottoprodotti della fusione di NLP e Machine Learning e, in modo del tutto naturale, sono diventati le parti inseparabili della nostra vita.


La Sentiment Analysis è un argomento vitale nel campo della NLP. È diventato facilmente uno degli argomenti più caldi del settore a causa della sua rilevanza e del numero di problemi aziendali che sta risolvendo ed è stato in grado di rispondere. In questo tutorial tratterai questo argomento non così semplice in modo semplice . Analizzerai tutta la piccola matematica che c'è dietro e la studierai. Alla fine di questo tutorial creerai anche un semplice classificatore di sentimenti. Nello specifico ti occuperai di:

  • Comprendere la Sentiment Analysis dal punto di vista di un professionista

  • Formulare la dichiarazione del problema della Sentiment Analysis

  • Classificazione Naive Bayes per la Sentiment Analysis

  • Un caso di studio in Python della Sentiment Analysis

  • In che modo la Sentiment Analysis sta influenzando diversi ambiti aziendali

  • Ulteriori letture sull'argomento


Iniziamo.


Sentiment Analysis con Python la guida completa
Sentiment Analysis con Python la guida completa

Cos'è la Sentiment Analysis :

In sostanza, la Sentiment Analysis o la classificazione del sentimento rientrano nell'ampia categoria delle attività di classificazione del testo in cui ti viene fornita una frase o un elenco di frasi e il tuo classificatore dovrebbe dire se il sentimento dietro è positivo, negativo o neutro. A volte, il terzo attributo non viene utilizzato per mantenerlo un problema di classificazione binaria. Nelle attività recenti vengono presi in considerazione anche sentimenti come "un po' positivi" e "un po' negativi". Capiamo ora con un esempio.


Considera le seguenti frasi:

  1. "Titanic è un grande film"

  2. "Titanic non è un gran film"

  3. "Titanic è un film"

Le frasi corrispondono a recensioni di cortometraggi e ognuna di esse trasmette sentimenti diversi. Ad esempio, la prima frase denota un sentimento positivo sul film Titanic mentre la seconda tratta il film come non eccezionale (sentimento negativo). Dai un'occhiata al terzo.


Non c'è una parola del genere in quella frase che possa dirti qualcosa riguardo al sentimento trasmesso da essa. Quindi, questo è un esempio di sentimento neutro.

Ora, da un punto di vista rigoroso di apprendimento automatico, questo compito non è altro che un compito di apprendimento supervisionato . Fornirai un gruppo di frasi (con le etichette dei rispettivi sentimenti) al modello di apprendimento automatico e testerai il modello su frasi senza etichetta.


Per poter costruire un modello di classificazione del sentimento, hai bisogno di qualcosa in più. Procediamo.


Formulare un problema di Sentiment Analysis

Prima di comprendere la definizione del problema di un'attività di classificazione dei sentimenti, è necessario avere un'idea chiara del problema generale di classificazione del testo. Definiamo formalmente il problema di un compito generale di classificazione del testo.

  • Input : - Un documento d - Un insieme fisso di classi C = {c 1 ,c 2 ,..,c n }

  • Output : una classe prevista c appartenente all'insieme C



Il termine del documento qui è soggettivo. Per documento si intende tweet, frasi, parti di articoli di notizie, interi articoli di notizie, un articolo completo, un manuale di prodotto, una storia, ecc.


La ragione alla base di questa terminologia è la parola che è un'entità atomica e piccola in questo contesto. Quindi, per denotare grandi sequenze di parole, questo termine documento è usato in generale. I tweet indicano un documento più breve mentre un articolo significa un documento più grande.


Quindi, un insieme di formazione di n documenti etichettati è simile a: (d 1 ,c 1 ), (d 2 ,c 2 ),...,(d n ,c n ) e l'output finale è un classificatore appreso.


Stai andando bene! Ma una domanda che devi farti a questo punto è dove sono le caratteristiche (variabili) dei documenti? Domanda genuina! Ci arriverai un po' più tardi.


Ora, andiamo avanti con la formulazione del problema e costruiamo lentamente l'intuizione dietro la classificazione dei sentimenti.


Un punto cruciale che devi tenere a mente mentre lavori nell'analisi del sentimento è che non tutte le parole in una frase trasmettono il sentimento della frase. Parole come "Io", "Sono", "Ho", ecc. non contribuiscono a trasmettere alcun tipo di sentimento e quindi non sono relative in un contesto di classificazione dei sentimenti. Considera il problema della selezione delle funzioni qui. Nella selezione delle caratteristiche, provi a capire le caratteristiche più rilevanti che si riferiscono maggiormente all'etichetta della classe . La stessa idea vale anche qui. Pertanto, solo una manciata di parole in una frase prendono parte a questo e identificarle ed estrarle dalle frasi si rivelano compiti impegnativi. Ma non preoccuparti, ci arriverai.


Considera la seguente recensione del film per capirlo meglio:


" Adoro questo film! È dolce, ma con umorismo satirico. I dialoghi sono fantastici e le scene di avventura sono divertenti. Riesce a essere romantico e stravagante mentre ride delle convenzioni del genere delle fiabe. Lo consiglierei a quasi chiunque. L'ho visto diverse volte e sono sempre felice di rivederlo....... "

Sì, questa è senza dubbio una recensione che porta sentimenti positivi riguardo a un particolare film. Ma quali sono quelle parole specifiche che definiscono questa positività?

Rivedi la recensione.



" Adoro questo film! È dolce , ma con umorismo satirico . I dialoghi sono fantastici e le scene di avventura sono divertenti . Riesce a essere romantico e stravagante mentre ride delle convenzioni del genere delle fiabe. Lo consiglierei a quasi chiunque. L'ho visto diverse volte e sono sempre felice di rivederlo ....... " .


Devi avere un'immagine chiara ora. Le parole in grassetto nel testo sopra sono le parole più importanti che costruiscono la natura positiva del sentimento trasmesso dal testo.

Cosa fare con queste parole? Il passo successivo che sembra naturale è creare una rappresentazione simile alla seguente:


​PAROLE

CONTEGGIO

Adoro

1

Dolce

1

​Fantastici

1

...

2

...

1



Quindi cosa stiamo rappresentando qui sopra?

  • una parola e la sua frequenza di occorrenza

  • i caratteri delle parole



Hai indovinato. Ogni riga contiene una parola e la sua frequenza di occorrenza nel documento.


Durante la formulazione della dichiarazione del problema di un compito di classificazione del sentimento, hai capito la rappresentazione " Borsa di parole " e la rappresentazione di cui sopra non è altro che una rappresentazione Bag-of-words. Questo è probabilmente il concetto più fondamentale nella NPL ed è il primo passo per risolvere qualsiasi problema di classificazione del testo. Quindi, assicurati di capirlo bene.


Una rappresentazione bag-of-words di un documento non contiene solo parole specifiche, ma tutte le parole uniche in un documento e la loro frequenza di occorrenza. Una borsa è una matematica, quindi per definizione di un insieme, la borsa non contiene parole duplicate.



Ma per questa applicazione, sei interessato solo alle parole in grassetto come menzionato in precedenza, quindi il sacco di parole per questo documento conterrà solo queste parole.

I documenti non sono scritti in modo confuso. Sono loro? La sequenza di parole in un documento è fondamentale. Ma nel contesto della classificazione dei sentimenti, questa sequenza non è molto importante. Ciò che è più importante o la parte più importante qui è la presenza di queste parole.


Le parole che hai scoperto nel sacco di parole ora costruiranno il set di funzionalità del tuo documento. Quindi, considera una raccolta di molte recensioni di film (documenti) e hai creato rappresentazioni di un sacco di parole per ciascuno di essi e conservato le loro etichette . Il tuo set di allenamento dovrebbe essere simile a:


Sentiment Analysis con Python la guida completa
Sentiment Analysis con Python la guida completa

Questa rappresentazione è anche conosciuta come Corpus.


Questo set di addestramento dovrebbe essere facile da interpretare -

Tutte le righe sono vettori di funzionalità indipendenti contenenti informazioni su un documento specifico (recensioni di film), le parole particolari e il suo sentimento. Si noti che il sentimento dell'etichetta è spesso indicato come (+, -) . Inoltre, le caratteristiche w1, w2, w3, 34, ..., wn sono generate da un insieme di parole e non è necessario che tutti i documenti contengano ciascuna di queste caratteristiche/parole.

Passerai questi vettori di funzionalità al classificatore. Quindi, studiamolo dopo: il modello di classificazione Naive Bayes per la classificazione del sentimento.


Classificazione Naive Bayes per la Sentiment Analysis

La classificazione ingenua di Bayes non è altro che l'applicazione delle regole di Bayes per formare le probabilità di classificazione. In questa sezione studierai il classificatore Naive Bayes dal contesto della classificazione dei sentimenti. Si consiglia vivamente di avere un'introduzione sulla classificazione di Naive Bayes e sulla regola di Bayes.


Ma perché Naive Bayes nel mondo k-NN, Decision Trees e tanti altri? Ci arriverai più tardi.

Costruiamo prima la nozione di termini generali nel classificatore di Naive Bayes nel contesto della classificazione dei sentimenti. Inizierai dando un'occhiata alla regola di Bayes:

  • Per un documento d e una classe c :

Sentiment Analysis con Python la guida completa
Sentiment Analysis con Python la guida completa

In questo caso, la classe comprende due sentimenti. Positivo e negativo.

Studiamo ogni termine dell'immagine sopra in dettaglio in questo contesto.

  • Il termine P(c|d) viene letto come la probabilità della classe c dato un documento d .

  • P(d|c) è analogo.

Ora, cosa sono questi P e la Probabilità? Inoltre, il termine P(d) (probabilità di un documento); suona assurdo? Tante domande! Troviamo subito le risposte!

  • Il termine che viene mostrato come Prior è la tua convinzione originale, ovvero l'etichetta originale del documento è positiva o negativa (in termini di sentimenti).

  • Il termine Probabilità è la probabilità di un documento d data una classe c.

  • Ora pensa al termine Posterior come alla tua regola aggiornata o credenza aggiornata ottenuta moltiplicando Prior e Probabilità.

  • Ma cos'è la costante di normalizzazione P(d)? Questo termine è diviso con il risultato prodotto dalla moltiplicazione per garantire che il risultato possa essere presentato in una distribuzione di probabilità.


Ma attieniti ad esso. Scoprirai maggiori informazioni. Ma ricorda, stai ancora costruendo la tua intuizione per mettere in relazione la regola di Bayes nel contesto della classificazione dei sentimenti.


Entriamo più nel dettaglio per scoprire cosa sta cercando di fare esattamente la regola di Bayes qui. L'immagine seguente presenta passaggi più dettagliati della regola di Bayes:


Sentiment Analysis con Python la guida completa
Sentiment Analysis con Python la guida completa

Molti termini sconosciuti qui. Andiamo piano.


Iniziamo con il termine c MAP . Denota qui l'obiettivo principale della regola di Bayes, ovvero scoprire la massima probabilità/stima a posteriori di un certo documento appartenente a una particolare classe. MAP è un'abbreviazione di Max A Posterioricui è una terminologia greca.


Che cos'è argmax? Avresti potuto usare solo max!

  • Bene, argmax denota l'indice. Supponiamo che P(+|d) > P(-|d) dove + e - denotino rispettivamente sentimenti positivi e negativi. Questi termini P(+|d), P(-|d) restituiscono probabilità che sono una quantità numerica. Ma non sei interessato alla probabilità, sei interessato a scoprire la classe per cui P(+|d) è maggiore e la argmax restituisce. Per P(+|d) > P(-|d), argmax restituirà + .

E sì, puoi eliminare il termine denominatore P(d). Dipende interamente dall'implementazione.


Ma come faccio a sapere P(d|c) e P(c) Questo è esattamente dove bag of words tornerà utile. Ma come?


Continuare a leggere!


Sai già come convertire un determinato documento in unbag of word. Ancora più importante, puoi rappresentare un documento come un insieme di funzionalità con questo. Quindi ora, essenzialmente il termine c MAP può essere scritto come (ignorando il termine denominatore P(d)):


Sentiment Analysis con Python la guida completa
Sentiment Analysis con Python la guida completa

Ma come si calcolano davvero le probabilità? Iniziamo con P(c) prima.


P(c) si occupa fondamentalmente di questa domanda: "Quanto spesso si verifica questa classe?" Supponiamo che il set di dati del tuo documento contenga il 60% di sentimenti positivi e il 40% di sentimenti negativi. Quindi, P(+) = 0,6 e P(-) = 0,4

.

Ora, come interpreti questo termine: P(x1, x2,...,xn | c)?


Pensa in questo modo: qual è la probabilità che si verifichino queste parole (caratteristiche) data la classe c. Ad esempio, supponiamo di avere 1000 documenti e di avere solo due parole nel corpus: "buono" e "fantastico". Ora, su questi 1000 documenti, 500 documenti sono etichettati come positivi e i restanti 500 sono etichettati come negativi. Inoltre, hai scoperto che su 500 documenti con etichetta positiva, 200 contengono entrambi "buono" e "fantastico" (nota P(x1,x2) significa P(x1 e x2)). Quindi, la probabilità P(buono,impressionante | +) = 200 / 1000 = 1/5.


Un punto importante che vorresti sottolineare qui è che se la tua dimensione del vocabolario è X allora puoi formulare X^n probabilità (come P(buono,impressionante | +)) probabilità a condizione che il tuo documento contenga n parole.


Ricorda che devi calcolare le probabilità di verosimiglianza per entrambe le classi qui. Quindi, il numero totale di combinazioni di uno scenario in cui hai 2000 parole totali e ogni documento contiene 20 parole in media sarà (2000)^20 . Questo numero è follemente grande! E se la dimensione del corpus fosse in milioni (cosa che accade davvero nei casi pratici)?


Questo è chiamato il classificatore di Bayes . Ma semplicemente non funziona perché i calcoli sono troppi. Ora studierai alcune ipotesi per rendere il classificatore Bayes un classificatore Naive Bayes .


I presupposti che studierai sono chiamati Naive Bayes Independence Assumptions . Sono i seguenti:


P(x1, x2,...,xn | c)

- Assunzione di parole : supponiamo che la posizione non abbia importanza. Supponiamo che una parola particolare si trovi alla decima e alla ventesima posizione, ma con questo presupposto, significa che ti interessa solo la frequenza perché quella parola si è verificata che è 2. 10 e 12 questi due numeri sono irrilevanti qui. - Assunzione di indipendenza condizionale : questa è un'ipotesi critica che rende il classificatore di Bayes Naive Bayes. Afferma che "assume le probabilità delle caratteristiche P(x i |c j )". Dai un'occhiata più da vicino alla dichiarazione. Significa che P(x 1 |c j ), P(x 2 |c j ) e così via sono indipendenti l'uno dall'altro. (Non significa in alcun modo che P(x 1), P(x 2 ) e così via sono indipendenti tra loro) Ora, il termine P(x1, x2,...,xn | c) può essere espresso come segue:


Sentiment Analysis con Python la guida completa
Sentiment Analysis con Python la guida completa

Quindi, naturalmente, X^n combinazioni vengono ridotte a X*n che è esponenzialmente inferiore (se la dimensione del tuo vocabolario è X e il tuo documento contiene n parole). Definito matematicamente, il classificatore Bayes quando ridotto al classificatore Naive Bayes assomiglia a:

Sentiment Analysis con Python la guida completa
Sentiment Analysis con Python la guida completa

Naive Bayes ha due vantaggi:

  • Numero ridotto di parametri.

  • Complessità temporale lineare in contrapposizione alla complessità temporale esponenziale.

Meccanismo di classificazione Naive Bayes quando applicato a un problema di classificazione del testo, viene indicato come classificazione " Multinomiale Naive Bayes ".

Ora, sei abbastanza abile nel comprendere i meccanismi di un classificatore Naive Bayes in particolare, per un problema di classificazione del sentimento. Ora è giunto il momento di implementare un classificatore di sentimenti.

Lo farai Python! Iniziamo con il caso di studio.


Un semplice classificatore di Sentiment Analysis con Python:

Per questo case study, utilizzerai un corpus di recensioni di film offline come descritto nel libro NLTK e può essere scaricato da qui . nltkfornisce una versione del set di dati. Il set di dati classifica ogni recensione come positiva o negativa. Devi prima scaricarlo come segue:


python -m nltk.downloader all

Non è consigliabile eseguirlo da Jupyter Notebook. Prova a eseguirlo dal prompt dei comandi (se utilizzi Windows). Ci vorrà del tempo. Quindi, sii paziente.

Per ulteriori informazioni sui set di dati NLTK, assicurati di visitare questo link .


Implementerai Naive Bayes o diciamo il classificatore Naive Bayes multinomiale utilizzando NLTKl'acronimo di Natural Language Toolkit. È una libreria dedicata alle attività relative alla NLP e alla NLU e la documentazione è molto buona. Copre molte tecniche in modo fantastico e fornisce anche set di dati gratuiti per esperimenti.

Questo è il sito ufficiale di NLTK. Assicurati di controllarlo perché ha alcuni tutorial ben scritti sulla NPL che coprono diversi concetti di NPL.


Dopo aver scaricato tutti i dati, inizierai importando il set di dati delle recensioni dei film da from nltk.corpus import movie_reviews. Quindi, costruirai un elenco di documenti, etichettati con le categorie appropriate.


import nltk
from nltk.corpus import movie_reviews
import random

documents = [(list(movie_reviews.words(fileid)), category)
              for category in movie_reviews.categories()
              for fileid in movie_reviews.fileids(category)]

random.shuffle(documents)

Successivamente, definirai un estrattore di funzionalità per i documenti, in modo che il classificatore sappia anche a quali aspetti dei dati dovrebbe prestare attenzione. "In questo caso, puoi definire una caratteristica per ogni parola, indicando se il documento contiene quella parola. Per limitare il numero di caratteristiche che il classificatore deve elaborare, inizi costruendo un elenco delle 2000 parole più frequenti nella corpus" Fonte . È quindi possibile definire un estrattore di funzionalità che controlla semplicemente se ciascuna di queste parole è presente in un determinato documento.


all_words = nltk.FreqDist(w.lower() for w in movie_reviews.words())
word_features = list(all_words)[:2000]

def document_features(document):
    document_words = set(document)
    features = {}
    for word in word_features:
        features['contains({})'.format(word)] = (word in document_words)
    return features

"Il motivo per cui hai calcolato l'insieme di tutte le parole in un documento document_words = set(document), invece di controllare solo se la parola nel documento, è che controllare se una parola si trova in un insieme è molto più veloce che controllare se si trova in un elenco" -


Hai definito l'estrattore di funzionalità. Ora puoi usarlo per addestrare un classificatore Naive Bayes a prevedere i sentimenti delle nuove recensioni di film. Per verificare le prestazioni del tuo classificatore, ne calcolerai l'accuratezza sul set di test. NLTK consente show_most_informative_features()di vedere quali caratteristiche il classificatore ha ritenuto più istruttive.

# Train 

featuresets = [(document_features(d), c) for (d,c) in documents]
train_set, test_set = featuresets[100:], featuresets[:100]
classifier = nltk.NaiveBayesClassifier.train(train_set)
# Test 

print(nltk.classify.accuracy(classifier, test_set))
0.71

Oh! Il classificatore è stato in grado di ottenere una precisione del 71% senza nemmeno modificare alcun parametro o regolazione fine. Questo è fantastico per il primo tentativo!

# Show the most important features as interpreted by Naive Bayes
classifier.show_most_informative_features(5)
Most Informative Features
       
contains(winslet) = True             pos : neg    =      8.4:1.0
contains(illogical) = True           neg : pos    =      7.6:1.0
contains(captures) = True            pos : neg    =      7.0:1.0
contains(turkey) = True              neg : pos    =      6.5:1.0
contains(doubts) = True              pos : neg    =      5.8:1.0

"Nel set di dati, una recensione che menziona "Illogico" ha quasi 8 volte più probabilità di essere negativa che positiva, mentre una recensione che menziona "Captures" ha circa 7 volte più probabilità di essere positiva" - Fonte .


Ora la domanda: perché Naive Bayes?

  • Hai scelto di studiare Naive Bayes per il modo in cui è progettato e sviluppato. I dati di testo hanno alcune caratteristiche pratiche e sofisticate che sono meglio mappate su Naive Bayes a condizione che tu non stia considerando le reti neurali. Inoltre, è facile da interpretare e non crea la nozione di modello blackbox.


Anche Naive Bayes soffre di un certo svantaggio

Il limite principale di Naive Bayes è l'assunzione di predittori indipendenti. Nella vita reale, è quasi impossibile ottenere una serie di predittori completamente indipendenti.



Perché la Sentiment Analysis importante?

La Sentiment Analysis è importante perchè risolve una serie di problemi aziendali reali, tra cui:

  • Aiuta a prevedere il comportamento dei clienti per un particolare prodotto.

  • Può aiutare a testare l'adattabilità di un prodotto.

  • Automatizza l'attività di report sulle preferenze del cliente.

  • Può facilmente automatizzare il processo di determinazione della performance di un film analizzando i sentimenti dietro le recensioni del film da diverse piattaforme.

  • E tanti altri!

Prossimi passi per la Sentiment Analysis con python

Congratulazioni! Ce l'hai fatta fino alla fine. La NPL è un argomento molto vasto e interessante e risolve alcuni problemi impegnativi. In particolare, l'intersezione tra NPL e Deep Learning ha dato vita ad alcuni fantastici prodotti. Ha completamente rivoluzionato il modo in cui interagiscono i chatbot. L'elenco è infinito.


Si spera che questo tutorial ti abbia dato un vantaggio in uno dei principali sottocampi della NLP, ovvero l'analisi del sentimento. Hai trattato uno degli argomenti più fondamentali della NPL - Bag of Words e poi hai studiato Naive Bayes Classifier in modo dettagliato. Hai esaminato anche i suoi difetti. Hai usato nltk, una delle librerie Python più popolari per le attività NLP e NLU. Hai implementato un semplice classificatore Naive Bayes con il corpus del film che fornisce nltk. Concediti un applauso. Te lo meriti!

PCR (5).gif
PCR (4).gif
PCR.gif
PCR.gif
PCR.gif
PCR.gif
PCR (5).gif
3.gif
Vediamo se riesci a cliccarmi ! Nascondo una Sorpresa... (2).png

Ciao 

🤗 Articoli consigliati dalla nostra
Intelligenza Artificiale in base ai tuoi interessi

Correlazione Alta

Correlazione Media

Correlazione Bassa

Iscriviti

VUOI DIVENTARE UN MEMBRO DI INTELLIGENZA ARTIFICIALE ITALIA GRATUITAMENTE E TRARNE I SEGUENTI BENEFICI?

Corsi Gratis

più di 150 lezioni online

Dataset Gratis

più di 150o dataset

Ebook Gratis

più di 10 libri da leggere

Editor Gratis

un editor python online

Progetti Gratis

più di 25 progetti python

App Gratis

4 servizi web con I.A.

Unisciti Ora a oltre
1.000.000
di lettori e appassionanti d'I.A.

Tutto ciò che riguarda l'intelligenza Artificiale, in unico posto, in italiano e gratis.

MEGLIO DI COSI' NON SI PUO' FARE

Dopo l'iscrizione riceverai diversi Regali

VUOI SCRIVERE ARTICOLI INSIEME A NOI.

Grazie

bottom of page