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

author
4 minutes, 18 seconds Read

text Classification with Naive Bayes

aby zrozumieć, jak wykonać klasyfikację tekstu przy użyciu algorytmu Naive Bayes, musimy najpierw zdefiniować zestaw danych, którego będziemy używać i zaimportować go.

zestaw danych, którego będziemy używać, to zestaw danych 20 grup dyskusyjnych (link do pobrania). Zbiór danych obejmuje około 18 000 postów grup dyskusyjnych na Tematy 20 podzielone na dwie podgrupy: jeden do szkolenia (lub rozwoju) i drugi do testowania (lub oceny wydajności).

podział między zestawem pociągu i zestawu testowego opiera się na wiadomościach wysłanych przed i po określonej dacie. Alternatywnie, można pobrać i rozpakować pliki w Scikit-learn za pomocą:

from sklearn.datasets import fetch_20newsgroups

w tym samouczku skupimy się na pięciu kategoriach w naszej zmiennej docelowej, a mianowicie alt.atheism, soc.religion.christian, talks.politics.misc, comp.graphics, i sci.med, które określamy w zestawach pociągów i testowych, jak pokazano poniżej:

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

aby uzyskać dostęp do nazw docelowych naszych danych treningowych, możemy wydrukować je w komórce Notatnika Jupyter przez print(news_train). Podobnie możemy przeglądać zawartość danych treningowych przez print(news_train) – co zasadniczo jest słownikiem tekstów.

przygotowanie danych & Modelowanie

teraz musimy omówić kilka ważnych pojęć w procesie klasyfikacji tekstu. Użyjemy specjalnej klasy z sklearn.feature_extraction.text o nazwie CountVectorizer. Chodzi o to, że biorąc pod uwagę, że mamy ciąg tekstowy, możemy przypisać unikalne liczby każdemu ze słów w tekście.

po przypisaniu unikalnych liczb liczymy ich występowanie. Ta koncepcja przypisywania unikalnych liczb każdemu ze słów w tekście nazywa się tokenizacją. Spójrzmy na przykład:

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}

tak więc funkcje w słowniku słownictwa są pokazane poniżej:


możemy to zaimplementować w Scikit-learn za pomocą poniższego fragmentu kodu:

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

zwróć jednak uwagę, że aby użyć CountVectorizer, najpierw musimy zaimportować klasę, utworzyć instancję klasy, którą nazywamy vector i wywołać metodę fit, aby nauczyć się słownictwa w dokumencie raw. Metoda transform zlicza wystąpienia każdego słowa: zasadniczo w terminach ML mówimy „kodowanie dokumentów”. Wynikiem tego fragmentu jest słownik słownictwa, nazwy funkcji oraz kształt i liczba funkcji.

wygląda obiecująco. Należy jednak pamiętać, że być może odkryłeś, że słowa takie jak „the” pojawiają się często w prawie wszystkich dokumentach tekstowych. Jako takie, liczba słowa ” the ” nie musi oznaczać, że jest ważne w klasyfikacji.

są sposoby na to:

  1. usunięcie tego, co nazywamy słowami stop (powszechnie występujące słowa w języku angielskim, takie jak artykuły, przyimki itp.) i/lub
  2. wprowadzenie pojęcia o nazwie Term-Frequency Inverse Document Frequency (TF-IDF). Podsumowując, TF-IDF najpierw zlicza liczbę pojawienia się danego słowa w dokumencie, a następnie nadaje mu wagę, co określa jego znaczenie w klasyfikacji. Zobaczmy więc, jak to się robi w Pythonie:
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()))

ponownie importujemy TfidfTransformer, tworzymy instancję klasy i wywołujemy metodę fit – przekazując jako argument tablicę zliczeń zwróconą przez CountVectorizer w poprzednim bloku-i na koniec używamy metody transform do przypisania odpowiednich wag do tych funkcji, jak pokazano poniżej:

teraz, gdy mamy solidne zrozumienie CountVectorizer i TF-IDF, możemy powtórzyć te same kroki dla naszego zestawu danych grupy 20.

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)

teraz, gdy dokonano odpowiedniej transformacji i przypisania wag, nadszedł czas, aby faktycznie zbudować naiwny Model Bayesa:).

robimy to importując MultiNomialNB z sklearn.naive_bayes aby dopasować model do zestawu treningowego:

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

możemy tworzyć własne zdania, aby przetestować przewidywania klasyfikatora:

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)

jak widzimy, sprawdza się bardzo dobrze, klasyfikując dokumenty w docs_new do ich odpowiednich celów.

Similar Posts

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.