Mam matrycę terminów dokumentowych , a teraz chciałbym wyodrębnić słowa kluczowe dla każdego dokumentu za pomocą nadzorowanej metody uczenia się (SVM, Naive Bayes, ...). W tym modelu używam już Tf-idf, znacznika Pos, ...
Ale teraz zastanawiam się nad kolejnymi. Mam macierz z podobieństwami cosinusowymi między warunkami.
Czy istnieje możliwość wykorzystania tych podobieństw jako funkcji mojego modelu? Moim pomysłem było użycie terminu w dokumencie d , aby użyć średniej podobieństwa cosinusów wszystkich terminów w dokumencie d z terminem i . Czy to jest przydatne?
Odpowiedzi:
Nie wiem, jak można wyodrębnić słowa kluczowe z uczeniem nadzorowanym, ale wiem, jak to zrobić, ucząc się bez nadzoru.
Można to zrobić na kilka sposobów, więc oto one:
Hierarchiczny
Możesz zastosować dowolną hierarchiczną metodę klastrowania bezpośrednio do macierzy podobieństwa (z dowolną funkcją podobieństwa, nie tylko cosinus)
W scikit-learn możesz zrobić coś takiego:
Źródło: [1]
Ale ponieważ jest to skupienie aglomeracyjne, jest ono drogie obliczeniowo i jego obliczenie zajmie trochę czasu.
K-oznacza
Inną możliwością jest wykonanie zwykłych średnich k w wierszach matrycy termin-dokument, a następnie znalezienie najczęstszych terminów dla każdego środka ciężkości
Na przykład w scikit dowiedz się, jak to zrobić:
Źródło: [2]
Ale k-średnie opiera się na odległości euklidesowej, co jest niekorzystne dla rzadkich danych wielowymiarowych. Istnieją inne techniki, które działają lepiej dla tekstów i wykorzystują podobieństwo cosinus
Cosine K-Means and Scatter / Gather
Możliwe jest użycie cosinusa ze średnimi K (patrz np. [3] ): oblicz centroidy jako średnią dla wszystkich dokumentów w każdym klastrze, a następnie użyj cosinusa, aby obliczyć odległość do najbliższego centroidu.
Na koniec możesz wyodrębnić słowa kluczowe w taki sam sposób, jak w przypadku zwykłych k-średnich.
Obliczanie średniego centroidu jako średniej dla wszystkich dokumentów w klastrze nie zawsze jest dobre. Inne podejście jest sugerowane w algorytmie Scatter / Gather [4] : środek ciężkości klastra stanowi połączenie wszystkich dokumentów w tym klastrze.
Aby zastosować to podejście, wystarczy wziąć najczęstsze terminy dla każdego klastra centroidów.
Nie ma implementacji tych algorytmów w scikit learn, ale możesz je łatwo zaimplementować samodzielnie
KMeans
.Zauważ, że w obu przypadkach centroidy stają się dość gęste: gęstsze niż reszta dokumentów w poszczególnych klastrach, więc możesz chcieć obciąć terminy w centroidach, tj. Usunąć te „nieważne”. (patrz [8]).
Grupowanie widmowe
Innym sposobem byłoby zastosowanie grupowania widmowego. Będziesz musiał dostarczyć macierz podobieństwa, którą już masz, i znajdzie na niej klastry.
Jest zaimplementowany w
SpectralClustering
klasie, patrz przykłady w [5] . Pamiętaj, że ponieważ masz już wstępnie obliczoną macierz, musisz użyćaffinity='precumputed'
atrybutu podczas inicjowania.Grupowanie spektralne jest powiązane z KMeansami jądra: istnieje papier (patrz [7]), który pokazuje, że są one tym samym. Ostatnio natknąłem się na implementację KMeansów jądra, które mogą być przydatne: https://gist.github.com/mblondel/6230787
Faktoryzacja macierzy nieujemnej
Na koniec możesz grupować matrycę dokumentów termicznych za pomocą niektórych technik dekompozycji z Algebry Liniowej, takich jak SVD (byłaby to tak zwana „Latentna analiza semantyczna”) lub faktoryzacja macierzy nieujemnej. Ten ostatni może być postrzegany jako grupowanie i może grupować zarówno wiersze, jak i kolumny macierzy w tym samym czasie.
Na przykład możesz wyodrębnić słowa kluczowe, wykonując
Źródło kodu: [6]
Chociaż tutaj przykłady znajdują się w Python scikit-learn, myślę, że nie powinno być dużym problemem znalezienie niektórych przykładów dla R
Źródła
źródło