Vamos trabalhar a partir do zero. A classificação (também conhecida como categorização) é um exemplo de aprendizado supervisionado . No aprendizado supervisionado, você tem:
- modelo - algo que aproxima a estrutura interna dos seus dados, permitindo que você raciocine sobre ele e faça previsões úteis (por exemplo, prever a classe de um objeto); normalmente o modelo possui parâmetros que você deseja "aprender"
- conjuntos de dados de treinamento e teste - conjuntos de objetos que você usa para treinar seu modelo (encontrar bons valores para parâmetros) e avaliar melhor
- algoritmos de treinamento e classificação - primeiro descreve como aprender o modelo a partir do conjunto de dados de treinamento, o segundo mostra como derivar a classe de um novo objeto, dado o modelo treinado
Agora vamos dar um exemplo simples de classificação de spam. Seu conjunto de dados de treinamento é um conjunto de e-mails + marcadores correspondentes - "spam" ou "sem spam". O conjunto de dados de teste tem a mesma estrutura, mas é produzido a partir de alguns emails independentes (normalmente, um deles apenas divide seu conjunto de dados e faz, por exemplo, 9/10 deles para uso em treinamento e 1/10 - para teste). Uma maneira de modelar e-mails é representar cada um deles como um conjunto de palavras. Se assumirmos que as palavras são independentes umas das outras, podemos usar o classificador Naive Bayes , ou seja, calcular probabilidades anteriores para cada palavra e cada classe (algoritmo de treinamento) e aplicar o teorema de Bayes para encontrar a probabilidade posterior de um novo documento pertencer a classe particular.
Então, basicamente, temos:
raw model + training set + training algorithm -> trained model
trained model + classification algorithm + new object -> object label
Agora observe que representamos nossos objetos (documentos) como um saco de palavras. Mas é o único caminho? De fato, podemos extrair muito mais do texto bruto. Por exemplo, em vez de palavras como é, podemos usar suas hastes ou lemas , lançar palavras barulhentas , adicionar tags POS de palavras, extrair entidades nomeadas ou até explorar a estrutura HTML do documento. De fato, a representação mais geral de um documento (e, em geral, qualquer objeto) é um vetor de recurso . Por exemplo, para texto:
actor, analogue, bad, burn, ..., NOUN, VERB, ADJ, ..., in_bold, ... | label
0, 0, 1, 1, ..., 5, 7, 2, ..., 2, ... | not spam
0, 1, 0, 0, ..., 3, 12, 10, ..., 0, ... | spam
Aqui a primeira linha é uma lista de recursos possíveis e as linhas subseqüentes mostram quantas vezes esse recurso ocorre em um documento. Por exemplo, no primeiro documento, não há ocorrências da palavra "ator", 1 ocorrência da palavra "queimadura", 5 substantivos, 2 adjetivos e 2 partes de texto em negrito. A última coluna corresponde a um rótulo de classe resultante.
Usando o recurso vector, você pode incorporar quaisquer propriedades dos seus textos. Embora encontrar um bom conjunto de recursos possa levar algum tempo.
E o modelo e algoritmos? Estamos ligados a Naive Bayes. De modo nenhum. regressão logística , SVM , árvores de decisão - apenas para mencionar alguns classificadores populares. (Observe que dizemos "classificador" na maioria dos casos, queremos dizer modelo + algoritmos correspondentes para treinamento e classificação).
Quanto à implementação, você pode dividir a tarefa em 2 partes:
- Extração de recursos - transformando textos brutos em vetores de recursos.
- Classificação de objetos - construindo e aplicando modelo.
O primeiro ponto é bem elaborado em muitas bibliotecas de PNL . O segundo é sobre aprendizado de máquina; portanto, dependendo do seu conjunto de dados, você pode usar o Weka ou o MLlib .
A modelagem de tópicos seria um método muito apropriado para o seu problema. Os Modelos de Tópicos são uma forma de aprendizado / descoberta não supervisionada, em que um número especificado (ou descoberto) de tópicos é definido por uma lista de palavras com alta probabilidade de aparecerem juntas. Em uma etapa separada, você pode rotular cada tópico usando especialistas no assunto, mas para seus propósitos isso não é necessário, pois você só está interessado em obter três clusters.
Você trata cada documento como um conjunto de palavras e pré-processa para remover palavras de parada, etc. Com os métodos mais simples, você pré-especifica o número de tópicos. No seu caso, você pode especificar "3", que é seu limite fixo de categorias, ou escolher um número maior de tópicos (entre 10 e 100) e, em uma etapa separada, formar três grupos de documentos com ênfase comum em tópicos. Podem ser utilizados meios K ou outros métodos de agrupamento. (Eu recomendaria a última abordagem)
Você não precisa codificar o software de modelagem de tópicos do zero. Aqui está uma página da web com muitos recursos, incluindo bibliotecas / pacotes de software .
Nenhum está em Java, mas existem maneiras de executar C ++ e Python em Java.
fonte
Aqui estão alguns ótimos pacotes de software de código aberto para classificação de texto que devem ajudar você a começar:
fonte