Naive Bayes & its applications in text classification (Part I)

author
4 minutes, 32 seconds Read

Tekstclassificatie met Naive Bayes

om te begrijpen hoe tekstclassificatie wordt uitgevoerd met behulp van het Naive Bayes algoritme, moeten we eerst de dataset definiëren die we gaan gebruiken en importeren.

de dataset die we gaan gebruiken is de dataset van 20 nieuwsgroepen (download link). De dataset bestaat uit ongeveer 18.000 berichten in nieuwsgroepen over 20 onderwerpen verdeeld in twee subsets: een voor training (of ontwikkeling) en de andere voor testen (of voor prestatie-evaluatie).

de scheiding tussen de trein en de testset is gebaseerd op berichten die voor en na een specifieke datum zijn geplaatst. Als alternatief kan men downloaden en uitpakken van de bestanden in Scikit-leren met behulp van:

from sklearn.datasets import fetch_20newsgroups

In deze tutorial gaan we ons richten op vijf categorieën in onze doelvariabele, namelijk alt.atheism, soc.religion.christian, talks.politics.misc, comp.graphics, en sci.med, die we specificeren in de trein – en testsets zoals hieronder weergegeven:

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

om toegang te krijgen tot de doelnamen van onze trainingsgegevens, kunnen we deze afdrukken in een cel van een Jupyter-notebook met print(news_train). Op dezelfde manier kunnen we de inhoud van de trainingsgegevens bekijken met print(news_train) — wat in wezen een woordenboek van teksten is.

gegevensvoorbereiding & modellering

nu moeten we enkele belangrijke concepten in het tekstclassificatieproces behandelen. We gaan een speciale klasse van sklearn.feature_extraction.text gebruiken, genaamd CountVectorizer. Het idee is dat, gegeven het feit dat we een tekenreeks hebben, we unieke getallen kunnen toewijzen aan elk van de woorden in de tekst.

na het toewijzen van de unieke getallen tellen we het voorkomen van deze getallen. Dit concept van het toewijzen van unieke getallen aan elk van de woorden in een tekst wordt tokenisatie genoemd. Laten we eens een voorbeeld bekijken:

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}

dus de functies in het woordenboek van de woordenschat zijn zoals hieronder getoond:


we kunnen dit implementeren in Scikit-learn met het onderstaande codefragment:

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()))

merk echter op dat om CountVectorizer te gebruiken, we eerst de klasse moeten importeren, een instantie van de klasse moeten maken die we vector noemen, en de fit methode moeten aanroepen om de woordenschat in het raw-document te leren. De transform methode telt de exemplaren van elk woord: in principe in ML termen, zeggen we “codering documenten”. De resultaten van het fragment zijn de woordenschat woordenboek, functie namen, en vorm en het aantal functies.

dit ziet er veelbelovend uit. Echter, een ding om op te merken dat je zou kunnen hebben bedacht is dat woorden als “de” de neiging om vaak te verschijnen in bijna alle tekstdocumenten. Als zodanig betekent de telling van het woord “de” niet noodzakelijkerwijs dat het belangrijk is in de classificatie.

er zijn manieren om dit aan te pakken:

  1. het verwijderen van wat we stopwoorden noemen (veel voorkomende woorden in het Engels, zoals artikelen, voorzetsels, enz.) en/of
  2. het introduceren van een concept genaamd Term-Frequency Inverse Document Frequency (TF-IDF). Kortom, TF-IDF telt eerst het aantal keren dat een bepaald woord in een document verschijnt en geeft dan een gewicht aan het woord, dat het belang ervan in de classificatie aangeeft. Dus laten we eens kijken hoe dat gedaan wordt in 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()))

Nogmaals, we importeren TfidfTransformer, maak een instantie van de klasse, en de fit methode — die als argument de matrix van de aantallen die worden geretourneerd door CountVectorizer in het vorige blok—en tenslotte gebruiken we de transform methode voor het toewijzen van relevante gewichten van deze functies, zoals hieronder afgedrukte:

Nu hebben we een solide begrip van CountVectorizer en TF-IDF, kunnen we herhaal dezelfde stappen voor onze 20-nieuws groep dataset.

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)

nu de respectievelijke transformatie en toewijzing van gewichten is gedaan, is het nu tijd om het Naive Bayes-model daadwerkelijk te bouwen :).

We doen dit door het importeren van MultiNomialNB van sklearn.naive_bayes om de fit van het model op de training set:

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

We maken onze eigen zinnen voor het testen van de voorspellingen van de classifier:

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)

Zoals we kunnen zien presteert erg goed, het classificeren van de documenten in docs_new in hun respectieve doelstellingen.

Similar Posts

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.