2012-04-18 19 views
5

Próbuję zrobić klasyfikacji dokumentu za pomocą Weka Java API.Interpretowanie wyjścia StringToWordVector() - Weka

Oto moja struktura katalogów plików danych.

+- text_example 
| 
+- class1 
| | 
| 3 html files 
| 
+- class2 
| | 
| 1 html file 
| 
+- class3 
    | 
    3 html files 

Mam plik "arff" utworzony za pomocą "TextDirectoryLoader". Następnie używam filtru StringToWordVector w utworzonym pliku arff, z filter.setOutputWordCounts(true).

Poniżej przedstawiono przykładowy wynik po zastosowaniu filtra. Muszę wyjaśnić kilka rzeczy.

@attribute </form> numeric 
@attribute </h1> numeric 
. 
. 
@attribute earth numeric 
@attribute easy numeric 

Ta ogromna lista powinna być tokenizacją treści początkowych plików html. dobrze?

Wtedy mam,

@data 
{1 2,3 2,4 1,11 1,12 7,..............} 
{10 4,34 1,37 5,.......} 
{2 1,5 6,6 16,...} 
{0 class2,34 11,40 15,.....,4900 3,... 
{0 class3,1 2,37 3,40 5.... 
{0 class3,1 2,31 20,32 17...... 
{0 class3,32 5,42 1,43 10......... 

dlaczego nie ma atrybut class przez pierwsze 3 maszyn? (powinien mieć klasę1). co oznacza wiodące 0, jak w {0 class2, ..}, {0 class3 ..}. Mówi na przykład, że w trzecim pliku html w folderze class3 słowo identyfikowane przez liczbę całkowitą 32 pojawia się 5 razy. Tylko po to, aby zobaczyć, jak mogę uzyskać słowo (token), o którym mowa przez 32?

Jak zmniejszyć wymiarowość wektora cech? czy nie musimy uczynić wszystkich wektorów cech tego samego rozmiaru? (jak rozważ tylko 100 najczęstszych terminów z zestawu treningowego, a później, jeśli chodzi o testowanie, rozważ występowanie tylko tych 100 terminów w dokumentach testowych, ponieważ w ten sposób, co się stanie, jeśli wymyślimy zupełnie nowe słowo w fazie testowania, czy klasyfikator po prostu go zignoruje?).

Czy tu czegoś brakuje? Jestem nowy w Weka.

Bardzo doceniam pomoc, jeśli ktoś może mi wyjaśnić, w jaki sposób klasyfikator używa tego wektora utworzonego z filtrem StringToWordVector. (Jak tworzenie słownictwa z danych szkoleniowych, redukcję wymiarowości, to te dzieje wewnątrz kodu Weka?)

Odpowiedz

8
  1. Ogromna lista @attribute zawiera wszystkie znaki pochodzące od wejścia.
  2. Sekcja @data jest w formacie rozrzedzonym, czyli dla każdego atrybutu, wartość jest określona tylko wtedy, gdy jest różna od zera. W przypadku pierwszych trzech linii atrybutem klasy jest klasa 1, po prostu nie można jej zobaczyć (jeśli byłaby nieznana, na początku pierwszych trzech linii pojawi się 0 ?). Dlaczego to jest takie? Weka wewnętrznie reprezentuje atrybuty nominalne (w tym klasy) jako podwójne i zaczyna liczyć na zero. Zatem twoje trzy klasy są wewnętrznie: class1 = 0.0, class2 = 1.0, class3 = 2.0. Ponieważ wartości zerowe nie są podane w rozrzedzonym formacie, nie można zobaczyć klasy w pierwszych trzech wierszach. (Zobacz także sekcję "Rzadkie pliki ARFF" na http://www.cs.waikato.ac.nz/ml/weka/arff.html)
  3. Aby otrzymać słowo/token reprezentowane przez indeks n, można liczyć lub, jeśli masz obiekt Instances, wywołać na nim attribute(n).name(). W tym celu n rozpoczyna odliczanie o wartości 0.
  4. Aby zmniejszyć wymiarowość wektora cech, dostępnych jest wiele opcji. Jeśli chcesz mieć tylko 100 najczęstszych terminów, musisz stringToWordVector.setWordsToKeep(100). Zauważ, że to będzie próbowało zachować 100 słów każdej klasy. Jeśli nie chcesz zachować 100 słów w klasie, stringToWordVector.setDoNotOperateOnPerClassBasis(true).Otrzymasz nieco powyżej 100, jeśli jest kilka słów o tej samej częstotliwości, więc 100 jest tylko rodzajem wartości docelowej.
  5. Jeśli chodzi o nowe słowa występujące w fazie testowej, myślę, że nie może się to zdarzyć, ponieważ przed klasyfikacją musisz podać wszystkie instancje stringToWordVector. Nie jestem jednak w 100% pewny, ponieważ korzystam z konfiguracji dwupoziomowej i pozwolę, aby StringToWordVector przekształciły wszystkie moje instancje przed przekazaniem klasyfikatorowi nic na ten temat.

Mogę ogólnie polecić Państwu, aby poeksperymentować z narzędziem Weka KnowledgeFlow, aby nauczyć się korzystać z różnych klas. Jeśli wiesz, jak tam robić rzeczy, możesz z łatwością wykorzystać tę wiedzę do swojego kodu Java. Mam nadzieję, że mogłem ci pomóc, chociaż odpowiedź jest nieco spóźniona.

+0

Tak, ans jest nieco spóźniony, gdy sam nauczyłem się odpowiedzi. Ale dziękuję za odpowiedź i akceptuję ją. Hej, masz jakieś doświadczenie z jedną klasyfikacją klasy z libsvm (wrapper) w Weka? Trochę utknąłem z tym – KillBill

+0

@ user601 Nie, przepraszam. Nigdy nie korzystałem z biblioteki libsvm w Weka. Z czystej ciekawości: czy pisząc pracę magisterską na temat uczenia maszynowego/eksploracji danych, przypadkiem? – Malhelo

+0

Tak, robię moją pracę magisterską, która wymaga klasyfikacji tekstu. Czy robisz coś podobnego? – KillBill