Próbuję grupować, na przykład, ciągi o programowaniu z innymi ciągami o programowaniu, ciągi o fizyce z innymi ciągami o fizyce itp., Dla szerokiego zakresu tematów. Pomimo rażącego teoretycznego aspektu językowego problemu, zamierzam to zrobić za pomocą programowania / oprogramowania.
Podsumowanie: Biorąc pod uwagę dużą liczbę ciągów, jak miałbym pogrupować je według tematyki semantycznej?
Konkretna aplikacja: mam ~ 200 000 ciekawostek, które chciałbym podzielić na wspólne grupy (samochody, komputery, polityka, Kanada, jedzenie, Barack Obama itp.).
Co sprawdziłem: Wikipedia ma listę zestawów narzędzi do przetwarzania języka naturalnego (zakładając, że to, co próbuję zrobić, nazywa się NLP), więc spojrzałem na kilka, ale żadne nie wydaje się robić czegoś podobnego do moich potrzeb.
Uwagi: Zwrócono uwagę, że robienie tego wymaga dodatkowej wiedzy (np. Porsche jest samochodem, C ++ jest językiem programowania). Zakładam, że dane treningowe są potrzebne, ale jeśli mam tylko listę pytań i odpowiedzi, jak mogę wygenerować dane treningowe? A potem, jak korzystać z danych treningowych?
Więcej notatek: Jeśli bieżące formatowanie mojej pomocy w pytaniach i odpowiedziach (choć wygląda jak JSON, jest to w zasadzie nieprzetworzony plik tekstowy):
// row 1: is metadata
// row 2: is a very specific kind of "category"
// row 3: is the question
// row 4: is the answer
{
15343
A MUSICAL PASTICHE
Of classical music's "three B's", he was the one born in Hamburg in 1833
Johannes Brahms
}
Zanim jednak ktoś zauważy, że istnieje już kategoria, zwróć uwagę, że istnieje ~ 200 000 takich pytań i odpowiedzi oraz w zasadzie tyle „kategorii”. Próbuję pogrupować je w szersze grupy, takie jak te wymienione powyżej. Również to formatowanie można bardzo łatwo zmienić na wszystkie pytania, robię to programowo.
I więcej notatek: tak naprawdę nie wiem, ile kategorii potrzebuję (co najmniej 10-20), ponieważ sam nie przeczytałem wszystkich pytań. Po części spodziewałem się, że jakaś liczba skończona zostanie jakoś określona podczas kategoryzacji. W każdym razie zawsze mogę ręcznie utworzyć wiele kategorii.
źródło
Odpowiedzi:
Jest to dość standardowy problem w NLP, a magiczne słowa Google, których szukasz, to „modelowanie tematów”. Chociaż twoje łańcuchy są dość krótkie, możesz odnieść pewien sukces dzięki Latent Dirichlet Allocation lub podobnej metodzie. Jest ładny blogu Edwin Chen tutaj , określającej ogólną ideę algorytmu. Szczegóły implementacji zostały omówione w tej notatce przez Yi Wanga.
Jeśli szukasz gotowego rozwiązania, polecam wypróbowanie
topicmodels
pakietu dla R, ponieważ zapewnia on całkiem przyjemny interfejs zarówno dla LDA, jak i bardziej wyrafinowanego skorelowanego modelu tematycznego. Jest też dobra lista wdrożeń prowadzonych przez Davida Mimno tutaj .źródło
Próbujesz tutaj rozwiązać dwa problemy.
Problem 1: Kategoryzuj ciągi pytań w odpowiedniej kategorii.
Problem 2: Utwórz odpowiednie kategorie.
Pierwszy problem można rozwiązać za pomocą tak zwanych algorytmów nadzorowanych, wiele klasyfikatorów może dać bardzo dobrą dokładność i wydajność. Jednak problem 2, tworzenie kategorii z powietrza (tony danych), jest znacznie trudniejszy. Jest to problem bez nadzoru, biorąc pod uwagę dużą ilość danych, komputer samodzielnie decyduje o kategoriach, biorąc pod uwagę pewne kryteria. Idealnie te kryteria i algorytm powinny starannie uporządkować dane w klastry. Można je następnie oznaczyć. Ponieważ jest to jednak znacznie trudniejsze zadanie, powiedziałbym, że nie ma tutaj akceptowalnego rozwiązania, które dałoby dobry wynik bez dużego wysiłku tuningowego, który najprawdopodobniej wymagałby ekspertów.
Obawiam się, że nie ma tu jeszcze magicznego przycisku. Możesz jednak nieco pomóc maszynie. Na przykład możesz zdecydować o zestawie kategorii. Po wybraniu kategorii możesz utworzyć dane treningowe. W tym ustawieniu dane treningowe to tylko pytanie i poprawne pary kategorii.
Im więcej danych treningowych, tym lepiej. Ponieważ jednak zadanie wciąż polega na czymś automatycznym, nie ma sensu na początku robić rzeczy ręcznie. Dlaczego chcesz mieć dane treningowe? Ocena dokładności. Jeśli chcesz uzyskać dobre wyniki, ważne jest, abyś mógł dokonać oceny tego, jak dobrze działa konfiguracja. Jedynym sposobem, aby to zrobić dość systematycznie, jest ręczne samodzielne etykietowanie niektórych zadań. W przeciwnym razie jesteś w ciemno.
Potem pojawiają się nowe pytania. Po pierwsze: ile danych treningowych potrzebuję? "To zależy". Bez obejrzenia twoich danych lub kategorii nie jestem pewien, czy nawet zgadłbym; ale mogę zrobić „szacunkową ocenę” i powiedzieć około 500 pytań. Zauważ, że mógłbym być wyłączony o rząd wielkości.
Czy to naprawdę oznacza, że musisz ręcznie oznaczyć 500 pytań? Tak i nie. Możliwe jest wykorzystanie wyników pośrednich i sprytności do klasyfikatorów „bootstrap”. Wciąż jest to jednak praca ręczna, a kiedy się nad tym zastanowić, 500 pytań nie potrwa tak długo. Bycie sprytnym tutaj może szybko dać gorsze wyniki niż bycie pracowitym.
Kiedy masz wystarczającą ilość danych treningowych, weź 75% i stwórz klasyfikator za pomocą swojego ulubionego narzędzia (np. Tych wymienionych tutaj lub czegokolwiek innego). Teraz pozwól, aby klasyfikator spróbował oznaczyć wstrzymane 25% danych i zmierzyć wynikową dokładność. Jeśli wynik jest dobry, to pop szampana. Jeśli nie, zrób więcej danych treningowych lub wypróbuj inny klasyfikator.
TL; DR
Podsumowując, oto jak bym to zrobił.
źródło