Classificação de texto não estruturada

12

Vou classificar documentos de texto não estruturados, ou seja, sites de estrutura desconhecida. O número de classes para as quais estou classificando é limitado (neste momento, acredito que não haja mais que três). Alguém tem uma sugestão de como eu posso começar?

A abordagem "saco de palavras" é viável aqui? Mais tarde, eu poderia adicionar outro estágio de classificação com base na estrutura do documento (talvez árvores de decisão).

Eu estou um pouco familiarizado com o Mahout e o Hadoop, então prefiro soluções baseadas em Java. Se necessário, posso mudar para o Scala e / ou o mecanismo Spark (a biblioteca ML).

Grzegorz E.
fonte

Respostas:

14

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:

  1. Extração de recursos - transformando textos brutos em vetores de recursos.
  2. 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 .

amiga
fonte
O pôster original usou a palavra "classificar", mas "agrupar" é uma descrição mais precisa de seu problema, porque ele não possui definições de categorias a priori. Portanto, este não é necessariamente um problema de aprendizado supervisionado.
MrMeritology
@ MrMeritology: hmm, do contexto, eu diria que o autor não tem certeza sobre as classes concretas que ele vai usar, mas ainda deseja classificação, não agrupamento. De qualquer forma, ele é a única pessoa que sabe a verdade :)
ffriend
Talvez eu não estivesse claro no momento. As categorias serão selecionadas no aconselhamento, portanto, é mais uma classificação do que um problema de agrupamento. A idéia de criar um vetor de recursos complexos parece ser bastante razoável - especialmente que existem algumas tags específicas, que provavelmente provavelmente classificarão rapidamente algumas amostras. Não tenho certeza se o SVM se encaixará no problema, pois prevejo altas não-linearidades, mas as árvores de decisão e Bayes parecem ser aplicáveis. Estou começando a pensar também na aplicação de um algoritmo híbrido (árvores de decisão baseadas em SVM).
Grzegorz E.
@GrzegorzE. - Se suas categorias foram definidas com antecedência, liste essas três categorias na sua pergunta. Na minha opinião, você está muito focado nos algoritmos de ML e não é suficiente na natureza do seu problema e na natureza dos seus dados. Por exemplo, você prevê "não lineares" em recursos para sites de estrutura desconhecida. Por quê? Além disso, você está misturando tags com o texto da página da web com quem sabe o que mais, e eles têm um significado semântico diferente.
MrMeritology
@GrzegorzE. - Eu sugiro fortemente que seu método de classificação seja orientado principalmente pela natureza de suas categorias a priori e pela natureza dos dados. Há um número infinito de maneiras de categorizar sites arbitrários em 3 categorias. Cada maneira de categorizar irá sugerir características destacadas nos dados ou padrões destacados. Não há substituto para a análise manual de elementos de dados individuais (páginas da web) e seu contexto.
MrMeritology
5

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.

MrMeritology
fonte
4

Aqui estão alguns ótimos pacotes de software de código aberto para classificação de texto que devem ajudar você a começar:

  • O MALLET é um kit de ferramentas de aprendizado de máquina baseado em Java, licenciado em CPL, criado pela UMass para trabalhar com dados de texto. Inclui implementações de vários algoritmos de classificação (por exemplo, Bayes ingênuo, entropia máxima, árvores de decisão).
  • O Stanford Classifier do Stanford NLP Group é uma implementação Java licenciada pela GPL de um classificador de entropia máxima projetado para trabalhar com dados de texto.
Charlie Greenbacker
fonte