Classificando textos com Machine Learning
A classificação de textos é uma das mais importantes aplicações do processamento de linguagem natural hoje em dia. É o que possibilita diversas interações entre usuários uma infinidade de ferramentas computacionais disponíveis hoje. Entre estas ferramentas, estão os chatbots. Neste post, você verá como classificar textos com machine learning e a linguagem Python. Você vai precisar do framework Scikit-Learn instalado na sua máquina. Eu sugiro que instale a ferramenta Anaconda, com a qual é muito fácil instalar diversas outras ferramentas do ecossistema python, incluindo o Scikit-Learn. Eu vou assumir que você já conheça a linguagem Python e já possui um entendimento básico do framework acima mencionado. Este post acompanha um vídeo, cujo link está no final. Você também poderá baixar o código no github.
O dataset
O “20 Newsgroups” é um conjunto de dados disponível publicamente para uso em pesquisas. Contém aproximadamente 20k documentos, divididos em cerca de 20 categorias. É um data set popular e conhecido pelo seu uso tarefas de classificação de textos em machine learning. Os conteúdos do data set estão separados por categoria e algumas destas categorias são muito próximas: comp.sys.ibm.pc.hardware / comp.sys.mac.hardware. Há outras categorias que não possuem quaisquer semelhanças: rec.autos / talk.politics.misc. Nosso objetivo aqui é obter um modelo capaz de classificar textos em algumas destas categorias.
Importando nossas classes, o dataset e demais funções
Nós contaremos com dois algoritmos diferentes para gerar o nosso modelo: Um SVM (por meio do estimador SGDClassifier) e uma rede neural Perceptron Multicamadas, que nada mais é do que uma rede neural feed-forward. O objetivo é experimentar um estimador de cada vez, para averiguar a performance de cada um no conjunto de dados validação. Em seguida, usaremos nosso modelo para fazer predições em dados que não foram vistos no conjunto de treino. No vídeo que acompanha este post, eu experimentei os dois estimadores e foi possível notar que a rede neural se saiu melhor. Neste post, entretanto, você verá que eu deixei comentada a linha que permite treinar o modelo via SGDClassifier, usando apenas o MPLClassifier. Mas basta que você remova o comentário no código, para que possa testar com ambos os estimadores, um de cada vez, como fiz durante o vídeo.
Limitando a quantidade de categorias e obtendo os dados de treino
Apenas por uma questão de agilidade, iremos reduzir a quantidade de dados a serem processados. Conseguiremos isto ao limitar o número de categorias em apenas duas. Nosso modelo classificará textos na área de política e automobilismo. Você pode escolher qualquer uma das categorias ilustradas na imagem anterior, ou utilizar todas elas :-).
Treinando o classificador
Dados textuais representam valores discretos, e nosso classificador “só entende números”. Nós precisamos converter os dados brutos, que estão em formato de texto, para uma formato numérico. Isto deve acontecer antes de podermos passar os dados para o nosso classificador.
É preciso levar em conta, ainda, que algumas palavras no corpus de treino serão muito presentes, como é o caso de preposições e artigos. Estas palavras tendem a se repetir em todos os documentos e não costumam carregar informação muito significativa para o que precisamos aqui. Nós utilizaremos a medidade TF-IDF para limitar a importância destas palavras que se repetem muito ao longo dos documentos, de maneira que elas não causem mais influência do que o necessário. TF-IDF significa frequência do termo–inverso da frequência nos documentos e se baseia na seguinte formula.
Abaixo, nós iniciamos o processo de treino do nosso classificador, o que corresponderia a ajustar o estimador aos dados que nós temos. Iremos usar o MLPClassifier, mas deixei o SGDClassifier comentado, caso queira testar este estimador também. O MLPClassifier é, na verdade, uma rede neural Feed-Foward.
O comando clf.fit() é responsável por treinar o nosso modelo.
Avaliando a performance
Agora, nós precisamos avaliar a performance do nosso modelo para sabermos o quanto ele aprendeu com os dados de treino. Para isto, utilizaremos um subconjunto dos dados, os dados que separamos para os testes.
Em meus testes, eu obtive o seguinte resultado:
Matriz de Confusão
Usada para visualizar a performance de um classificador. As linhas da matriz indicam as classes que se espera obter corretamente por meio do modelo. As colunas indicam as classes que foram obtidas efetivamente. Cada célula contém o número de predições feitas pelo classificador, relativas ao contexto daquela célula específica.
A saída do código acima será algo como a seguinte figura:
Fazendo predições em dados novos
Agora, chega a parte mais interessante, que é usar o nosso modelo para classificar textos que não estão presentes no conjunto de dados de treino, ou seja, textos que o modelo ainda “não viu”. Considerando que o dataset é composto de textos apenas em inglês, então, o nosso modelo não vai “entender outra língua”. É por isso que iremos testar o nosso modelo com textos em inglês:
O código acima irá exibir cada texto apresentado ao modelo por meio do array, com a categoria ao lado. Por exemplo, no meu experimento, eu obtive o seguinte retorno:
Para mais detalhes e maiores explicações, veja o vídeo que disponibilizei junto com o post.
E se você quiser saber um pouco mais sobre machine learning, veja o vídeo da live que apresentei recentemente, onde comentei sobre alguns aspectos teóricos desta que está sendo a profissão mais cobiçada da atualidade:
Aprenda a criar modelos de Machine Learning para processamento de linguagem natural em ambientes de produção com Tensorflow e Scikit-learn. Este curso na Udemy vai te ensinar passo a passo. Mais detalhes no vídeo abaixo: