înțelegerea Bayes naiv și aplicațiile sale în clasificarea textului (Partea I)

author
4 minutes, 42 seconds Read

Clasificarea textului cu Bayes naiv

pentru a înțelege cum efectuați clasificarea textului folosind algoritmul Bayes naiv, trebuie să definim mai întâi setul de date pe care îl vom folosi și îl vom importa.

setul de date pe care îl vom folosi este setul de date 20 newsgroups (link de descărcare). Setul de date cuprinde aproximativ 18.000 de postări ale grupurilor de știri pe 20 de subiecte împărțite în două subseturi: unul pentru instruire (sau dezvoltare) și celălalt pentru testare (sau pentru evaluarea performanței).

împărțirea dintre tren și setul de testare se bazează pe mesajele postate înainte și după o anumită dată. Alternativ, se poate descărca și extrage fișierele din Scikit-aflați folosind:

from sklearn.datasets import fetch_20newsgroups

în acest tutorial, ne vom concentra pe cinci categorii în variabila noastră țintă, și anume alt.atheism, soc.religion.christian, talks.politics.misc, comp.graphics, și sci.med, pe care le specificăm în tren și seturi de testare așa cum se arată mai jos:

categories = news_train = fetch_20newsgroups(subset='train', categories=categories, shuffle=True)
news_test = fetch_20newsgroups(subset='test', categories=categories, shuffle=True)

pentru a accesa numele țintă ale datelor noastre de antrenament, le putem imprima într-o celulă a unui notebook Jupyter până la print(news_train). În mod similar, putem vizualiza conținutul datelor de formare de print(news_train) — care, în esență, este un dicționar de texte.

pregătirea datelor& modelarea

acum trebuie să acoperim câteva concepte importante în procesul de clasificare a textului. Vom folosi o clasă specială de la sklearn.feature_extraction.text numită CountVectorizer. Deci ideea este că, având în vedere că avem un șir de text, putem atribui numere unice fiecăruia dintre cuvintele din text.

după atribuirea numerelor unice, numărăm apariția acestor numere. Acest concept de atribuire a numerelor unice fiecăruia dintre cuvintele dintr-un text se numește tokenizare. Să aruncăm o privire la un exemplu:

Example Text: The boy in green shirt is sitting on the chair.Assigning unique number to each word gives:
{'the': 9, 'boy': 0, 'in': 4, 'green': 3, 'shirt': 7, 'is': 5, 'sitting': 8, 'on': 6, 'chair': 2}

deci, caracteristicile din Dicționarul de vocabular sunt așa cum se arată mai jos:


putem implementa acest lucru în Scikit-aflați cu fragmentul de cod de mai jos:

from sklearn.feature_extraction.text import CountVectorizer
text =
vector = CountVectorizer()
vector.fit(text)#learn a vocabulary dictionary of all tokens in the raw documents
print("Print Vocabulary: "+str(vector.vocabulary_)+'\n\n')vector.get_feature_names()
print("Feature names:"+str(vector.get_feature_names())+'\n\n')counts = vector.transform(text)
print("The shape of count is: "+str(counts.shape)+'\n\n')
#Only 1 sample space and it has 8 features
print("Printing count: "+'\n'+str(counts.toarray()))

rețineți, totuși, că, pentru a utiliza CountVectorizer, trebuie mai întâi să importăm clasa, să creăm o instanță a clasei pe care o numim vector și să apelăm metoda fit pentru a învăța vocabularul din documentul brut. Metoda transform numără aparițiile fiecărui cuvânt: practic, în termeni ML, spunem „codarea documentelor”. Rezultatele fragmentului este dicționarul de vocabular, nume de caracteristici, și forma și numărul de caracteristici.

pare promițător. Cu toate acestea, un lucru de reținut că s-ar putea să vă fi dat seama este că cuvinte precum „the” tind să apară adesea în aproape toate documentele text. Ca atare, numărul cuvântului” the ” nu înseamnă neapărat că este important în clasificare.

există modalități de a face acest lucru:

  1. eliminarea a ceea ce numim cuvinte de oprire (cuvinte care apar frecvent în limba engleză, cum ar fi articole, prepoziții etc.) și/sau
  2. introducerea unui concept numit frecvență inversă a termenului (TF-IDF). Pe scurt, TF-IDF numără mai întâi de câte ori apare un cuvânt dat într-un document și apoi dă o greutate cuvântului, ceea ce delimitează importanța acestuia în clasificare. Deci, să vedem cum se face în Python:
from sklearn.feature_extraction.text import TfidfTransformer
vectorizer = TfidfTransformer()
vectorizer.fit(counts)
print('Learning Frequency of all features:'+str(vectorizer.idf_)+'\n\n')
freq = vectorizer.transform(counts)
print('Transforming the matrix based on the learnt frequencies or weight: \n\n'+str(freq.toarray()))

din nou, importăm TfidfTransformer, creăm o instanță a clasei și apelăm metoda fit — trecând ca argument matricea numărului returnat de CountVectorizer în blocul anterior—și, în final, folosim metoda transform pentru a atribui greutăți relevante acestor caracteristici, așa cum este tipărit mai jos:

acum, că avem o înțelegere fermă a CountVectorizer și TF-IDF, putem repeta aceiași pași pentru setul nostru de date 20 News group.

from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer()
X_train_tf = count_vect.fit_transform(news_train.data)from sklearn.feature_extraction.text import TfidfTransformer
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_tf)

acum că transformarea respectivă și atribuirea greutăților au fost făcute, acum este timpul să construim Modelul Bayes naiv :).

facem acest lucru importând MultiNomialNB din sklearn.naive_bayes pentru a potrivi modelul la setul de instruire:

from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB().fit(X_train_tfidf, news_train.target)

ne putem crea propriile propoziții pentru a testa predicțiile Clasificatorului:

docs_new = 
X_new_counts = count_vect.transform(docs_new)
X_new_tfidf = tfidf_transformer.transform(X_new_counts)
predicted = clf.predict(X_new_tfidf)

după cum putem vedea, funcționează foarte bine, clasificând documentele în docs_new în țintele lor respective.

Similar Posts

Lasă un răspuns

Adresa ta de email nu va fi publicată.