Un significato più profondo: modellazione di argomenti in Python
Pubblicato: 2022-03-11I computer e i processori che li alimentano sono costruiti per funzionare con i numeri. Al contrario, il linguaggio quotidiano delle e-mail e dei post sui social media ha una struttura sciolta che non si presta al calcolo.
È qui che entra in gioco l'elaborazione del linguaggio naturale (NLP). La NLP è una branca dell'informatica che si sovrappone alla linguistica applicando tecniche computazionali (vale a dire l'intelligenza artificiale) per analizzare il linguaggio naturale e il parlato. La modellazione degli argomenti si concentra sulla comprensione di quali argomenti tratta un determinato testo. La modellazione degli argomenti consente agli sviluppatori di implementare funzionalità utili come il rilevamento delle ultime notizie sui social media, la raccomandazione di messaggi personalizzati, il rilevamento di utenti falsi e la caratterizzazione del flusso di informazioni.
In che modo gli sviluppatori possono convincere i computer incentrati sul calcolo a comprendere le comunicazioni umane a quei livelli di sofisticazione?
Un sacco di parole
Per rispondere a questa domanda, dobbiamo essere in grado di descrivere matematicamente un testo. Inizieremo il nostro tutorial Python sulla modellazione degli argomenti con il metodo più semplice: borsa di parole.
Questo metodo rappresenta un testo come un insieme di parole. Ad esempio, la frase This is an example può essere descritta come un insieme di parole utilizzando la frequenza con cui tali parole appaiono:
{"an": 1, "example": 1, "is": 1, "this": 1}Nota come questo metodo ignori l'ordine delle parole. Prendi questi esempi:
- "Mi piace Star Wars ma non mi piace Harry Potter."
- "Mi piace Harry Potter ma non mi piace Star Wars."
Questi sentimenti sono rappresentati dalle stesse parole, ma hanno significati opposti. Ai fini dell'analisi degli argomenti dei testi, tuttavia, queste differenze non contano. In entrambi i casi, stiamo parlando di gusti per Harry Potter e Star Wars, indipendentemente da quali siano questi gusti. In quanto tale, l'ordine delle parole è irrilevante.
Quando abbiamo più testi e cerchiamo di capire le differenze tra di loro, abbiamo bisogno di una rappresentazione matematica per il nostro intero corpus che consideri ogni testo separatamente. Per questo possiamo usare una matrice, in cui ogni colonna rappresenta una parola o un termine e ogni riga rappresenta un testo. Una possibile rappresentazione di un corpus consiste nell'annotare in ogni cella la frequenza con cui una determinata parola (colonna) viene utilizzata in un determinato testo (riga).
Nel nostro esempio, il corpus è composto da due frasi (le nostre righe di matrice):
["I like Harry Potter", "I like Star Wars"]Elenchiamo le parole di questo corpus nell'ordine in cui le incontriamo: I , like , Harry , Potter , Star , Wars . Questi corrispondono alle nostre colonne di matrice.
I valori nella matrice rappresentano il numero di volte in cui una determinata parola viene utilizzata in ogni frase:
[[1,1,1,1,0,0], [1,1,0,0,1,1]] Si noti che la dimensione della matrice è determinata moltiplicando il numero di testi per il numero di parole diverse che compaiono in almeno un testo. Quest'ultimo è solitamente inutilmente grande e può essere ridotto. Ad esempio, una matrice potrebbe contenere due colonne per verbi coniugati, come "play" e "played", indipendentemente dal fatto che il loro significato sia simile.
Ma potrebbero mancare colonne che descrivono nuovi concetti. Ad esempio, "classica" e "musica" hanno ciascuno significati individuali ma quando combinati - "musica classica" - hanno un altro significato.
A causa di questi problemi, è necessario preelaborare il testo per ottenere buoni risultati.
Modelli di preelaborazione e clustering degli argomenti
Per ottenere i migliori risultati, è necessario utilizzare più tecniche di preelaborazione. Ecco alcuni dei più utilizzati:
- Lettere minuscole. Metti tutte le parole in minuscolo. Metti tutte le parole in minuscolo. Il significato di una parola non cambia indipendentemente dalla sua posizione nella frase.
- n -grammi. Considera tutti i gruppi di n parole di fila come nuovi termini, chiamati n-grammi . In questo modo, casi come "casa bianca" verranno presi in considerazione e aggiunti all'elenco del vocabolario.
- Stemming. Identifica prefissi e suffissi delle parole per isolarle dalla loro radice. In questo modo, parole come "gioca", "giocato" o "giocatore" sono rappresentate dalla parola "gioca". Lo stemming può essere utile per ridurre il numero di parole nell'elenco del vocabolario preservandone il significato, ma rallenta notevolmente la preelaborazione perché deve essere applicato a ogni parola nel corpus.
- Ferma le parole. Non prendere in considerazione gruppi di parole prive di significato o utilità. Questi includono articoli e preposizioni, ma possono anche includere parole che non sono utili per il nostro caso di studio specifico, come alcuni verbi comuni.
- Termine frequenza–frequenza inversa del documento (tf–idf). Usa il coefficiente di tf–idf invece di annotare la frequenza di ogni parola all'interno di ogni cella della matrice. Si compone di due numeri, moltiplicati:
- tf: la frequenza di un dato termine o parola in un testo, e
- idf: il logaritmo del numero totale di documenti diviso per il numero di documenti che contengono quel dato termine.
tf–idf è una misura della frequenza con cui una parola viene utilizzata nel corpus. Per poter suddividere le parole in gruppi, è importante capire non solo quali parole compaiono in ogni testo, ma anche quali parole compaiono frequentemente in un testo ma non in altri.
La figura seguente mostra alcuni semplici esempi di queste tecniche di preelaborazione in cui il testo originale del corpus viene modificato in modo da generare un elenco di parole pertinente e gestibile.

Ora dimostreremo come applicare alcune di queste tecniche in Python. Una volta che abbiamo rappresentato matematicamente il nostro corpus, dobbiamo identificare gli argomenti discussi applicando algoritmi di apprendimento automatico non supervisionati. In questo caso, "non supervisionato" significa che l'algoritmo non ha etichette di argomenti predefinite, come "fantascienza", da applicare al suo output.
Per raggruppare il nostro corpus, possiamo scegliere tra diversi algoritmi, tra cui la fattorizzazione della matrice non negativa (NMF), l'analisi delle componenti principali sparse (PCA sparso) e l'allocazione di dirichlet latente (LDA). Ci concentreremo su LDA perché è ampiamente utilizzato dalla comunità scientifica grazie ai suoi buoni risultati nei social media, nelle scienze mediche, nelle scienze politiche e nell'ingegneria del software.
LDA è un modello per la scomposizione di argomenti senza supervisione: raggruppa i testi in base alle parole che contengono e alla probabilità che una parola appartenga a un determinato argomento. L'algoritmo LDA restituisce la distribuzione delle parole dell'argomento. Con queste informazioni possiamo definire gli argomenti principali in base alle parole che molto probabilmente sono ad essi associate. Una volta identificati gli argomenti principali e le parole associate, possiamo sapere quale argomento o argomenti si applicano a ciascun testo.
Si consideri il seguente corpus composto da cinque brevi frasi (tutte tratte dai titoli del New York Times ):
corpus = [ "Rafael Nadal Joins Roger Federer in Missing US Open", "Rafael Nadal Is Out of the Australian Open", "Biden Announces Virus Measures", "Biden's Virus Plans Meet Reality", "Where Biden's Virus Plan Stands"]L'algoritmo dovrebbe identificare chiaramente un argomento relativo alla politica e al coronavirus e un secondo relativo a Nadal e al tennis.
Applicare la strategia in Python
Per rilevare gli argomenti, dobbiamo importare le librerie necessarie. Python ha alcune utili librerie per la NLP e l'apprendimento automatico, tra cui NLTK e Scikit-learn (sklearn).
from sklearn.feature_extraction.text import CountVectorizer from sklearn.feature_extraction.text import TfidfTransformer from sklearn.decomposition import LatentDirichletAllocation as LDA from nltk.corpus import stopwords Usando CountVectorizer() , generiamo la matrice che denota la frequenza delle parole di ogni testo usando CountVectorizer() . Si noti che CountVectorizer consente la preelaborazione se si includono parametri come stop_words per includere le parole di stop, ngram_range per includere n -grammi o lowercase=True per convertire tutti i caratteri in minuscolo.
count_vect = CountVectorizer(stop_words=stopwords.words('english'), lowercase=True) x_counts = count_vect.fit_transform(corpus) x_counts.todense() matrix([[0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0], [1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1]], dtype=int64) Per definire il vocabolario del nostro corpus, possiamo semplicemente usare l'attributo .get_feature_names() :
count_vect.get_feature_names() ['announces', 'australian', 'biden', 'federer', 'joins', 'measures', 'meet', 'missing', 'nadal', 'open', 'plan', 'plans', 'rafael', 'reality', 'roger', 'stands', 'virus']Quindi, eseguiamo i calcoli tf–idf con la funzione sklearn:
tfidf_transformer = TfidfTransformer() x_tfidf = tfidf_transformer.fit_transform(x_counts)Per eseguire la scomposizione LDA, dobbiamo definire il numero di argomenti. In questo semplice caso, sappiamo che esistono due argomenti o "dimensioni". Ma in casi generali, questo è un iperparametro che necessita di una messa a punto, che potrebbe essere eseguita utilizzando algoritmi come la ricerca casuale o la ricerca sulla griglia:
dimension = 2 lda = LDA(n_components = dimension) lda_array = lda.fit_transform(x_tfidf) lda_array array([[0.8516198 , 0.1483802 ], [0.82359501, 0.17640499], [0.18072751, 0.81927249], [0.1695452 , 0.8304548 ], [0.18072805, 0.81927195]])LDA è un metodo probabilistico. Qui possiamo vedere la probabilità di ciascuno dei cinque titoli appartenenti a ciascuno dei due argomenti. Possiamo vedere che i primi due testi hanno una maggiore probabilità di appartenere al primo argomento e i successivi tre al secondo argomento, come previsto.
Infine, se vogliamo capire di cosa trattano questi due argomenti, possiamo vedere le parole più importanti in ogni argomento:
components = [lda.components_[i] for i in range(len(lda.components_))] features = count_vect.get_feature_names() important_words = [sorted(features, key = lambda x: components[j][features.index(x)], reverse = True)[:3] for j in range(len(components))] important_words [['open', 'nadal', 'rafael'], ['virus', 'biden', 'measures']]Come previsto, LDA ha correttamente assegnato le parole relative ai tornei di tennis e Nadal al primo argomento e le parole relative a Biden e virus al secondo argomento.
Analisi su larga scala e casi d'uso nel mondo reale
Un'analisi su larga scala della modellazione tematica può essere vista in questo documento; Ho studiato i principali argomenti di cronaca durante le elezioni presidenziali americane del 2016 e ho osservato gli argomenti che alcuni mass media, come il New York Times e Fox News, hanno incluso nella loro copertura, come la corruzione e l'immigrazione. In questo articolo ho anche analizzato le correlazioni e le cause tra i contenuti dei mass media ei risultati elettorali.
La modellazione degli argomenti è ampiamente utilizzata anche al di fuori del mondo accademico per scoprire modelli di attualità nascosti presenti in grandi raccolte di testi. Ad esempio, può essere utilizzato nei sistemi di raccomandazione o per determinare di cosa parlano i clienti/utenti nei sondaggi, nei moduli di feedback o sui social media.
Il Toptal Engineering Blog estende la sua gratitudine a Juan Manuel Ortiz de Zarate per aver esaminato gli esempi di codice presentati in questo articolo.
Letture consigliate sulla modellazione degli argomenti
Modellazione degli argomenti migliorata in Twitter
Albanese, Federico ed Esteban Feuerstein. "Modellazione degli argomenti migliorata in Twitter attraverso il pooling della comunità". (20 dicembre 2021): arXiv:2201.00690 [cs.IR]
Analisi di Twitter per la salute pubblica
Paul, Michael e Mark Dredze. "Sei quello che twitti: analizzare Twitter per la salute pubblica". 3 agosto 2021.
Classificazione dell'orientamento politico su Twitter
Cohen, Raviv e Derek Ruths. "Classificare l'orientamento politico su Twitter: non è facile!" 3 agosto 2021.
Utilizzo di modelli di argomenti relazionali per acquisire l'accoppiamento
Gethers, Malcolm e Denis Poshyvanyk. "Utilizzo di modelli di argomenti relazionali per acquisire l'accoppiamento tra classi nei sistemi software orientati agli oggetti". 25 ottobre 2010.
