Opracowanie naiwnego klasyfikatora tekstu Bayesa w JAVA PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Opracowanie naiwnego klasyfikatora tekstu Bayesa w JAVA

W poprzednich artykułach omówiliśmy podstawy teoretyczne Naiwny klasyfikator tekstu Bayesa i znaczenie używania Techniki selekcji cech w klasyfikacji tekstu. W tym artykule zamierzamy zebrać wszystko razem i zbudować prostą implementację algorytmu klasyfikacji tekstu Naive Bayes w JAVA. Kod klasyfikatora jest open source (na licencji GPL v3) i możesz go pobrać z Github.

Aktualizacja: Platforma uczenia maszynowego Datumbox jest teraz open-source i bezpłatna pobieranie. Sprawdź pakiet com.datumbox.framework.machinelearning.classification, aby zobaczyć implementację klasyfikatora Naive Bayes w Javie.

Naiwna implementacja Java Bayes

Kod jest napisany w języku JAVA i można go pobrać bezpośrednio z Github. Jest na licencji GPLv3, więc możesz go swobodnie używać, modyfikować i rozpowszechniać swobodnie.

Klasyfikator tekstu implementuje Wielomianowy Naive Bayes model wraz z Wybór funkcji Chisquare algorytm. Wszystkie teoretyczne szczegóły dotyczące działania obu technik zostały omówione w poprzednich artykułach, a szczegółowe komentarze javadoc można znaleźć w kodzie źródłowym opisującym implementację. Dlatego w tym segmencie skupię się na ogólnym opisie architektury klasyfikatora.

1. Klasa NaiveBayes

To jest główna część klasyfikatora tekstu. Implementuje metody, takie jak train () i predykcja (), które są odpowiedzialne za szkolenie klasyfikatora i używanie go do prognoz. Należy zauważyć, że ta klasa jest również odpowiedzialna za wywołanie odpowiednich metod zewnętrznych w celu wstępnego przetworzenia i tokenizacji dokumentu przed uczeniem / prognozowaniem.

2. Obiekt NaiveBayesKnowledgeBase

Efektem szkolenia jest obiekt NaiveBayesKnowledgeBase, który przechowuje wszystkie niezbędne informacje i prawdopodobieństwa używane przez klasyfikator Naive Bayes.

3. Obiekt dokumentu

Zarówno teksty szkoleniowe, jak i teksty prognoz we wdrożeniu są przechowywane wewnętrznie jako obiekty dokumentów. Obiekt dokumentu przechowuje wszystkie tokeny (słowa) dokumentu, ich statystyki i docelową klasyfikację dokumentu.

4. Obiekt FeatureStats

Obiekt FeatureStats przechowuje kilka statystyk, które są generowane podczas fazy wyodrębniania funkcji. Takie statystyki to łączne liczenia cech i klas (na podstawie których szacowane są łączne prawdopodobieństwa i prawdopodobieństwa), liczby klas (z których oceniane są wcześniejsze wartości, jeśli nie podano ich jako danych wejściowych) oraz łączna liczba obserwacji wykorzystanych do szkolenia.

5. Klasa FeatureExtraction

Jest to klasa odpowiedzialna za wyodrębnianie cech. Należy zauważyć, że ponieważ ta klasa oblicza wewnętrznie kilka statystyk, które są faktycznie wymagane przez algorytm klasyfikacji na późniejszym etapie, wszystkie te statystyki są buforowane i zwracane w obiekcie FeatureStats, aby uniknąć ich ponownego obliczania.

6. Klasa TextTokenizer

To jest prosty text tokenization class, odpowiedzialna za wstępne przetwarzanie, czyszczenie i tokenizację oryginalnych tekstów oraz konwertowanie ich na obiekty Document.

Korzystanie z klasy NaiveBayes JAVA

W klasie NaiveBayesExample można znaleźć przykłady użycia klasy NaiveBayes. Celem przykładowego kodu jest przedstawienie przykładu, który uczy prostego klasyfikatora Bayesa naiwnego w celu wykrycia języka tekstu. Aby wytrenować klasyfikator, najpierw podajemy ścieżki do treningowych zestawów danych w HashMap, a następnie ładujemy ich zawartość.

   //map of dataset files
   Map<String, URL> trainingFiles = new HashMap<>();
   trainingFiles.put("English", NaiveBayesExample.class.getResource("/datasets/training.language.en.txt"));
   trainingFiles.put("French", NaiveBayesExample.class.getResource("/datasets/training.language.fr.txt"));
   trainingFiles.put("German", NaiveBayesExample.class.getResource("/datasets/training.language.de.txt"));

   //loading examples in memory
   Map<String, String[]> trainingExamples = new HashMap<>();
   for(Map.Entry<String, URL> entry : trainingFiles.entrySet()) {
      trainingExamples.put(entry.getKey(), readLines(entry.getValue()));
   }

Klasyfikator NaiveBayes jest uczony przez przekazanie do niego danych. Po zakończeniu szkolenia obiekt NaiveBayesKnowledgeBase jest przechowywany do późniejszego wykorzystania.

   //train classifier
   NaiveBayes nb = new NaiveBayes();
   nb.setChisquareCriticalValue(6.63); //0.01 pvalue
   nb.train(trainingExamples);
      
   //get trained classifier
   NaiveBayesKnowledgeBase knowledgeBase = nb.getKnowledgeBase();

Wreszcie, aby użyć klasyfikatora i przewidzieć klasy nowych przykładów, wszystko, co musisz zrobić, to zainicjować nowy klasyfikator, przekazując obiekt NaiveBayesKnowledgeBase, który zdobyłeś wcześniej podczas szkolenia. Następnie, wywołując po prostu metodę Predict (), otrzymasz przewidywaną klasę dokumentu.

   //Test classifier
   nb = new NaiveBayes(knowledgeBase);
   String exampleEn = "I am English";
   String outputEn = nb.predict(exampleEn);
   System.out.format("The sentense "%s" was classified as "%s".%n", exampleEn, outputEn);   

Niezbędne rozszerzenia

Konkretnej implementacji JAVA nie należy traktować jako kompletnego, gotowego do użycia rozwiązania dla wyrafinowanych problemów z klasyfikacją tekstu. Oto kilka ważnych rozszerzeń, które można zrobić:

1. Wyodrębnianie słów kluczowych:

Chociaż użycie pojedynczych słów kluczowych może wystarczyć w przypadku prostych problemów, takich jak wykrywanie języka, inne, bardziej skomplikowane problemy wymagają ekstrakcji n-gramów. W ten sposób można albo zaimplementować bardziej wyrafinowany algorytm ekstrakcji tekstu, aktualizując metodę TextTokenizer.extractKeywords () lub użyć metody Datumbox API wyodrębniania słów kluczowych funkcja, aby uzyskać wszystkie n-gramów (kombinacje słów kluczowych) dokumentu.

2. Wstępne przetwarzanie tekstu:

Przed użyciem klasyfikatora zwykle konieczne jest wstępne przetworzenie dokumentu w celu usunięcia niepotrzebnych znaków / części. Mimo że obecna implementacja wykonuje ograniczone przetwarzanie wstępne przy użyciu metody TextTokenizer.preprocess (), w przypadku analizowania stron HTML sprawy stają się trudniejsze. Można po prostu wyciąć znaczniki HTML i zachować tylko zwykły tekst dokumentu lub skorzystać z bardziej wyrafinowanych technik uczenia maszynowego, które wykrywają główny tekst strony i usuwają zawartość stopki, nagłówków, menu itp. Na później mogą korzystać z Datumbox API wyodrębniania tekstu funkcja.

3. Dodatkowe modele Naive Bayes:

Obecny klasyfikator implementuje wielomianowy klasyfikator Bayesa naiwny, niemniej jednak, jak omówiliśmy w poprzednim artykule na temat Analiza sentymentów, różne problemy klasyfikacyjne wymagają różnych modeli. W niektórych przypadkach bardziej odpowiednia byłaby zbinaryzowana wersja algorytmu, podczas gdy w innych model Bernoulliego zapewni znacznie lepsze wyniki. Użyj tej implementacji jako punktu wyjścia i postępuj zgodnie z instrukcjami Naiwny samouczek Bayesa aby rozwinąć model.

4. Dodatkowe metody wyboru funkcji:

Ta implementacja wykorzystuje algorytm wyboru cech Chisquare do wybrania najbardziej odpowiednich cech do klasyfikacji. Jak widzieliśmy w poprzednim artykule, rozszerzenie Wybór funkcji Chisquare Metoda jest dobrą techniką, która opiera się na statystyce w celu wybrania odpowiednich cech, niemniej jednak daje wyższe wyniki rzadkim cechom, które pojawiają się tylko w jednej z kategorii. Ulepszenia można wprowadzić, usuwając hałaśliwe / rzadkie funkcje przed przejściem do wyboru funkcji lub wdrażając dodatkowe metody, takie jak wzajemne informacje, które omówiliśmy we wspomnianym artykule.

5. Optymalizacja wydajności:

W konkretnej implementacji ważne było, aby poprawić czytelność kodu, a nie wykonywać mikro-optymalizacje kodu. Pomimo faktu, że takie optymalizacje sprawiają, że kod jest brzydszy i trudniejszy do odczytania / utrzymania, są one często konieczne, ponieważ wiele pętli w tym algorytmie jest wykonywanych miliony razy podczas uczenia i testowania. Ta implementacja może być świetnym punktem wyjścia do tworzenia własnej, dostrojonej wersji.

Prawie gotowe… Uwagi końcowe!

Słyszałem, że jest dobry w kodowaniuAby dobrze zrozumieć, jak działa ta implementacja, zdecydowanie zalecamy przeczytanie dwóch poprzednich artykułów na temat Naiwny klasyfikator Bayesa i Wybór funkcji. Otrzymasz wgląd w teoretyczne podstawy metod i sprawi, że części algorytmu / kodu będą bardziej przejrzyste.

Powinniśmy zauważyć, że Naive Bayes, mimo że jest łatwy, szybki i przez większość czasu „dość dokładny”, jest również „naiwny”, ponieważ zakłada warunkową niezależność funkcji. Ponieważ to założenie prawie nigdy nie jest spełniane w problemach z klasyfikacją tekstu, Naive Bayes prawie nigdy nie jest najlepiej działającym klasyfikatorem. W Interfejs API Datumbox, niektóre rozszerzenia standardowego klasyfikatora Bayesa naiwnego są używane tylko w przypadku prostych problemów, takich jak wykrywanie języka. W przypadku bardziej skomplikowanych problemów z klasyfikacją tekstu bardziej zaawansowane techniki, takie jak Klasyfikator Max Entropy są konieczne.

Jeśli korzystasz z realizacji w ciekawym projekcie Napisz do nas a my przedstawimy Twój projekt na naszym blogu. Jeśli artykuł Ci się spodoba, poświęć chwilę i udostępnij go na Twitterze lub Facebooku. 🙂

Znak czasu:

Więcej z Skrzynka odniesienia