Un sens mai profund: modelarea subiectelor în Python
Publicat: 2022-03-11Calculatoarele și procesoarele care le alimentează sunt construite pentru a funcționa cu numere. În schimb, limbajul de zi cu zi al e-mailurilor și al postărilor pe rețelele sociale are o structură liberă care nu se pretează la calcul.
Aici intervine procesarea limbajului natural (NLP). NLP este o ramură a informaticii care se suprapune cu lingvistica prin aplicarea tehnicilor de calcul (și anume inteligența artificială) pentru a analiza limbajul natural și vorbirea. Modelarea subiectelor se concentrează pe înțelegerea subiectelor despre care este vorba într-un anumit text. Modelarea subiectelor le permite dezvoltatorilor să implementeze funcții utile, cum ar fi detectarea știrilor de ultimă oră pe rețelele sociale, recomandarea de mesaje personalizate, detectarea utilizatorilor falși și caracterizarea fluxului de informații.
Cum pot dezvoltatorii să convingă computerele axate pe calcul să înțeleagă comunicațiile umane la acele niveluri de sofisticare?
O pungă de cuvinte
Pentru a răspunde la această întrebare, trebuie să fim capabili să descriem un text matematic. Vom începe tutorialul nostru Python de modelare a subiectelor cu cea mai simplă metodă: pungă de cuvinte.
Această metodă reprezintă un text ca un set de cuvinte. De exemplu, propoziția This is an example poate fi descrisă ca un set de cuvinte folosind frecvența cu care apar acele cuvinte:
{"an": 1, "example": 1, "is": 1, "this": 1}Observați cum această metodă ignoră ordinea cuvintelor. Luați aceste exemple:
- „Îmi place Războiul Stelelor, dar nu-mi place Harry Potter.”
- „Îmi place Harry Potter, dar nu-mi place Războiul Stelelor.”
Aceste sentimente sunt reprezentate de aceleași cuvinte, dar au sensuri opuse. În scopul analizării subiectelor textelor, însă, aceste diferențe nu contează. În ambele cazuri, vorbim despre gusturi pentru Harry Potter și Star Wars, indiferent de gusturi. Ca atare, ordinea cuvintelor este lipsită de importanță.
Când avem mai multe texte și căutăm să înțelegem diferențele dintre ele, avem nevoie de o reprezentare matematică pentru întregul nostru corpus care să ia în considerare fiecare text separat. Pentru aceasta putem folosi o matrice, în care fiecare coloană reprezintă un cuvânt sau un termen și fiecare rând reprezintă un text. O posibilă reprezentare a unui corpus constă în notarea în fiecare celulă a frecvenței cu care un anumit cuvânt (coloană) este folosit într-un anumit text (rând).
În exemplul nostru, corpus este compus din două propoziții (rândurile noastre de matrice):
["I like Harry Potter", "I like Star Wars"]Enumerăm cuvintele din acest corpus în ordinea în care le întâlnim: eu , ca , Harry , Potter , Star , Wars . Acestea corespund coloanelor noastre matrice.
Valorile din matrice reprezintă de câte ori este folosit un anumit cuvânt în fiecare frază:
[[1,1,1,1,0,0], [1,1,0,0,1,1]] Rețineți că dimensiunea matricei este determinată prin înmulțirea numărului de texte cu numărul de cuvinte diferite care apar în cel puțin un text. Acesta din urmă este de obicei inutil de mare și poate fi redus. De exemplu, o matrice poate conține două coloane pentru verbe conjugate, cum ar fi „played” și „played”, indiferent de faptul că semnificația lor este similară.
Dar coloanele care descriu concepte noi ar putea lipsi. De exemplu, „clasică” și „muzică” au fiecare semnificație individuală, dar atunci când sunt combinate – „muzică clasică” – au un alt sens.
Din cauza acestor probleme, este necesară preprocesarea textului pentru a obține rezultate bune.
Modele de preprocesare și grupare de subiecte
Pentru cele mai bune rezultate, este necesar să utilizați mai multe tehnici de preprocesare. Iată câteva dintre cele mai frecvent utilizate:
- Litere mici. Faceți toate cuvintele cu minuscule. Faceți toate cuvintele cu minuscule. Sensul unui cuvânt nu se schimbă indiferent de poziția lui în propoziție.
- n -grame. Considerați toate grupurile de n cuvinte dintr-un rând ca termeni noi, numiti n-grame . În acest fel, cazuri precum „casa albă” vor fi luate în considerare și adăugate la lista de vocabular.
- tulpini. Identificați prefixele și sufixele cuvintelor pentru a le izola de rădăcina lor. În acest fel, cuvinte precum „play”, „played” sau „player” sunt reprezentate de cuvântul „play”. Stemming-ul poate fi util pentru a reduce numărul de cuvinte din lista de vocabular, păstrându-le în același timp sensul, dar încetinește considerabil preprocesarea deoarece trebuie aplicată fiecărui cuvânt din corpus.
- Cuvinte oprite. Nu țineți cont de grupuri de cuvinte lipsite de sens sau utilitate. Acestea includ articole și prepoziții, dar pot include și cuvinte care nu sunt utile pentru studiul nostru de caz specific, cum ar fi anumite verbe comune.
- Termen frecvență–frecvență inversă a documentului (tf–idf). Utilizați coeficientul tf–idf în loc să notați frecvența fiecărui cuvânt din fiecare celulă a matricei. Este format din două numere, înmulțite:
- tf—frecvența unui anumit termen sau cuvânt într-un text și
- idf — logaritmul numărului total de documente împărțit la numărul de documente care conțin acel termen dat.
tf–idf este o măsură a frecvenței cu care este folosit un cuvânt în corpus. Pentru a putea subdiviza cuvintele în grupuri, este important să înțelegeți nu numai ce cuvinte apar în fiecare text, ci și ce cuvinte apar frecvent într-un text, dar deloc în altele.
Figura următoare prezintă câteva exemple simple ale acestor tehnici de preprocesare în care textul original al corpusului este modificat pentru a genera o listă de cuvinte relevantă și gestionabilă.
Acum vom demonstra cum să aplicăm unele dintre aceste tehnici în Python. Odată ce corpul nostru este reprezentat matematic, trebuie să identificăm subiectele discutate prin aplicarea algoritmilor de învățare automată nesupravegheați. În acest caz, „nesupravegheat” înseamnă că algoritmul nu are etichete de subiect predefinite, cum ar fi „science fiction”, care să fie aplicate rezultatelor sale.

Pentru a grupa corpusul nostru, putem alege dintre mai mulți algoritmi, inclusiv factorizarea matricei nenegative (NMF), analiza componentelor principale rare (PCA sparse) și alocarea dirichletului latent (LDA). Ne vom concentra pe LDA, deoarece este utilizat pe scară largă de comunitatea științifică datorită rezultatelor sale bune în rețelele sociale, științe medicale, științe politice și inginerie software.
LDA este un model pentru descompunerea nesupravegheată a subiectului: grupează textele în funcție de cuvintele pe care le conțin și de probabilitatea ca un cuvânt să aparțină unui anumit subiect. Algoritmul LDA emite distribuția cuvântului subiect. Cu aceste informații, putem defini subiectele principale pe baza cuvintelor care sunt cel mai probabil asociate cu acestea. Odată ce am identificat subiectele principale și cuvintele asociate acestora, putem ști ce subiect sau subiecte se aplică fiecărui text.
Luați în considerare următorul corpus compus din cinci propoziții scurte (toate preluate din titlurile 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"]Algoritmul ar trebui să identifice clar un subiect legat de politică și coronavirus, iar un al doilea legat de Nadal și tenis.
Aplicarea strategiei în Python
Pentru a detecta subiectele, trebuie să importam bibliotecile necesare. Python are câteva biblioteci utile pentru NLP și învățarea automată, inclusiv NLTK și 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 Folosind CountVectorizer() , generăm matricea care denotă frecvența cuvintelor fiecărui text folosind CountVectorizer() . Rețineți că CountVectorizer permite preprocesarea dacă includeți parametri precum stop_words pentru a include cuvintele stop, ngram_range pentru a include n -grame sau lowercase=True pentru a converti toate caracterele în minuscule.
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) Pentru a defini vocabularul corpusului nostru, putem folosi pur și simplu atributul .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']Apoi, efectuăm calculele tf–idf cu funcția sklearn:
tfidf_transformer = TfidfTransformer() x_tfidf = tfidf_transformer.fit_transform(x_counts)Pentru a realiza descompunerea LDA, trebuie să definim numărul de subiecte. În acest caz simplu, știm că există două subiecte sau „dimensiuni”. Dar, în cazuri generale, acesta este un hiperparametru care necesită o anumită reglare, care ar putea fi făcută folosind algoritmi precum căutarea aleatorie sau căutarea în grilă:
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 este o metodă probabilistică. Aici putem vedea probabilitatea ca fiecare dintre cele cinci titluri să aparțină fiecăruia dintre cele două subiecte. Putem observa că primele două texte au o probabilitate mai mare de a aparține la primul subiect și următoarele trei la al doilea subiect, așa cum era de așteptat.
În sfârșit, dacă vrem să înțelegem despre ce sunt aceste două subiecte, putem vedea cele mai importante cuvinte din fiecare subiect:
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']]După cum era de așteptat, LDA a atribuit corect cuvinte legate de turneele de tenis, iar Nadal primului subiect și cuvinte legate de Biden și virus celui de-al doilea subiect.
Analize la scară largă și cazuri de utilizare în lumea reală
O analiză la scară largă a modelării subiectelor poate fi văzută în această lucrare; Am studiat principalele subiecte de știri în timpul alegerilor prezidențiale din SUA din 2016 și am observat subiectele pe care unele mass-media, precum New York Times și Fox News, le-au inclus în acoperirea lor, cum ar fi corupția și imigrația. În această lucrare, am analizat și corelațiile și cauzalitățile dintre conținutul mass-media și rezultatele alegerilor.
Modelarea subiectelor este, de asemenea, utilizată pe scară largă în afara mediului academic pentru a descoperi modele tematice ascunse prezente în colecții mari de texte. De exemplu, poate fi folosit în sisteme de recomandare sau pentru a determina despre ce vorbesc clienții/utilizatorii în sondaje, în formularele de feedback sau pe rețelele sociale.
Blogul Toptal Engineering își exprimă recunoștința lui Juan Manuel Ortiz de Zarate pentru revizuirea mostrelor de cod prezentate în acest articol.
Lectură recomandată despre modelarea subiectului
Modelare îmbunătățită a subiectelor în Twitter
Albanese, Federico și Esteban Feuerstein. „Modelare îmbunătățită a subiectelor în Twitter prin gruparea comunității.” (20 decembrie 2021): arXiv:2201.00690 [cs.IR]
Analizând Twitter pentru sănătatea publică
Paul, Michael și Mark Dredze. „Sunteți ceea ce tweetați: Analizând Twitter pentru sănătatea publică.” 3 august 2021.
Clasificarea orientării politice pe Twitter
Cohen, Raviv și Derek Ruths. „Clasificarea orientării politice pe Twitter: nu este ușor!” 3 august 2021.
Utilizarea modelelor de subiecte relaționale pentru a capta cuplarea
Gethers, Malcolm și Denis Poshyvanyk. „Utilizarea modelelor de subiecte relaționale pentru a capta cuplarea între clase în sistemele software orientate pe obiecte.” 25 octombrie 2010.
