Clasificarea textului cu Python - Cod sursă

Tutor | 29 octombrie 2018

Citirea dispoziției textului cu învățarea automată se numește analiza sentimentului și este unul dintre cele mai proeminente cazuri de utilizare în clasificarea textului. Acest lucru se încadrează în domeniul foarte activ de cercetare al procesării limbajului natural (NLP).

Alte cazuri obișnuite de utilizare a clasificării textului includ detectarea spamului, etichetarea automată a cererilor clienților și clasificarea textului în subiecte definite. Deci, cum poți face asta?

Selectați un set de date

Înainte de a începe, să aruncăm o privire asupra datelor pe care le avem. Mergeți mai departe și descărcați setul de date tradus în spaniolă din depozitul de învățare automată UCI.

Acest set de date include recenzii etichetate de la IMDb, Amazon și Yelp. Fiecare recenzie este marcată cu un scor de 0 pentru un sentiment negativ sau 1 pentru un sentiment pozitiv.

Extrageți folderul într-un folder de date și continuați și încărcați datele cu Pandas:

Rezultatul ar trebui să fie următorul:

Cu acest set de date, puteți instrui un model pentru a prezice sentimentul unei propoziții.

O modalitate prin care puteți face acest lucru este să numărați frecvența fiecărui cuvânt din fiecare propoziție și să legați acest număr la setul complet de cuvinte din setul de date. Aș începe prin a lua datele și a crea un vocabular cu toate cuvintele din toate propozițiile. Colecția de texte se numește corpus în PLN.

Vocabularul în acest caz este o listă de cuvinte care au apărut în textul nostru în care fiecare cuvânt are propriul index. Acest lucru vă permite să creați un vector pentru o propoziție. Apoi ați lua propoziția pe care doriți să o vectorizați și ați număra apariția ei în vocabular. Vectorul rezultat va fi vocabularul și un număr pentru fiecare cuvânt din vocabular.

Vectorul rezultat se mai numește și vector caracteristică. Într-un vector de caracteristici, fiecare dimensiune poate fi o caracteristică numerică sau categorică, cum ar fi înălțimea unei clădiri, prețul unui stoc sau, în cazul nostru, numărul unui cuvânt dintr-un vocabular. Acești vectori de caracteristici sunt o piesă crucială în știința datelor și învățarea automată, deoarece modelul pe care doriți să-l instruiți depinde de ei.

Vom ilustra acest lucru. Imaginați-vă că aveți următoarele două propoziții:

Puteți utiliza apoi CountVectorizer furnizat de biblioteca scikit-learn pentru a vectoriza propozițiile.

Luați cuvintele din fiecare propoziție și creați un vocabular cu toate cuvintele unice din propoziții. Acest vocabular poate fi folosit pentru a crea un vector al caracteristicilor numărului de cuvinte:

Acest vocabular servește și ca index pentru fiecare cuvânt. Acum, puteți lua fiecare propoziție și obține cuvintele care apar în conformitate cu vocabularul de mai sus. Vocabularul este format din cele cinci cuvinte din propozițiile noastre, fiecare reprezentând un cuvânt din vocabular. Când luați cele două propoziții de mai sus și le transformați cu CountVectorizer, veți obține un vector care reprezintă numărul fiecărui cuvânt din propoziție:

Acum, puteți vedea vectorii de caracteristici rezultați pentru fiecare propoziție pe baza vocabularului de mai sus. De exemplu, dacă vă uitați la primul element, puteți vedea că ambii vectori au un 1. Acest lucru înseamnă că ambele propoziții au o apariție a lui Ioan, care este primul în vocabular.

Acesta este considerat un model Bag of Words, care este un mod comun în PLN de a crea vectori din text. Fiecare document este reprezentat ca un vector. Acum puteți utiliza acești vectori ca vectori de caracteristici pentru un model de învățare automată. Acest lucru ne aduce la următoarea noastră parte, definind un model de bază.

Definirea unui model de bază

Când lucrați cu învățarea automată, un pas important este definirea unui model de bază. De obicei, acest lucru implică un model simplu, care este apoi utilizat ca o comparație cu modelele mai avansate pe care doriți să le testați. În acest caz, veți utiliza modelul de bază pentru al compara cu metode mai avansate care includ rețele neuronale (profunde).

În primul rând, veți împărți datele într-un set de instruire și teste care vă vor permite să evaluați precizia și să vedeți dacă modelul dvs. generalizează bine. Aceasta înseamnă dacă modelul poate funcționa bine cu date pe care nu le-ați văzut până acum. Acesta este un mod de a vedea dacă modelul se potrivește excesiv.

Suprapunerea este atunci când un model se antrenează prea bine asupra datelor de antrenament. Doriți să evitați suprasolicitarea, deoarece acest lucru ar însemna că modelul a memorat în cea mai mare parte doar datele de antrenament. Acest lucru ar explica o precizie ridicată cu datele de antrenament, dar o precizie redusă în datele de testare.

Începem prin a lua setul de date Yelp pe care îl extragem din setul nostru de date concatenat. De acolo, luăm frazele și etichetele. Valorile „.values” returnează o matrice NumPy în locul unui obiect pandas, care în acest context este mai ușor de citit:

Aici vom folosi din nou modelul Bag of Words de mai sus pentru a vectoriza propozițiile. Puteți utiliza CountVectorizer din nou pentru această sarcină. Deoarece este posibil să nu aveți datele de test disponibile în timpul antrenamentului, puteți construi vocabularul folosind doar datele de antrenament. Folosind acest vocabular, puteți crea vectori de caracteristici pentru fiecare propoziție din setul de formare și testare:

Rezultat

Puteți vedea că vectorii de caracteristici rezultați au 750 de probe, care este numărul de probe de antrenament pe care le avem după divizare pentru setul de antrenament. Fiecare eșantion are 1714 dimensiuni, care este dimensiunea vocabularului. De asemenea, se poate observa că obținem o matrice rară.

Acesta este un tip de date care este optimizat pentru tablouri cu doar câteva elemente diferite de zero, care ține doar evidența elementelor diferite de zero, reducând încărcarea memoriei.

CountVectorizer efectuează tokenizarea care separă propozițiile într-un set de jetoane așa cum s-a văzut mai devreme în vocabular. În plus, elimină punctuația și caracterele speciale și poate aplica alte preprocesări fiecărui cuvânt. Dacă doriți, puteți utiliza un tokenizer personalizat din biblioteca NLTK cu CountVectorizer sau puteți utiliza orice număr de personalizări pentru a îmbunătăți performanța modelului dvs.

Modelul de clasificare pe care îl vom folosi este regresia logistică, care este un model liniar simplu, dar puternic. Este o formă de regresie între 0 și 1 bazată pe vectorul caracteristicilor de intrare.

Prin specificarea unei valori limită (implicit, 0,5), modelul de regresie este utilizat pentru clasificare.

Puteți vedea că regresia logistică a atins un impresionant 78,8%, dar să vedem cum funcționează acest model în celelalte seturi de date pe care le avem. În acest script, efectuăm și evaluăm întregul proces pentru fiecare set de date pe care îl avem:

Rezultat

Grozav! Puteți vedea că acest model destul de simplu obține o precizie destul de bună. Ar fi interesant să vedem dacă putem depăși acest model. În partea următoare, vom face cunoștință cu rețelele neuronale (profunde) și cum să le aplicăm clasificării textului.