2013-02-26 8 views
5

Mam około 3000 dokumentów tekstowych związanych z czasem, w którym dokument był "interesujący". Więc powiedzmy, że dokument 1 zawiera 300 wierszy tekstu z treścią, co doprowadziło do zainteresowania 5,5 dnia, podczas gdy inny dokument z 40 liniami tekstu sprawił, że 6,7 dni były "interesujące" i tak dalej.Jak przewidzieć wartość ciągłą (czas) z dokumentów tekstowych?

Teraz zadaniem jest przewidywanie czasu trwania zainteresowania (który jest wartością ciągłą) w oparciu o treść tekstu.

Mam dwa pomysły, aby zbliżyć się do problemu:

  1. zbudować model podobnych dokumentów z technologią jak http://radimrehurek.com/gensim/simserver.html. Kiedy nadejdzie nowy dokument, można spróbować znaleźć 10 najbardziej podobnych dokumentów w przeszłości i po prostu obliczyć średnią ich trwania i przyjąć tę wartość jako prognozę na czas trwania zainteresowania dla nowego dokumentu.
  2. Umieścić dokumenty w kategoriach czasu trwania (np. 1 dzień, 2 dni, 3-5 dni, 6-10 dni, ...). Następnie wytrenuj klasyfikator, aby przewidzieć kategorię czasu trwania na podstawie treści tekstowej.

Zaletą idei nr 1 jest to, że mogłem również obliczyć odchylenie standardowe mojej prognozy, natomiast w przypadku pomysłu nr 2 nie jest dla mnie jasne, w jaki sposób mogłem obliczyć podobną miarę niepewności moich przewidywań. Również nie jest dla mnie jasne, które kategorie wybrać, aby uzyskać najlepsze wyniki z klasyfikatora.

Więc czy istnieje pewna reguła, jak zbudować systemy, aby jak najlepiej przewidzieć ciągłą wartość, np. Czas od dokumentów tekstowych? Czy należy używać klasyfikatora, czy też należy zastosować podejście wykorzystujące średnie wartości na podobnych dokumentach? Nie mam prawdziwego doświadczenia w tej dziedzinie i chciałbym się dowiedzieć, które z podejść prawdopodobnie przyniosłoby najlepsze rezultaty. Punkt bonusowy jest podany, jeśli znasz prostą istniejącą technologię (opartą na Javie lub Pythonie), która może być użyta do rozwiązania tego problemu.

+0

@larsmans: Dlaczego z jednej strony dajesz odpowiedź na to pytanie, ale z drugiej strony głosujesz na to pytanie jako zamknięte? – asmaier

Odpowiedz

1

(Poniższe jest oparte na moim akademickim "doświadczeniu", ale wydaje się wystarczająco pouczające, aby go opublikować).

Wygląda na to zadanie można przeformułować jak:

otrzymują zestaw treningowy zdobytych dokumentów, zaprojektować system za zabicie dowolnych dokumentów w oparciu o ich zawartość.

"w zależności od ich treści" jest bardzo niejednoznaczna. W rzeczywistości powiedziałbym, że jest zbyt niejednoznaczny. Możesz spróbować znaleźć określoną cechę tych dokumentów, która wydaje się być odpowiedzialna za wynik. To bardziej ludzkie zadanie, dopóki nie możesz go zawęzić, np. wiesz, że szukasz pewnych "wartościowych" słów, które składają się na wynik, a może na grupy słów (spójrz na http://en.wikipedia.org/wiki/N-gram).

Możesz również spróbować stworzyć system podobny do wyszukiwarki, oparty na podobieństwie, sim(doc1, doc2). Potrzebny jest jednak duży korpus zawierający wszystkie możliwe wyniki (od najniższego do najwyższego, wiele razy), tak aby dla każdego dokumentu wejściowego istniały podobne dokumenty. W przeciwnym razie wyniki byłyby niejednoznaczne.

zależności od wartości SIM() zwróci, środek należy napełnić relacji jak:

sim(doc1,doc2) == 1.0 - |score(doc1) - score(doc2)|. 

Aby przetestować jakość środka, można obliczyć podobieństwa i zdobyć różnicę dla każdej pary ducuments i sprawdź correlation.

Pierwszy pick byłoby cosine similarity użyciu tf-idf

Ty też wspomniany kategoryzacji danych. Wydaje mi się, że to metoda "usprawiedliwiania" miernej miary podobieństwa. To znaczy. jeśli środek jest dobry, powinno być jasne, do której kategorii będzie należał dokument. Jeśli chodzi o klasyfikatory, dokumenty powinny najpierw mieć określone "cechy".

Jeśli masz duży korpus dokumentów, możesz spróbować clustering, aby przyspieszyć proces.

Wreszcie, w celu ustalenia ostatecznego wyniku, proponuję przetwarzanie wyników kilku najbardziej podobnych dokumentów. Surowa średnia może nie być najlepszym pomysłem w tym przypadku, ponieważ "mniej podobne" oznaczałoby również "mniej dokładne".

Co do wdrożenia, proszę spojrzeć na: Simple implementation of N-Gram, tf-idf and Cosine similarity in Python.

(IMHO, 3000 dokumentów jest zbyt mała liczba do robienia czegokolwiek niezawodne z nim bez dalszego poznania ich treści i relacji między treścią i wynik.)

3

Approach (1) nazywamy k-najbliższych sąsiadów regresja. To jest całkowicie poprawne. Istnieją więc niezliczone inne podejścia do regresji, np. zwykła wielokrotna regresja z wykorzystaniem tokenów dokumentów jako funkcji.

Oto szkielet skryptu, aby pasowały do ​​modelu regresji liniowej z wykorzystaniem scikit-learn (*):

from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.linear_model import SGDRegressor 

# build a term-document matrix with tf-idf weights for the terms 
vect = TfidfVectorizer(input="filename") 
Xtrain = vect.fit_transform(documents)   # documents: list of filenames 

# now set ytrain to a list of durations, such that ytrain[i] is the duration 
# of documents[i] 
ytrain = ... 

# train a linear regression model using stochastic gradient descent (SGD) 
regr = SGDRegressor() 
regr.fit(Xtrain, ytrain) 

to wszystko. Jeśli masz teraz nowe dokumenty, dla których chcesz przewidzieć czas trwania zainteresowania, robić

Xtest = vect.transform(new_documents) 
ytest = regr.predict(Xtest) 

To prosta regresja liniowa. W rzeczywistości spodziewam się, że czas trwania zainteresowania nie będzie liniową funkcją treści tekstu, ale może to zacząć. Następnym krokiem będzie pobranie dowolnego podręcznika uczenia maszynowego lub statystyk, które traktują bardziej zaawansowane modele regresji.

(*) Jestem współtwórcą tego projektu, więc nie jest to bezstronna rada. Prawie każdy przyzwoity zestaw narzędzi do uczenia maszynowego ma modele regresji liniowej.

+0

Dziękujemy za podanie (1) nazwy: k-najbliższa regresja sąsiadów. To mi bardzo pomaga. – asmaier

Powiązane problemy