Klasyfikacja tekstu na dużą skalę

18

Chcę dokonać klasyfikacji na podstawie moich danych tekstowych. Mam 300 classes200 dokumentów szkoleniowych na klasę (więc 60000 documents in total), co może skutkować bardzo wysokimi wymiarami danych (być może szukamy ponad 1 milion wymiarów ).

Chciałbym wykonać następujące kroki w przygotowaniu (aby dać ci wyobrażenie o moich wymaganiach):

  1. Konwertowanie każdego dokumentu na wektor funkcji ( tf-idflub vector space model)
  2. Feature selection( Mutual Informationnajlepiej oparte lub inne standardowe)
  3. Szkolenie klasyfikatora ( SVM, Naive Bayes, Logistic Regressionlub Random Forest)
  4. Prognozowanie niewidocznych danych na podstawie przeszkolonego modelu klasyfikatora.

Pytanie brzmi: jakich narzędzi / ram używam do obsługi danych o tak dużych wymiarach? Zdaję sobie sprawę ze zwykłych podejrzanych (R, WEKA ...), ale o ile mi wiadomo (mogę się mylić) być może żaden z nich nie poradzi sobie z tak dużymi danymi. Czy jest jakieś inne gotowe narzędzie, na które mógłbym spojrzeć?

Jeśli muszę to zrównoważyć, czy powinienem patrzeć na Apache Mahout ? Wygląda na to, że może jeszcze nie zapewniać wymaganej funkcjonalności.

Dzięki wszystkim z góry.


Aktualizacja: Rozejrzałem się po tej stronie , liście mailingowej R i ogólnie po Internecie. Wydaje mi się, że w mojej sytuacji mogą pojawić się następujące problemy:

(1) Wstępne przetwarzanie moich danych przy użyciu R ( w szczególności pakietu TM ) może być niepraktyczne , ponieważ tmbędzie zbyt wolne.

(2) Ponieważ będę musiał użyć zestawu pakietów R (przetwarzanie wstępne, rzadkie macierze, klasyfikatory itp.) Interoperacyjność między pakietami może stać się problemem, i mogę ponieść dodatkowe koszty związane z konwersją danych z jednego formatu na inny . Na przykład, jeśli wykonam wstępne przetwarzanie przy użyciu tm(lub zewnętrznego narzędzia, takiego jak WEKA), będę musiał wymyślić sposób konwersji tych danych do postaci, którą biblioteki HPC w R mogą odczytać. I znowu nie jest dla mnie jasne, czy pakiety klasyfikujące bezpośrednio pobierałyby dane dostarczone przez biblioteki HPC.

Czy jestem na dobrej drodze? A co ważniejsze, czy mam sens?

użytkownik721975
źródło
R może obsługiwać zestawy danych znacznie większe niż to, po prostu dobrze wykorzystaj dostępne narzędzia. Nie ma różnicy między tym, co można osiągnąć w dowolnym większym języku lub środowisku, chociaż Weka i Mahout opóźniają się pod względem tego, co jest dostępne. FWIW, jest to dość mały rozmiar próbki, a wymiary 1M nie są biggie, ale statystycznie też są nadmierne. Moje rekomendacje to R lub Python, ponieważ są one bezpłatne i łatwe dla początkujących. Matlab nie jest darmowy, ale także dobry. W przypadku korzystania z wielu komputerów wiąże się z tym duży podatek.
Iterator
1
O wiele bardziej istotne jest to, że masz więcej klas niż przykładów na klasę i osadzasz ją w przestrzeni o bardzo dużych wymiarach. Nie jestem pewien, czy uda ci się uzyskać bardzo dobry rozdział klasowy. Czy masz jakieś relacje strukturalne dla swoich klas? Jeśli tak, niektóre z tych metod mogą się nie sprawdzać bez tego wglądu.
Iterator
1
Możesz użyć foreachbiblioteki do pisania równoległego kodu w R. Działa to szczególnie dobrze w połączeniu z losowymi lasami, które z natury są łatwe do zrównoleglenia.
Zach
2
Kilka pytań: 1) Czy jesteś zainteresowany porównaniem różnych rodzajów podejść do uczenia się, o których wspominasz, czy potrzebujesz tylko jednego, aby wykonać pracę? 2) Czy każdy dokument należy do 1, 1 lub więcej lub 0 lub więcej klas? 3) Czy chcesz z jakiegoś powodu skorzystać z wyboru funkcji, czy po prostu uważasz, że jest to konieczne? Zgadzam się z innymi uwagami, że według dzisiejszych standardów jest to problem niewielkich rozmiarów i zmniejszenie wymiarów nie jest konieczne.
DavidDLewis
1
Pracuję nad klasyfikacją tekstu obejmującą prawie 10 000 tematów (np. Klasy lub kategorie lub dowolny termin, który preferujesz). Obecnie pracuję nad dostrajaniem tego systemu klasyfikacji tekstu w tej skali. Nie mogę dzielić się własnymi technikami, ponieważ są zastrzeżone, ale mam jedną radę: bądź bardzo ostrożny, zakładając, że niektóre sugerowane techniki skalują się, chyba że zostało to już udowodnione. Z mojego doświadczenia wynika, że ​​niewielu to robi.

Odpowiedzi:

13

Powinno to być możliwe, aby działało tak długo, jak długo dane są reprezentowane jako rzadka struktura danych, taka jak scipy.sparse.csr_matrixinstancja w Pythonie. Napisałem tutorial do pracy na danych tekstowych . Możliwe jest dalsze zmniejszenie zużycia pamięci poprzez zastosowanie sztuczki haszującej: dostosuj ją, aby używać HashingVectorizerzamiast CountingVectorizerlub TfidfVectorizer. Wyjaśniono to w sekcji dokumentacji wyodrębnianie funkcji tekstowych .

Lasy losowe są generalnie znacznie droższe niż modele liniowe (takie jak liniowe maszyny wektorów nośnych i regresja logistyczna) oraz wielomianowe lub Bernoulliego naiwne Bayesa, a dla większości problemów z klasyfikacją tekstu, które nie zapewniają znacznie lepszej dokładności predykcyjnej niż prostsze modele.

Jeśli scikit-learn nie będzie mógł skalować się do twojego problemu, Vowpal Wabbit zrobi (i prawdopodobnie szybciej niż sklearn), chociaż nie wdroży wszystkich modeli, o których mówisz.

Edytowano w kwietniu 2015 r., Aby odzwierciedlić aktualny stan biblioteki scikit-learn i naprawić niedziałające linki.

ogrisel
źródło
Problem z użyciem dowolnej „niestandardowej” techniki redukcji wymiarów polega na tym, że możesz napotkać problemy podczas próby opublikowania swojej pracy. Przynajmniej w polu klasyfikacji tekstu wiem na pewno, że recenzenci lubią widzieć powszechnie stosowane techniki (ułatwia to również porównanie z istniejącymi technikami klasyfikacji).
user721975,
Nie martw się - @ogrisel nie wspomniał o niczym niestandardowym, a przynajmniej nie o tym, że dotyczy najnowocześniejszej klasyfikacji tekstu, chociaż nie przeczytałem jeszcze jego samouczków.
Iterator,
+1 Myślę, że Python jest prawdopodobnie przyjemną drogą. W języku R jest kilka najnowszych pakietów do eksploracji tekstu, ale jeśli ktoś ma więcej obliczeniowych niż statystycznych ekspertyz i zainteresowań, Python byłby moją rekomendacją.
Iterator
@ogrisel: Uznanie za wkład, który Ty i inni wnieśliście w sklearn. Poleciłem go wielu osobom pracującym w Pythonie - cały projekt jest wzorowy.
Iterator,
Jeśli chodzi o „niestandardowe” zmniejszenie wymiarów (przy użyciu losowych rzutów) i haszowanie funkcji, sprawdź sztuczkę haszowania autorstwa Johna Langforda i tę dyskusję na temat metaoptymalizacji .
ogrisel
10

Gensim dla Pythona to magia. A ponieważ jest w Pythonie, możesz go używać w połączeniu z sugestią @ ogrisel.

Jeff
źródło
1

Aby nie trącić własnym rogiem, stworzyłem dość popularną serię wideo na temat analizy tekstu za pomocą Rapidminer. Możesz to zobaczyć tutaj:

http://vancouverdata.blogspot.com/2010/11/text-analytics-with-rapidminer-loading.html

Prawdopodobnie możesz uniknąć wyboru funkcji, po prostu użyj klasyfikatora, który nie tworzy w pamięci milionów * milionów macierzy :)

Regresja logistyczna dusi się w tak wielu wymiarach. Naive Bayes przyjmuje niezależne wymiary, więc wszystko będzie dobrze. SVM nie zależy od liczby wymiarów (ale od liczby wektorów pomocniczych), więc będzie dobrze.

300 to jednak dużo klas. Zaczynam od nielicznych i pracuję na twojej drodze.

Neil McGuigan
źródło
Świetny wskaźnik i rada. Dzięki. Czy potrafisz wyjaśnić, co masz na myśli mówiąc „zacznij od nielicznych i rozwijaj swoją drogę”?
user721975,
cóż, zamiast 300 klas (takich jak „skrzypce, altówka, wiolonczela, trąbka ...”), można przeklasyfikować je na mniejszą liczbę, np. „smycz, mosiądz”.
Neil McGuigan,
OK, rozumiem teraz.
user721975,
1

Po pierwsze, na podstawie twoich komentarzy potraktowałbym to jako 300 binarnych (tak / nie) problemów z klasyfikacją. Istnieje wiele łatwych w użyciu binarnych klasyfikatorów typu open source, dzięki czemu możesz wymieniać czas na pamięć.

SVM i regresja logistyczna są prawdopodobnie najpopularniejszymi metodami klasyfikacji tekstu. Oba mogą z łatwością obsłużyć 1000000 wymiarów, ponieważ nowoczesne implementacje wykorzystują rzadkie struktury danych i zawierają ustawienia regularyzacji, które unikają nadmiernego dopasowania.

Kilka pakietów uczenia maszynowego typu open source, w tym WEKA i KNIME , obejmuje zarówno maszyny SVM , jak i regresję logistyczną. Autonomiczne implementacje SVM obejmują libSVM i SVMlight . Aby uzyskać regresję logistyczną, podłączę BXRtrain i BXRclassify , które opracowałem z Madigan, Genkin i innymi. BXRclassify może zbudować indeks w pamięci tysięcy modeli regresji logistycznej i zastosować je jednocześnie.

Jeśli chodzi o konwersję tekstu do postaci wektorowej atrybutu, zawsze jakoś zawsze piszę trochę Perla, aby zrobić to od zera. :-) Ale wydaje mi się, że wspomniane pakiety uczenia maszynowego obejmują tokenizację i kod wektoryzacji. Inną drogą byłoby pójście z zestawem narzędzi w języku naturalnym, takim jak LingPipe , choć może to być dla ciebie przesadą .

DavidDLewis
źródło
+1 dobre komentarze. Gdybym miał wykonać 300 klasyfikacji tak / nie, jak wybrałbym negatywne dane treningowe dla klasy? Pozytywne dane to oczywiście dokumenty należące do klasy.
user721975,
Kolejny komentarz. SVM / Logistic reg z pewnością poradzi sobie z milionem wymiarów, ale jak mogę przeprowadzić eksperymenty, aby wybrać parametry dla tych klasyfikatorów? Na przykład na małym zestawie danych można uruchomić 10-krotną weryfikację krzyżową, aby zdecydować o parametrach, ale jakie podejście stosuje się w przypadku tak dużych danych, aby algorytm zakończył działanie w rozsądnym czasie?
user721975,
@ user721975: W przypadku szczególnej dyskryminacji dokumenty pozytywne to te z etykietą X, a dokumenty negatywne to cała reszta dokumentów.
DavidDLewis,
@ user721975: Trudno podać ogólne porady na temat czasu działania, ponieważ szczegóły różnią się tak bardzo w zależności od algorytmów i implementacji. 10-krotna walidacja krzyżowa może nie być niepraktyczna dla zestawu danych: 60000 przykładów nie ma znaczenia.
DavidDLewis,
1
Niezrównoważone zestawy treningowe niekoniecznie stanowią problem. Ale faktycznie zdaję sobie sprawę, że jest coś, co mnie myli: skoro dokumenty mogą należeć do 0, 1 lub kilku klas, co masz na myśli mówiąc, że masz 200 dokumentów szkoleniowych na klasę? Czy zrobiłeś coś, aby usunąć dokumenty z 0 klasami lub 2+ klasami? Ogólnie, jak wygenerowałeś ten zestaw 60000 dokumentów?
DavidDLewis
1

Od wersji Sklearn 0.13 rzeczywiście istnieje implementacja HashingVectorizer .

EDYCJA: Oto pełny przykład takiej aplikacji ze sklearn docs

Zasadniczo ten przykład pokazuje, że można klasyfikować tekst według danych, które nie mieszczą się w głównej pamięci komputera (ale raczej na dysku / sieci / ...).

oDDsKooL
źródło