Efektywne grupowanie macierzy podobieństwa

moim tematem jest podobieństwo i grupowanie (kilku) tekstów. W skrócie: chcę zebrać zebrane teksty razem i powinny one pojawić się w znaczących klastrach na końcu. Aby to zrobić, moje dotychczasowe podejście jest następujące: mój problem tkwi w klastrowaniu. Aktualne oprogramowanie jest napisane w php.

1) Podobieństwo: traktuję każdy dokument jako „worek słów” i konwertuję słowa na wektory. używam

filtrowanie (tylko „prawdziwe” słowa)tokenizacja (podzielone zdania na słowa)wywodzenie (zmniejsz słowa do ich postaci bazowej; łodyga Portera)przycinanie (wycinanie słów ze zbyt wysoką i niską częstotliwością)

jako metody redukcji wymiarów. Następnie używam podobieństwa cosinusowego (jak sugerowano / opisano w różnych witrynach w siecii tu.

Wynik jest więc macierzą podobieństwa taką jak ta:

<code>        A   B   C   D   E 
    A   0  30  51  75  80
    B   X   0  21  55  70
    C   X   X   0  25  10
    D   X   X   X   0  15
    E   X   X   X   X   0
</code>

A… E to moje teksty, a liczba to podobieństwo w procentach; im wyżej, tym bardziej podobne są teksty. Ponieważ sim (A, B) == sim (B, A) wypełniona jest tylko połowa macierzy. Podobieństwo tekstu A do tekstu D wynosi 71%.

Chcę teraz wygenerować a priori nieznaną (!) Liczbę klastrów z tej macierzy. Klastry powinny reprezentować podobne elementy (do pewnego kryterium zatrzymania) razem.

Sam wypróbowałem podstawową implementację, która była w zasadzie taka (60% jako ustalony próg podobieństwa)

<code>    foreach article
      get similar entries where sim > 60
              foreach similar entry
              check if one of the entries already has a cluster number
              if no: assign new cluster number to all similar entries
              if yes: use that number
</code>

Zadziałało (jakoś), ale w ogóle nie było dobre, a rezultatem były często gromady potworów. Więc chcę to powtórzyć i już sprawdziłem wszystkie rodzaje algorytmów klastrowania, ale wciąż nie jestem pewien, który z nich będzie działał najlepiej. Myślę, że powinien to być algorytm aglomeracyjny, ponieważ na początku każda para tekstów może być postrzegana jako klaster. Ale nadal pytania są tym, czym jest kryterium stopp i czy algorytm powinien dzielić i / lub łączyć istniejące klastry razem.

Przepraszam, jeśli niektóre rzeczy wydają się podstawowe, ale jestem stosunkowo nowy w tej dziedzinie. Dzięki za pomoc.

questionAnswers(3)

yourAnswerToTheQuestion