Agrupamento efetivo de uma matriz de similaridade

Meu tópico é semelhança e agrupamento de (um monte de) texto (s). Resumindo: quero agrupar textos coletados juntos e eles devem aparecer em clusters significativos no final. Para fazer isso, minha abordagem até agora é a seguinte, meu problema está no cluster. O software atual é escrito em php.

1) Semelhança: eu trato cada documento como um "saco de palavras" e converto palavras em vetores. eu uso

filtragem (apenas palavras "reais")tokenização (dividir sentenças em palavras)stemming (reduza as palavras à sua forma básica; o stemmaker de Porter)poda (corte de palavras com frequência muito alta e baixa)

como métodos para redução de dimensionalidade. Depois disso, estou usando semelhança de cosseno (como sugerido / descrito em vários sites na webe aqui.

O resultado então é uma matriz de similaridade 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 são meus textos e o número é a similaridade em porcentagem; quanto mais alto, mais semelhantes são os textos. Porque sim (A, B) = = sim (B, A) apenas metade da matriz é preenchida. Assim, a similaridade do Texto A ao Texto D é de 71%.

Eu quero gerar um número a priori desconhecido (!) De clusters fora desta matriz agora. Os clusters devem representar os itens semelhantes (até um certo critério stopp) juntos.

Eu tentei uma implementação básica eu mesmo, que era basicamente assim (60% como um limiar de similaridade fixa)

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

Funcionou (de alguma forma), mas não foi nada bom e os resultados foram frequentemente agrupamentos de monstros. Então, eu quero refazer isso e já dei uma olhada em todos os tipos de algoritmos de clustering, mas ainda não tenho certeza qual deles funcionará melhor. Eu acho que deveria ser um algoritmo aglomerativo, porque cada par de textos pode ser visto como um cluster no começo. Mas ainda assim as perguntas são o critério do stopp e se o algoritmo deve dividir e / ou mesclar os clusters existentes juntos.

Desculpe se algumas das coisas parecem básicas, mas eu sou relativamente novo neste campo. Obrigado pela ajuda.

questionAnswers(3)

yourAnswerToTheQuestion