Algorytmy klastrowania tekstu

17

Mam problem z grupowaniem ogromnej liczby zdań w grupy według ich znaczenia. Jest to podobne do problemu, gdy masz wiele zdań i chcesz je pogrupować według ich znaczenia.

Jakie algorytmy są zalecane? Nie wiem z góry liczby klastrów (a ponieważ nadchodzi więcej danych, klastry również mogą się zmieniać), jakie funkcje są zwykle używane do przedstawienia każdego zdania?

Próbuję teraz najprostszych funkcji z samą listą słów i odległością między zdaniami zdefiniowanymi jako:

wprowadź opis zdjęcia tutaj

(A i B są odpowiednimi zestawami słów w zdaniach A i B)

Czy to w ogóle ma sens?

Próbuję zastosować algorytm Mean-Shift z biblioteki scikit do tej odległości, ponieważ nie wymaga to wcześniej liczby klastrów.

Jeśli ktoś doradzi lepsze metody / podejścia do problemu - będzie to bardzo doceniane, ponieważ wciąż jestem nowy w tym temacie.

Maxim Galushka
źródło

Odpowiedzi:

13

Sprawdź otwarte oprogramowanie Stanford NLP Group ( http://www-nlp.stanford.edu/software ), w szczególności Stanford Classifier ( http://www-nlp.stanford.edu/software/classifier.shtml ) . Oprogramowanie jest napisane w Java, co prawdopodobnie Cię zachwyci, ale ma również powiązania z innymi językami. Uwaga: licencja - jeśli planujesz używać ich kodu w produktach komercyjnych, musisz uzyskać licencję komercyjną.

Innym interesującym zestawem bibliotek open source, IMHO odpowiednich do tego zadania i wielu innych, jest równoległa platforma do uczenia maszynowego GraphLab ( http://select.cs.cmu.edu/code/graphlab ), która obejmuje bibliotekę klastrową , wdrażanie różnych klastrów algorytmy ( http://select.cs.cmu.edu/code/graphlab/clustering.html ). Jest szczególnie przydatny w przypadku bardzo dużej ilości danych (tak jak Ty), ponieważ implementuje MapReducemodel, a zatem obsługuje przetwarzanie równoległe wielordzeniowe i wieloprocesorowe .

Najprawdopodobniej zdajesz sobie sprawę z następujących kwestii, ale wspomnę o tym na wszelki wypadek. Natural Language Toolkit (NLTK) dla Python( http://www.nltk.org ) zawiera moduły do ​​grupowania / klasyfikowania / kategoryzowania tekstu. Sprawdź odpowiedni rozdział w NLTK Book: http://www.nltk.org/book/ch06.html .

AKTUALIZACJA:

Mówiąc o algorytmach , wygląda na to, że wypróbowałeś większość z nich scikit-learn, takich jak zilustrowane w tym przykładzie ekstrakcji tematu: http://scikit-learn.org/stable/auto_examples/applications/topics_extraction_with_nmf.html . Jednak przydatne mogą być inne biblioteki, które implementują wiele różnych algorytmów klastrowania , w tym faktoryzację macierzy nieujemnej (NMF) . Jedną z takich bibliotek jest faktoryzacja macierzy w języku Python (PyMF) ze stroną główną na https://code.google.com/p/pymf i kodem źródłowym na https://github.com/nils-werner/pymf . Kolejną, jeszcze bardziej interesującą biblioteką, również opartą na języku Python, jest NIMFA, który implementuje różne algorytmy NMF : http://nimfa.biolab.si . Oto artykuł badawczy opisujący NIMFA: http://jmlr.org/papers/volume13/zitnik12a/zitnik12a.pdf . Oto przykład z jego dokumentacji, która przedstawia rozwiązanie bardzo podobnego problemu przetwarzania tekstu w grupowaniu tematów : http://nimfa.biolab.si/nimfa.examples.documents.html .

Aleksandr Blekh
źródło
1
Bardzo dziękuję za tak szczegółową odpowiedź. Przejdę przez wszystkie twoje sugestie, dużo pracy, aby spróbować i przetestować! Odkryłem również, że narzędzie march2 naprawdę świetnie sobie radzi w grupowaniu danych tekstowych bez nadzoru. Link do publikowania w celu odniesienia w przyszłości http://project.carrot2.org/
Maxim Galushka
@MaximGalushka: Nie ma za co! Jestem ciekawy informacji o twoich odkryciach i postępach, które w końcu osiągniesz. Możesz pisać tutaj lub łączyć się bezpośrednio ze mną.
Aleksandr Blekh