python
  • scipy
  • scikit-learn
  • nltk
  • k-means
  • 2014-12-21 9 views 5 likes 
    5

    Używam algorytmu Kmeans scikit learn do grupowania komentarzy.W jaki sposób Kmeans wie, jak klastry dokumentów, gdy karmimy je tylko tfidf wektory poszczególnych słów?

    sentence_list=['hello how are you', "I am doing great", "my name is abc"] 
    
    vectorizer=TfidfVectorizer(min_df=1, max_df=0.9, stop_words='english', decode_error='ignore') 
    vectorized=vectorizer.fit_transform(sentence_list) 
    
    km=KMeans(n_clusters=num_clusters, init='k-means++',n_init=10, verbose=1) 
    km.fit(vectorized) 
    

    po wydrukowaniu wyniku wektoryzacji, daje mi indeks słów i wyników tf-idf indeksu.

    Tak się zastanawiam, biorąc pod uwagę, że otrzymujemy tylko tfidf-owe wyniki słów, w jaki sposób udaje nam się grupować dokumenty w oparciu o pojedyncze słowa, a nie wynik całego dokumentu? A może to robi. Czy ktoś może mi wytłumaczyć koncepcję tego problemu?

    +0

    Nie jesteś pewien, o co pytasz. Proces dzielenia tekstu na słowa jest częścią procesu wektoryzacji/dopasowywania. – BrenBarn

    +0

    moim ostatecznym celem jest możliwość wykreślenia wykresu 2d z osią y będącą wynikiem tfidf, a oś x może być wektorem liczącym (lub czymś, co ma więcej sensu), a każdy punkt danych jest 1 dokumentem. Więc byłem ciekawy, czy wynik dla każdego zdania jest rzeczywiście obliczany za sceną, tak, że klastry z najbardziej podobnymi wynikami są zgrupowane razem? – jxn

    Odpowiedz

    6

    Powinieneś sprawdzić, jak działa Kmeans algorithm. Najpierw słowa kończące nigdy nie trafiają do vectorized, dlatego są całkowicie ignorowane przez Kmeans i nie mają żadnego wpływu na sposób grupowania dokumentów. Załóżmy teraz, że masz:

    sentence_list=["word1", "word2", "word2 word3"] 
    

    Powiedzmy, że chcesz 2 klastry. W tym przypadku spodziewasz się, że drugi i trzeci dokument będą w tym samym klastrze, ponieważ mają wspólne słowo. Zobaczmy, jak to się dzieje.

    Wartość liczbowa Dokumentów vectorized wygląda następująco:

    word1  word3  word2 
        1 0.000000 0.000000  # doc 1 
        0 1.000000 0.000000  # doc 2 
        0 0.605349 0.795961  # doc 3 
    

    W pierwszym etapie Kmeans niektóre centroidy są losowo wybranym od danych, na przykład, dokument 1 i 3 Dokument zostanie być początkowe centroidy:

    Centroid 1:  [1, 0.000000, 0.000000] 
    
    Centroid 2:  [0, 0.605349, 0.795961] 
    

    teraz, jeśli obliczyć odległości od każdego punktu (dokument) do każdej z dwóch centroidów, widać, że:

    • 1 Dokument ma odległość 0 do ciężkości 1 tak należy do ciężkości 1
    • dokument 3 jest odległość od 0 do ciężkości 2 tak, że należy do ciężkości 2

    Wreszcie możemy obliczyć odległość między pozostałe dokument 2 i każdy środek ciężkości, aby dowiedzieć się, który z nich należy do:

    >>> from scipy.spatial.distance import euclidean 
    
    >>> euclidean([0, 1, 0], [1, 0, 0])    # dist(doc2, centroid1) 
    1.4142135623730951 
    
    >>> euclidean([0, 1, 0], [0, 0.605349, 0.795961]) # dist(doc2, centroid2) 
    0.8884272507056005 
    

    Więc 2. dokument i drugi środek ciężkości bliżej, oznacza to, że drugi dokument jest przypisany do 2 centr oid.

    +0

    Czy możliwe jest wydrukowanie każdego dokumentu na osi 2d, aby uzyskać wizualną reprezentację, która pozwoli nam lepiej zrozumieć, ile klastra powinniśmy mieć lub gdzie powinien znajdować się środek ciężkości? – jxn

    +0

    Nigdy nie robiłem tego na całych dokumentach, ale nie widzę problemu z twoim pomysłem. Myślę, że powinno to być wykonalne. – elyase

    1

    TF/IDF to miara, która oblicza znaczenie słowa w dokumencie w odniesieniu do reszty wyrazów w tym dokumencie. Nie oblicza znaczenia samodzielnego słowa. (i ma sens, prawda? Ponieważ ważność zawsze oznacza przywilej nad innymi!). Zatem TF/IDF każdego słowa jest tak naprawdę miarą ważności dokumentu w odniesieniu do słowa.

    Nie widzę, gdzie w kodzie używany jest kod TF/IDF. Jednak możliwe jest obliczenie algorytmu kmeans przy użyciu wyników TF/IDF używanych jako funkcje. Również klastrowanie dla trzech przykładowych dokumentów, o których wspomniałeś, jest po prostu niemożliwe, podczas gdy żadne dwa dokumenty nie mają wspólnego słowa!

    Edit 1: Przede wszystkim, jeśli słowo „kot” występuje w dwóch dokumentach możliwe jest, że będą one skupione razem (w zależności od innych słów w dwóch dokumentach, a także inne dokumenty). Po drugie, powinieneś dowiedzieć się więcej o K-średnich. Widzisz, kmeans używa funkcji do grupowania dokumentów razem, a każdy wynik tf/idf dla każdego słowa w dokumencie jest miarą cechy, która została użyta do porównania tego dokumentu z innymi w korpusie.

    +0

    To są tylko przykłady, więc jeśli w 2 moim zdaniu istnieje słowo "kot", czy 2 zdania z "kotem" będą ze sobą połączone, skoro pozostałe słowa to stopwords? A jeśli tak, to czy algo oblicza wynik dla każdego zdania na podstawie tfidf każdego słowa w dokumencie (zakładając, że "kot" ma wysoki wynik tfidf)? – jxn

    +0

    @jenn sprawdź moją pierwszą edycję! daj mi znać, jeśli masz dalsze pytania. – user823743

    Powiązane problemy