Există o mulțime de aplicații pentru învățarea automată și una dintre acestea este procesarea limbajului natural sau NLP.

NLP gestionează lucruri precum răspunsuri text, identificând sensul cuvintelor în context și purtând conversații cu noi. Ajută computerele să înțeleagă limbajul uman, astfel încât să putem comunica în diferite moduri.

De la roboții de chat până la aplicațiile de locuri de muncă până la sortarea e-mailurilor dvs. în diferite foldere, NLP este folosit peste tot în jurul nostru.

În esență, procesarea limbajului natural este un amestec de informatică și lingvistică. Lingvistica ne oferă regulile de utilizat pentru a ne antrena modelele de învățare automată și pentru a obține rezultatele pe care le căutăm.

Există o mulțime de motive pentru care procesarea limbajului natural a devenit o parte imensă a învățării automate. Ajută mașinile să detecteze sentimentul din feedback-ul unui client, poate ajuta la sortarea biletelor de asistență pentru orice proiecte la care lucrați și poate citi și înțelege textul în mod consecvent.

Și din moment ce funcționează în afara unui set de reguli lingvistice, nu are aceleași părtiniri ca și un om.

Deoarece NLP este o arie de studiu atât de extinsă, există o serie de instrumente pe care le puteți utiliza pentru a analiza datele în scopurile dvs. specifice.

Există abordarea bazată pe reguli în care configurați o mulțime de instrucțiuni if-then pentru a gestiona modul în care textul este interpretat. De obicei, un lingvist va fi responsabil pentru această sarcină și ceea ce produc este foarte ușor de înțeles pentru oameni.

Acest lucru ar putea fi bun pentru început, dar devine foarte complex pe măsură ce începeți să lucrați cu seturi de date mari.

O altă abordare este de a utiliza învățarea automată în cazul în care nu este nevoie să definiți reguli. Acest lucru este extraordinar atunci când încercați să analizați cantități mari de date rapid și precis.

Alegerea algoritmului potrivit, astfel încât abordarea de învățare automată funcționează, este importantă din punct de vedere al eficienței și preciziei. Există algoritmi comuni precum Naives Bayes și suport pentru mașini vectoriale. Apoi, există algoritmi mai specifici, cum ar fi Google BERT.

Ce este BERT?

BERT este o bibliotecă open-source creată în 2018 la Google. Este o tehnică nouă pentru PNL și necesită o abordare complet diferită a modelelor de antrenament decât orice altă tehnică.

BERT este un acronim pentru reprezentările codificatorului bidirecțional din transformatoare. Asta înseamnă că spre deosebire de majoritatea tehnicilor care analizează propozițiile de la stânga la dreapta sau de la dreapta la stânga, BERT merge în ambele direcții folosind Codificator transformator. Scopul său este de a genera un model de limbă.

Acest lucru îi oferă o precizie și o performanță incredibile pe seturi de date mai mici, ceea ce rezolvă o problemă imensă în procesarea limbajului natural.

Deși există o cantitate imensă de date bazate pe text disponibile, foarte puține dintre acestea au fost etichetate pentru a fi utilizate pentru instruirea unui model de învățare automată. Deoarece majoritatea abordărilor problemelor NLP profită de învățarea profundă, aveți nevoie de cantități mari de date pentru a vă antrena.

Vedeți cu adevărat îmbunătățirile uriașe ale unui model atunci când acesta a fost instruit cu milioane de puncte de date. Pentru a ajuta la rezolvarea acestei probleme de a nu avea suficiente date etichetate, cercetătorii au venit cu modalități de a instrui modele de reprezentare a limbajului cu scop general prin pregătire prealabilă folosind text de pe internet.

Aceste modele de reprezentare pre-instruite pot fi apoi reglate fin pentru a lucra pe seturi de date specifice care sunt mai mici decât cele utilizate în mod obișnuit în învățarea profundă. Aceste seturi de date mai mici pot fi pentru probleme precum analiza sentimentului sau detectarea spamului. Acesta este modul în care sunt abordate majoritatea problemelor NLP, deoarece oferă rezultate mai precise decât începând cu setul de date mai mic.

De aceea BERT este o descoperire atât de mare. Oferă o modalitate de a vă pregăti mai precis modelele cu mai puține date. Abordarea bidirecțională pe care o folosește înseamnă că obține mai mult context pentru un cuvânt decât dacă ar fi antrenat într-o singură direcție. Cu acest context suplimentar, este capabil să profite de o altă tehnică numită LM mascat.

Cum este diferit de alți algoritmi de învățare automată

LM mascat maschează aleatoriu 15% din cuvintele dintr-o propoziție cu un [MASK] jeton și apoi încearcă să le prezică pe baza cuvintelor care îl înconjoară pe cel mascat. Astfel BERT este capabil să privească cuvintele de la stânga la dreapta și de la dreapta la stânga.

Acest lucru este complet diferit de orice alt model de limbă existent, deoarece se uită la cuvintele dinaintea și după un cuvânt mascat în același timp. O mare parte din acuratețea BERT poate fi atribuită acestui fapt.

Pentru ca BERT să funcționeze cu setul de date, trebuie să adăugați un pic de metadate. Va trebui să existe încorporări simbolice pentru a marca începutul și sfârșitul propozițiilor. Va trebui să aveți încorporează segmentele pentru a putea distinge diferite propoziții. În cele din urmă veți avea nevoie încorporări poziționale pentru a indica poziția cuvintelor într-o propoziție.

Va arăta similar cu acesta.

[CLS] the [MASK] has blue spots [SEP] it rolls [MASK] the parking lot [SEP]

Cu metadatele adăugate la punctele dvs. de date, LM mascat este gata să funcționeze.

Odată ce a terminat predicția cuvintelor, atunci BERT profită de predicția următoarei propoziții. Aceasta privește relația dintre două propoziții. Face acest lucru pentru a înțelege mai bine contextul întregului set de date, luând o pereche de propoziții și prezicând dacă a doua propoziție este următoarea propoziție pe baza textului original.

Pentru ca predicția următoarei propoziții să funcționeze în tehnica BERT, a doua propoziție este trimisă prin Model bazat pe transformatoare.

Există patru versiuni diferite de BERT pre-instruite, în funcție de scara datelor cu care lucrați. Puteți afla mai multe despre ele aici: https://github.com/google-research/bert#bert

Dezavantajul acestei abordări este că funcția de pierdere are în vedere doar predicțiile mascate de cuvinte și nu predicțiile celorlalți. Asta înseamnă că tehnica BERT converge mai lent decât celelalte tehnici de la dreapta la stânga sau de la stânga la dreapta.

BERT poate fi aplicat oricărei probleme NLP la care vă puteți gândi, inclusiv predicția intenției, aplicațiile de răspuns la întrebări și clasificarea textului.

Exemplu de cod

Pregătirea

Acum vom trece printr-un exemplu de BERT în acțiune. Primul lucru pe care trebuie să-l faci este să clonezi repo-ul Bert.

git clone https://github.com/google-research/bert.git

Acum trebuie să descărcați fișierele model BERT preinstruite din Pagina BERT GitHub. De-a lungul restului acestui tutorial, mă voi referi la directorul acestui repo ca directorul rădăcină.

Aceste fișiere vă oferă hiper-parametrii, greutățile și alte lucruri de care aveți nevoie cu informațiile pe care Bert le-a învățat în timpul pregătirii. Voi folosi BERT-Base, model Uncased, dar veți găsi alte câteva opțiuni în diferite limbi pe pagina GitHub.

Unele motive pentru care ați alege modelul BERT-Base, Uncased sunt dacă nu aveți acces la un TPU Google, caz în care ați alege de obicei un model de bază.

Dacă credeți că carcasa textului pe care încercați să o analizați este sensibilă la majuscule (carcasa textului oferă un sens contextual real), atunci ați alege un model Cased.

Dacă carcasa nu este importantă sau dacă nu sunteți încă sigur, atunci un model Uncased ar fi o alegere validă.

Vom lucra cu unele recenzii Yelp ca set de date. Nu uitați, BERT așteaptă ca datele într-un anumit format să le folosească încorporări simbolice si altii. Va trebui să le adăugăm într-un fișier .tsv. Acest fișier va fi similar cu un .csv, dar va avea patru coloane și niciun rând de antet.

Iată cum vor arăta cele patru coloane.

  • Coloana 0: ID rând
  • Coloana 1: Etichetă rând (trebuie să fie un număr întreg)
  • Coloana 2: o coloană cu aceeași literă pentru toate rândurile (nu se obișnuiește pentru nimic, dar BERT se așteaptă)
  • Coloana 3: Textul pe care dorim să îl clasificăm

Va trebui să creați un folder numit date în directorul în care ați clonat BERT și să adăugați trei fișiere acolo: train.tsv, dev.tsv, test.tsv.

În tren.tsv și dev.tsv fișiere, vom avea cele patru coloane despre care am vorbit mai devreme. În test.tsv fișier, vom avea doar ID-ul rândului și textul pe care dorim să îl clasificăm ca coloane. Acestea vor fi fișierele de date pe care le folosim pentru a ne antrena și testa modelul.

Pregătirea datelor

Mai întâi trebuie să obținem datele cu care vom lucra. Puteți descărca recenziile Yelp pentru dvs. aici: https://course.fast.ai/datasets#nlp Va fi în secțiunea NLP și veți dori versiunea Polarity.

Motivul pentru care vom lucra cu această versiune este că datele au deja o polaritate, ceea ce înseamnă că are deja un sentiment asociat. Salvați acest fișier în directorul de date.

Acum suntem gata să începem să scriem cod. Creați un fișier nou în directorul rădăcină numit pre_processing.py și adăugați următorul cod.

import pandas as pd
# this is to extract the data from that .tgz file
import tarfile
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split

# get all of the data out of that .tgz
yelp_reviews = tarfile.open('data/yelp_review_polarity_csv.tgz')
yelp_reviews.extractall('data')
yelp_reviews.close()

# check out what the data looks like before you get started
# look at the training data set
train_df = pd.read_csv('data/yelp_review_polarity_csv/train.csv', header=None)
print(train_df.head())

# look at the test data set
test_df = pd.read_csv('data/yelp_review_polarity_csv/test.csv', header=None)
print(test_df.head())
Tutorial Google BERT NLP Machine Learning

În acest cod, am importat câteva pachete Python și am necomprimat datele pentru a vedea cum arată datele. Veți observa că valorile asociate cu recenziile sunt 1 și 2, 1 fiind o recenzie proastă și 2 fiind o recenzie bună. Trebuie să convertim aceste valori în etichete mai standard, deci 0 și 1. Puteți face acest lucru cu următorul cod.

train_df[0] = (train_df[0] == 2).astype(int)
test_df[0] = (test_df[0] == 2).astype(int)

Ori de câte ori actualizați datele, este întotdeauna important să aruncați o privire dacă lucrurile au ieșit bine. Așa că vom face asta cu următoarele comenzi.

print(train_df.head())
print(test_df.head())
1611632351 462 Tutorial Google BERT NLP Machine Learning

Când vedeți că valorile polarității dvs. s-au schimbat pentru a fi ceea ce vă așteptați. Acum că datele ar trebui să aibă 1s și 0s.

Deoarece am curățat datele inițiale, este timpul să pregătim lucrurile pentru BERT. Va trebui să ne adaptăm datele la formatele de coloane despre care am vorbit mai devreme. Să începem cu datele de antrenament.

Datele de instruire vor avea toate cele patru coloane: id rând, etichetă rând, literă unică, text pe care dorim să îl clasificăm.

BERT așteaptă două fișiere pentru instruire numite tren și dev. Vom crea acele fișiere împărțind fișierul inițial al trenului în două fișiere după ce ne-am formatat datele cu următoarele comenzi.

bert_df = pd.DataFrame({
    'id': range(len(train_df)),
    'label': train_df[0],
    'alpha': ['q']*train_df.shape[0],
    'text': train_df[1].replace(r'n', ' ', regex=True)
})

train_bert_df, dev_bert_df = train_test_split(bert_df, test_size=0.01)

Cu bert_df variabilă, am formatat datele pentru a fi ceea ce BERT așteaptă. Puteți alege orice altă literă pentru valoarea alfa dacă doriți. train_test_split metoda pe care am importat-o ​​la început se ocupă de împărțirea datelor de instruire în cele două fișiere de care avem nevoie.

Aruncați o privire la modul în care datele au fost formatate cu această comandă.

print(train_bert_df.head())

Acum trebuie să formatăm datele de testare. Acest lucru va arăta diferit de modul în care am tratat datele de instruire. BERT așteaptă doar două coloane pentru datele de testare: id rând, text pe care dorim să îl clasificăm. Nu trebuie să facem nimic altceva la datele de testare odată ce le avem în acest format și vom face asta cu următoarea comandă.

test_bert_df = pd.DataFrame({
    'id': range(len(test_df)),
    'text': test_df[1].replace(r'n', ' ', regex=True)
})

Este similar cu ceea ce am făcut cu datele de antrenament, doar fără două dintre coloane. Aruncați o privire la datele de testare nou formatate.

test_bert_df.head()

Dacă totul arată bine, puteți salva aceste variabile deoarece fișierele .tsv vor funcționa cu BERT.

train_bert_df.to_csv('data/train.tsv', sep='t', index=False, header=False)
dev_bert_df.to_csv('data/dev.tsv', sep='t', index=False, header=False)
test_bert_df.to_csv('data/test.tsv', sep='t', index=False, header=False)

Antrenarea modelului

O notă rapidă înainte de a ne antrena modelul: BERT poate consuma foarte multe resurse pe laptopuri. Poate provoca erori de memorie, deoarece nu există suficientă memorie RAM sau alt hardware nu este suficient de puternic. Ai putea încerca să faci training_batch_size mai mic, dar asta va face ca modelul de antrenament să fie foarte lent.

Adăugați un folder în directorul rădăcină numit model_output. Acolo va fi salvat modelul nostru după terminarea antrenamentului. Acum deschideți un terminal și accesați directorul rădăcină al acestui proiect. Odată ce vă aflați în directorul potrivit, rulați următoarea comandă și va începe să vă instruiți modelul.

python run_classifier.py --task_name=cola --do_train=true --do_eval=true --data_dir=./data/ --vocab_file=./uncased_L-12_H-768_A-12/vocab.txt --bert_config_file=./uncased_L-12_H-768_A-12/bert_config.json --init_checkpoint=./uncased_L-12_H768_A-12/bert_model.ckpt.index --max_seq_length=128 --train_batch_size=32 --learning_rate=2e-5 --num_train_epochs=3.0 --output_dir=./model_output --do_lower_case=False

Ar trebui să vedeți o ieșire care parcurge terminalul. Odată ce acest lucru se termină, veți avea un model antrenat, care este gata să facă predicții!

Realizarea unei predicții

Dacă aruncați o privire în model_output director, veți observa că există o grămadă de model.ckpt fișiere. Aceste fișiere au greutățile pentru modelul antrenat în diferite puncte în timpul antrenamentului, astfel încât să doriți să îl găsiți pe cel cu cel mai mare număr. Acesta va fi modelul final antrenat pe care veți dori să îl utilizați.

Acum vom fugi run_classifier.py din nou cu opțiuni ușor diferite. În special, vom schimba init_checkpoint valoare la cel mai înalt punct de control al modelului și setarea unui nou –do_predict valoare pentru adevărat. Iată comanda de care aveți nevoie pentru a rula în terminal.

python run_classifier.py --task_name=cola --do_predict=true --data_dir=./data --vocab_file=./uncased_L-12_H-768-A-12/bert_config.json --init_checkpoint=./model_output/model.ckpt-<highest checkpoint number> --max_seq_length=128 --output_dir=./model_output

Odată ce comanda este terminată de executare, ar trebui să vedeți un nou fișier numit test_results.tsv. Aceasta va avea rezultatele estimate pe baza modelului pe care l-ați antrenat!

Tocmai ați folosit BERT pentru a analiza unele date reale și, sperăm, toate acestea au avut sens.

Alte ganduri

Am simțit că este necesar să trec prin procesul de curățare a datelor aici, în cazul în care cineva nu a mai trecut prin el. Uneori, învățarea automată pare a fi magie, dar este nevoie de timp pentru a obține datele în condițiile potrivite pentru a vă antrena cu un algoritm.

BERT este încă relativ nou, deoarece tocmai a fost lansat în 2018, dar până acum s-a dovedit a fi mai precis decât modelele existente, chiar dacă este mai lent.