Classificação de texto em grande escala

18

Estou procurando fazer uma classificação nos meus dados de texto. Tenho 300 classes200 documentos de treinamento por turma (mais ou menos 60000 documents in total) e é provável que isso resulte em dados dimensionais muito altos (podemos estar olhando além das dimensões de 1 milhão ).

Gostaria de executar as seguintes etapas no pipeline (apenas para lhe dar uma idéia de quais são meus requisitos):

  1. Convertendo cada documento para caracterizar vetor ( tf-idfou vector space model)
  2. Feature selection(de Mutual Informationpreferência, ou qualquer outro padrão)
  3. Treinar o classificador ( SVM, Naive Bayes, Logistic Regressionou Random Forest)
  4. Prevendo dados não vistos com base no modelo do classificador treinado.

Portanto, a pergunta é quais ferramentas / estrutura eu uso para lidar com esses dados de alta dimensão? Estou ciente dos suspeitos do costume (R, WEKA ...), mas no que diz respeito ao meu conhecimento (posso estar errado), possivelmente nenhum deles pode lidar com dados tão grandes. Existe alguma outra ferramenta disponível para venda?

Se eu tiver que paralelizar, devo olhar para o Apache Mahout ? Parece que ainda não fornece a funcionalidade necessária.

Agradecemos antecipadamente a todos.


Atualização: eu procurei neste site , na lista de discussão R e na internet em geral. Parece-me que os seguintes problemas podem surgir na minha situação:

(1) O pré-processamento dos meus dados usando o R ( em particular o pacote tm ) pode ser impraticável , pois tmserá proibitivamente lento.

(2) Como eu precisarei usar um conjunto de pacotes R (pré-processamento, matrizes esparsas, classificadores etc.), a interoperabilidade entre os pacotes pode se tornar um problema, e posso incorrer em uma sobrecarga adicional na conversão de dados de um formato para outro . Por exemplo, se eu fizer meu pré-processamento usando tm(ou uma ferramenta externa como WEKA), precisarei descobrir uma maneira de converter esses dados em um formato que as bibliotecas HPC no R possam ler. E, novamente, não está claro para mim se os pacotes classificadores receberiam diretamente os dados, conforme fornecidos pelas bibliotecas HPC.

Estou no caminho certo? E mais importante, estou fazendo sentido?

user721975
fonte
O R pode lidar com conjuntos de dados muito maiores que isso, basta fazer bom uso das ferramentas disponíveis. Não há diferença entre o que pode ser realizado em qualquer idioma ou ambiente importante, embora Weka e Mahout estejam atrasados ​​em termos do que está disponível. FWIW, esse é um tamanho de amostra bastante pequeno e as dimensões de 1 milhão não são demais, mas também são um exagero estatisticamente. Minhas recomendações são R ou Python, pois são gratuitas e fáceis para iniciantes. O Matlab não é gratuito, mas também é bom. Também incorre em um grande imposto quando você usa muitos computadores.
Iterator
1
Um ponto muito mais saliente é que você tem mais classes do que exemplos por classe e a incorpora em um espaço dimensional muito alto. Não tenho certeza de que você terá uma boa separação de classes aqui. Você tem algumas relações estruturais para suas aulas? Nesse caso, alguns desses métodos podem se dar mal sem esse insight.
Iterator
1
Você pode usar a foreachbiblioteca para escrever código paralelo em R. Isso funciona especialmente bem em conjunto com florestas aleatórias, que são inerentemente fáceis de paralelizar.
Zach
2
Algumas perguntas: 1) Você está interessado em comparar todos os diferentes tipos de abordagens de aprendizado mencionadas ou precisa apenas de uma para realizar um trabalho? 2) Cada documento pertence a 1, 1 ou mais ou 0 ou mais das classes? 3) Você especificamente deseja usar seleção de recurso, por algum motivo, ou você simplesmente acho que era necessário? Concordo com os outros comentários de que este é um problema de tamanho modesto para os padrões atuais, e a redução da dimensionalidade não é necessária.
precisa saber é o seguinte
1
Estou trabalhando na classificação de texto envolvendo quase 10.000 tópicos (por exemplo, aulas ou categorias ou o termo que você preferir). Atualmente, estou trabalhando para ajustar esse sistema de classificação de texto nessa escala. Não posso compartilhar minhas próprias técnicas, pois são proprietárias, mas tenho um conselho: tenha muito cuidado ao assumir que algumas técnicas sugeridas escalam, a menos que já tenha sido comprovado. Na minha experiência, muito poucos o fazem.

Respostas:

13

Isso deve ser possível fazê-lo funcionar desde que os dados sejam representados como uma estrutura de dados esparsa, como scipy.sparse.csr_matrixinstância em Python. Eu escrevi um tutorial para trabalhar com dados de texto . É ainda possível reduzir ainda mais o uso da memória, aproveitando o truque de hash: adapte-o para usar o em HashingVectorizervez de CountingVectorizerou o TfidfVectorizer. Isso é explicado na seção de documentação, extração de recursos de texto .

As florestas aleatórias são em geral muito mais caras que os modelos lineares (como máquinas de vetores de suporte linear e regressão logística) e Bayes multinomial ou Bernoulli ingênuo e para a maioria dos problemas de classificação de texto que não trazem precisão preditiva significativamente melhor do que os modelos mais simples.

Se o scikit-learn acabar não sendo capaz de escalar para o seu problema, o Vowpal Wabbit fará (e provavelmente mais rápido que o sklearn), embora não implemente todos os modelos dos quais você está falando.

Editado em abril de 2015 para refletir o estado atual da biblioteca scikit-learn e corrigir links quebrados.

ogrisel
fonte
Bem, o problema com o uso de qualquer técnica de redução de dimensão "não padrão" é que você provavelmente terá problemas ao publicar seu trabalho. Pelo menos no campo de classificação de texto, eu sei que os revisores gostam de ver as técnicas mais usadas (facilita a comparação com as técnicas de classificação existentes também).
user721975
Não se preocupe - o @ogrisel não mencionou nada de fora do padrão, pelo menos não no que diz respeito à classificação de texto de última geração, embora eu ainda não tenha lido seus tutoriais.
Iterator
+1 Acho que o Python é provavelmente um caminho agradável a seguir. Existem alguns pacotes muito recentes em R para mineração de texto, mas se alguém tiver mais conhecimentos e interesses computacionais que estatísticos, Python seria minha recomendação.
Iterator
@ogrisel: Parabéns pelas contribuições que você e outras pessoas fizeram no sklearn. Eu o recomendei para muitos que trabalham em Python - todo o design é exemplar.
Iterator
Quanto à redução de dimensão "não-padrão" (usando projeções aleatórias) e hash de recursos, verifique o truque de hash de John Langford e esta discussão sobre meta-otimização .
ogrisel
10

Gensim para Python é mágico. E como está no Python, você pode usá-lo em conjunto com a sugestão do @ ogrisel.

Jeff
fonte
1

Para não tocar minha buzina, fiz uma série de vídeos bastante popular sobre análise de texto com o Rapidminer. Você pode vê-lo aqui:

http://vancouverdata.blogspot.com/2010/11/text-analytics-with-rapidminer-loading.html

Você provavelmente pode evitar a seleção de recursos, basta usar um classificador que não cria uma matriz de milhões * milhões na memória :)

A regressão logística sufocará em muitas dimensões. Naive Bayes assume dimensões independentes, então você ficará bem. O SVM não depende do número de dimensões (mas do número de vetores de suporte), portanto também será bom.

300 são muitas classes, no entanto. Eu começaria com apenas alguns e subisse.

Neil McGuigan
fonte
Ótimo ponteiro e conselhos. Obrigado. Você pode, por favor, elaborar o que você quer dizer com "comece com apenas alguns e continue subindo"?
user721975
bem, em vez de 300 classes (como "violino, viola, violoncelo, trompete ..."), você pode reclassificá-las para um número menor, como "cordas, metais".
Neil McGuigan
OK, entendi agora.
user721975
1

Primeiro, com base nos seus comentários, eu trataria isso como 300 problemas de classificação binária (sim / não). Existem muitos alunos de classificador binário de código aberto fáceis de usar, e isso permite que você troque tempo pela memória.

SVMs e regressão logística são provavelmente as abordagens mais populares para classificação de texto. Ambos podem lidar facilmente com 1000000 dimensões, uma vez que implementações modernas usam estruturas de dados esparsas e incluem configurações de regularização que evitam o ajuste excessivo.

Vários conjuntos de aprendizado de máquina de código aberto, incluindo WEKA e KNIME , incluem SVMs e regressão logística. As implementações independentes de SVMs incluem libSVM e SVMlight . Para regressão logística, conectarei o BXRtrain e o BXRclassify , que desenvolvi com Madigan, Genkin e outros. O BXRclassify pode criar um índice na memória de milhares de modelos de regressão logística e aplicá-los simultaneamente.

Quanto à conversão de texto em atributo de forma vetorial, de alguma forma sempre acabo escrevendo um pouco de Perl para fazer isso do zero. :-) Mas acho que as suítes de aprendizado de máquina que mencionei incluem código de tokenização e vetorização. Outra rota seria usar um conjunto de ferramentas de linguagem natural como o LingPipe , embora isso possa ser um exagero para você.

DavidDLewis
fonte
+1 Bons comentários. Se eu fizesse 300 classificações sim / não, como selecionaria os dados negativos do treinamento para uma classe? Dados positivos obviamente são os documentos que pertencem à classe.
user721975
Outro comentário. O registro SVM / Logistic pode com certeza manipular um milhão de dimensões, mas como eu poderia executar experimentos para escolher parâmetros para esses classificadores? Por exemplo, em um pequeno conjunto de dados, você pode executar a validação cruzada de 10 vezes para decidir sobre os parâmetros, mas que abordagem é adotada para dados tão grandes, para que o algoritmo termine a execução em um tempo razoável?
user721975
@ user721975: Para uma discriminação específica, os documentos positivos são aqueles com a etiqueta X e os documentos negativos são o restante dos documentos.
precisa saber é o seguinte
@ user721975: É difícil dar conselhos gerais sobre o tempo de execução, pois os detalhes variam muito entre algoritmos e implementações. A validação cruzada de 10 vezes pode não ser impraticável para o seu conjunto de dados: 60000 exemplos não são importantes.
precisa saber é o seguinte
1
Conjuntos de treinamento desequilibrados não são necessariamente um problema. Mas, na verdade, percebo que há algo em que estou confuso: como os documentos podem pertencer a 0, 1 ou várias classes, o que você quer dizer com ter 200 documentos de treinamento por classe? Você fez algo para remover documentos com 0 classes ou mais de 2 classes? Em geral, como você gerou esse conjunto de 60000 documentos?
precisa saber é o seguinte
1

Desde o Sklearn 0.13, existe de fato uma implementação do HashingVectorizer .

Edição: Aqui está um exemplo completo de tal aplicativo de sklearn docs

Basicamente, este exemplo demonstra que você pode classificar texto em dados que não cabem na memória principal do computador (mas no disco / rede / ...).

oDDsKooL
fonte