Agrupación efectiva de una matriz de similitud.

mi tema es la similitud y la agrupación de (un montón de) texto (s). En pocas palabras: quiero agrupar los textos recopilados y deben aparecer en grupos significativos al final. Para hacer esto, mi enfoque hasta ahora es el siguiente, mi problema está en el agrupamiento. El software actual está escrito en php.

1) Similitud: trato cada documento como una "bolsa de palabras" y convierto las palabras en vectores. yo suelo

filtrado (solo palabras "reales")tokenización (dividir oraciones en palabras)stemming (reducir palabras a su forma base; stemmer Porter)poda (corte de palabras con frecuencia demasiado alta y baja)

Como métodos de reducción de la dimensionalidad. Después de eso, estoy usando la similitud de coseno (como se sugiere / describe en varios sitios en la weby aquí.

El resultado entonces es una matriz de similitud como esta:

<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 son mis textos y el número es la similitud en porcentaje; Cuanto más alto, más similares son los textos. Debido a que sim (A, B) == sim (B, A) solo se rellena la mitad de la matriz. Por lo tanto, la similitud del Texto A al Texto D es del 71%.

Quiero generar un número a priori desconocido (!) De clusters fuera de esta matriz ahora. Los grupos deben representar los elementos similares (hasta un cierto criterio de stopp) juntos.

Intenté una implementación básica, que fue básicamente así (60% como un umbral de similitud fijo)

<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>

Funcionó (de alguna manera), pero no fue bueno en absoluto y los resultados fueron a menudo grupos de monstruos. Entonces, quiero rehacer esto y ya he echado un vistazo a todos los tipos de algoritmos de agrupación en clústeres, pero todavía no estoy seguro de cuál funcionará mejor. Creo que debería ser un algoritmo aglomerado, porque al principio cada par de textos puede verse como un grupo. Pero aún así, las preguntas son cuál es el criterio de detención y si el algoritmo debe dividir y / o fusionar los clústeres existentes.

Lo siento si algunas de las cosas parecen básicas, pero soy relativamente nuevo en este campo. Gracias por la ayuda.

Respuestas a la pregunta(3)

Su respuesta a la pregunta