Próbuję używać CNN (splotowa sieć neuronowa) do klasyfikowania dokumentów. CNN dla krótkiego tekstu / zdań był badany w wielu artykułach. Wydaje się jednak, że żaden dokument nie używał CNN do długiego tekstu lub dokumentu.
Mój problem polega na tym, że dokument zawiera zbyt wiele funkcji. W moim zestawie danych każdy dokument zawiera ponad 1000 tokenów / słów. Aby podać każdy przykład do CNN, przekształcam każdy dokument w matrycę za pomocą word2vec lub rękawicy, co daje dużą matrycę. Dla każdej matrycy wysokość to długość dokumentu, a szerokość to rozmiar wektora osadzania słowa. Mój zestaw danych zawiera ponad 9000 przykładów i trenowanie sieci zajmuje dużo czasu (cały tydzień), co utrudnia dostrojenie parametrów.
Inną metodą wyodrębniania funkcji jest użycie jednego gorącego wektora dla każdego słowa, ale spowoduje to utworzenie bardzo rzadkich macierzy. I oczywiście ta metoda wymaga nawet więcej czasu na szkolenie niż poprzednia metoda.
Czy istnieje lepsza metoda wyodrębniania funkcji bez tworzenia dużych matryc wejściowych?
Jak powinniśmy obsługiwać dokumenty o zmiennej długości? Obecnie dodaję specjalne ciągi, aby dokument miał tę samą długość, ale nie sądzę, że to dobre rozwiązanie.
źródło
Odpowiedzi:
Można skrócić długość danych wejściowych, reprezentując dokumenty jako serię wektorów zdań zamiast dłuższej serii wektorów słów. Doc2vec jest na to jednym ze sposobów (każde zdanie byłoby „dokumentem”).
Jeśli nie chcesz używać Doc2vec, jednym ze sposobów tworzenia wektorów zdań byłoby uśrednienie wektorów słów dla każdego zdania, dając pojedynczy wektor o tej samej szerokości dla każdego zdania. To może nie być tak precyzyjne, jak niektóre metody dostępne w Doc2Vec, ale z powodzeniem zastosowałem je do modelowania tematów.
Tak czy inaczej, kiedy już masz wektory zdań, ustaw je w kolejności dla każdego dokumentu, tak jak już robisz dla wektorów słów, i następnie przejrzyj swój model. Ponieważ długość sekwencji dla każdego dokumentu jest krótsza, model powinien trenować szybciej niż w przypadku wektorów słów.
Nawiasem mówiąc, ta metoda może działać po zwiększeniu lub zmniejszeniu, aby spełnić Twoje wymagania dotyczące dokładności i prędkości. (np. jeśli Twój CNN nadal zbyt wolno trenuje z wektorami zdań, możesz zamiast tego utworzyć wektory akapitów).
Jednym ze sposobów obsługi dokumentów o różnej długości jest wypełnianie. Sekwencje dokumentów powinny mieć taką samą długość jak najdłuższy dokument. Jeśli więc twój najdłuższy dokument ma 400 zdań, wszystkie sekwencje dokumentów będą miały długość 400 wektorów. Dokumenty krótsze niż maksymalna długość byłyby wypełnione wektorami wypełnionymi zerami.
źródło
Możesz użyć osadzania regionu. Zamiast konwertować poszczególne „tokeny” na wektory, można zastosować strategię konwersji regionów tekstu na wektory. Podejście to zastosowano tutaj: https://arxiv.org/abs/1504.01255
Jeśli nie jesteś ograniczony do CNN, możesz użyć hierarchicznych modeli uwagi, takich jak ten: https://www.cs.cmu.edu/~diyiy/docs/naacl16.pdf, w których masz tego rodzaju potok:
word vectors (combined into) sentence vectors (combined into) final document vector
Zauważ, że dzięki tej metodzie nadal będziesz musiał przekonwertować wszystkie wektory słów na osadzenia, ale nie wszystkie naraz.
Do obsługi dokumentów o różnych długościach do tej pory jedynym rozwiązaniem było wypełnianie / cięcie.
Wreszcie, aby zwiększyć szybkość, możesz spróbować zmniejszyć wymiar tekstu, włączając tylko ważne sekcje (być może tylko początek dokumentu jest wystarczający, aby mieć dobrą dokładność klasyfikacji)
źródło