Klasyfikacja tekstu nieustrukturyzowanego

12

Zamierzam sklasyfikować nieustrukturyzowane dokumenty tekstowe, a mianowicie strony internetowe o nieznanej strukturze. Liczba klas, do których klasyfikuję, jest ograniczona (w tym momencie uważam, że nie ma więcej niż trzy). Czy ktoś ma sugestie dotyczące tego, jak mogę zacząć?

Czy możliwe jest podejście „worek słów”? Później mógłbym dodać kolejny etap klasyfikacji w oparciu o strukturę dokumentu (być może drzewa decyzyjne).

Jestem trochę zaznajomiony z Mahout i Hadoop, więc wolę rozwiązania oparte na Javie. W razie potrzeby mogę przejść do silnika Scala i / lub Spark (biblioteka ML).

Grzegorz E.
źródło

Odpowiedzi:

14

Rozwiążmy to od podstaw. Klasyfikacja (znana również jako kategoryzacja) jest przykładem nauki nadzorowanej . W nadzorowanym nauczaniu masz:

  • model - coś, co aproksymuje wewnętrzną strukturę twoich danych, umożliwiając ci uzasadnienie i dokonanie przydatnych prognoz (np. przewidywanie klasy obiektu); normalnie model ma parametry, których chcesz się „nauczyć”
  • szkolenie i testowanie zestawów danych - zestawy obiektów używanych do szkolenia modelu (znajdowanie dobrych wartości parametrów) i dalszej oceny
  • algorytmy szkoleniowe i klasyfikacyjne - po pierwsze opisuje sposób uczenia się modelu z zestawu danych szkoleniowych, po drugie pokazuje, jak wyprowadzić klasę nowego obiektu na podstawie wyuczonego modelu

Teraz weźmy prosty przypadek klasyfikacji spamu. Twój zestaw danych szkoleniowych to zbiór e-maili + odpowiednich etykiet - „spam” lub „nie spam”. Testowany zestaw danych ma tę samą strukturę, ale składa się z niektórych niezależnych wiadomości e-mail (zwykle po prostu dzieli swój zbiór danych i tworzy, powiedzmy, 9/10 z nich do wykorzystania na szkolenie, a 1/10 na testy). Jednym ze sposobów modelowania wiadomości e-mail jest reprezentowanie każdego z nich jako zestawu (paczki) słów. Jeżeli założymy, że słowa są od siebie niezależne, możemy użyć klasyfikatora Naive Bayesa , to znaczy obliczyć wcześniejsze prawdopodobieństwa dla każdego słowa i każdej klasy (algorytm szkoleniowy), a następnie zastosować twierdzenie Bayesa, aby znaleźć prawdopodobieństwo prawdopodobieństwa przynależności nowego dokumentu konkretna klasa.

Zasadniczo mamy:

raw model + training set + training algorithm -> trained model
trained model + classification algorithm + new object -> object label

Zauważ teraz, że przedstawiliśmy nasze przedmioty (dokumenty) jako worek słów. Ale czy to jedyny sposób? W rzeczywistości możemy wydobyć znacznie więcej z surowego tekstu. Na przykład zamiast słów możemy używać ich rdzeni lub lematów , wyrzucać hałaśliwe słowa stop , dodawać tagi POS słów, wyodrębniać nazwane jednostki, a nawet eksplorować strukturę HTML dokumentu. W rzeczywistości bardziej ogólna reprezentacja dokumentu (i ogólnie dowolnego obiektu) jest wektorem cech . Np. Dla tekstu:

actor, analogue, bad, burn, ..., NOUN, VERB, ADJ, ..., in_bold, ... | label
    0,        0,   1,    1, ...,    5,    7,   2, ...,       2, ... | not spam
    0,        1,   0,    0, ...,    3,   12,  10, ...,       0, ... | spam

Tutaj pierwszy wiersz zawiera listę możliwych funkcji, a kolejne wiersze pokazują, ile razy ta funkcja występuje w dokumencie. Np. W pierwszym dokumencie nie ma słowa „aktor”, 1 słowa „palić”, 5 rzeczowników, 2 przymiotników i 2 pogrubionych tekstów. Ostatnia kolumna odpowiada wynikowej etykiecie klasy.

Korzystając z wektora cech, możesz uwzględnić dowolne właściwości swoich tekstów. Jednak znalezienie dobrego zestawu funkcji może zająć trochę czasu.

A co z modelem i algorytmami? Czy jesteśmy związani z Naive Bayes. Ani trochę. regresja logistyczna , SVM , drzewa decyzyjne - żeby wymienić tylko kilka popularnych klasyfikatorów. (Zauważ, że mówimy „klasyfikator” w większości przypadków mamy na myśli model + odpowiednie algorytmy szkolenia i klasyfikacji).

Jeśli chodzi o implementację, możesz podzielić zadanie na 2 części:

  1. Wyodrębnianie funkcji - przekształcanie nieprzetworzonych tekstów na wektory cech.
  2. Klasyfikacja obiektów - budowanie i stosowanie modelu.

Pierwszy punkt jest dobrze opracowany w wielu bibliotekach NLP . Drugi dotyczy uczenia maszynowego, więc w zależności od zestawu danych możesz użyć Weka lub MLlib .

przyjaciel
źródło
Oryginalny plakat użył słowa „klasyfikuj”, ale „klaster” jest dokładniejszym opisem jego problemu, ponieważ nie ma a priori definicji kategorii. Dlatego niekoniecznie jest to nadzorowany problem uczenia się.
MrMeritology
@MrMeritology: hmm, z kontekstu powiedziałbym, że autor nie jest pewien konkretnych klas, których będzie używał, ale nadal chce klasyfikacji, a nie grupowania. W każdym razie jest jedyną osobą, która zna prawdę :)
zaprzyjaźnia się
Może w tym momencie nie byłem jasny. Kategorie zostaną wybrane w formie porad, więc jest to raczej kwestia klasyfikacji niż problemu grupowania. Pomysł stworzenia złożonego wektora cech wydaje się dość rozsądny - szczególnie, że istnieją pewne szczególne tagi, które najprawdopodobniej szybko sklasyfikują niektóre próbki. Nie jestem pewien, czy SVM będzie pasować do problemu, ponieważ przewiduję wysokie nieliniowości, ale drzewa decyzyjne i Bayesa wydają się mieć zastosowanie. Zaczynam też myśleć o zastosowaniu algorytmu hybrydowego (drzew decyzyjnych opartych na SVM).
Grzegorz E.
@GrzegorzE. - Jeśli Twoje kategorie zostały wcześniej określone, proszę wymienić te trzy kategorie w swoim pytaniu. Moim zdaniem jesteś zbyt skoncentrowany na algorytmach ML, a za mało na naturze twojego problemu i naturze twoich danych. Na przykład przewidujesz „nieliniowe” funkcje witryn o nieznanej strukturze. Dlaczego? Ponadto mieszasz tagi z tekstem strony internetowej z tym, kto wie, co jeszcze, i mają one inne znaczenie semantyczne.
MrMeritology
@GrzegorzE. - Zdecydowanie sugeruję, że twoją metodą klasyfikacji powinien być przede wszystkim charakter twoich kategorii a priori i charakter danych. Istnieje nieskończona liczba sposobów kategoryzacji dowolnych stron internetowych na 3 kategorie. Każdy sposób kategoryzacji sugeruje istotne cechy w danych lub wzorcach istotnych. Nic nie zastąpi ręcznej analizy poszczególnych elementów danych (stron internetowych) i ich kontekstu.
MrMeritology
5

Modelowanie tematów byłoby bardzo odpowiednią metodą dla twojego problemu. Modele tematyczne są formą uczenia się / odkrywania bez nadzoru, w której określona (lub odkryta) liczba tematów jest zdefiniowana przez listę słów, które mają wysokie prawdopodobieństwo pojawienia się razem. W osobnym kroku możesz oznaczyć każdy temat przy użyciu ekspertów merytorycznych, ale do twoich celów nie jest to konieczne, ponieważ jesteś zainteresowany jedynie dotarciem do trzech klastrów.

Każdy dokument traktujesz jak worek słów, a proces wstępnego usuwania słów stopowych itp. Za pomocą najprostszych metod wstępnie określasz liczbę tematów. W twoim przypadku możesz albo podać „3”, czyli ustalony limit kategorii, albo wybrać większą liczbę tematów (od 10 do 100), a następnie w osobnym kroku utworzyć trzy klastry dla dokumentów ze wspólnym naciskiem na tematy. Można zastosować środki typu K lub inne metody grupowania. (Polecam to drugie podejście)

Nie musisz kodować oprogramowania do modelowania tematów od zera. Oto strona internetowa z wieloma zasobami, w tym bibliotekami / pakietami oprogramowania .

Żadne nie są w Javie, ale istnieją sposoby na uruchomienie C ++ i Pythona w Javie.

MrMeritology
źródło
4

Oto kilka naprawdę świetnych pakietów oprogramowania typu open source do klasyfikacji tekstu, które powinny pomóc w rozpoczęciu pracy:

  • MALLET to licencjonowany przez CPL zestaw narzędzi do uczenia maszynowego oparty na Javie zbudowany przez UMass do pracy z danymi tekstowymi. Obejmuje implementacje kilku algorytmów klasyfikacji (np. Naiwne Bayesa, maksymalna entropia, drzewa decyzyjne).
  • Stanford klasyfikator z Stanford NLP Group jest wdrożenie licencji GPL Java klasyfikatora maksimum entropii zaprojektowany do pracy z danymi tekstowymi.
Charlie Greenbacker
źródło