Inteligência Artificial: Análise de sentimentos com Python

Um tutorial de Processamento de Linguagem Natural com NLTK, Pandas, Numpy e Matplotlib.

Wesley Watanabe
5 min readJun 26, 2019

A definição da Wikipedia de Processamento de linguagem natural (PLN) é:

Uma subárea da ciência da computação, inteligência artificial e da linguística que estuda os problemas da geração e compreensão automática de línguas humanas naturais. Alguns desafios do PLN são compreensão de língua natural, fazer com que computadores extraiam sentido de linguagem humana ou natural e geração de língua natural.

O propósito deste artigo é abordar a extração do sentimento da linguagem humana, aprender com uma base de conhecimento e poder gerar resultados automáticos desses inputs.

O que vamos fazer:

  • Carregar dados
  • Fazer a manipulação e transformação desse dados
  • Criar um modelo e treiná-lo
  • Avaliar a acuracidade do modelo com dados de teste
  • Criar um gráfico de análise de sentimento dos dados recebidos

Pré processamento: Na base original fornecida no Kaggle temos aproximadamente 500 mil linhas, como o processamento de uma grande quantia como essa pode demorar bastante, eu peguei uma amostra bem menor para podermos usar no nosso modelo de NLP (Natural Language Processing).
A base original foi traduzida literalmente (“aparentemente”) por alguma ferramenta de tradução automática, então os textos podem não fazer tanto sentido em português em alguns casos.

Arquivos usados nesse artigo:

Download do dataset original:
https://www.kaggle.com/luisfredgs/imdb-ptbr/kernels

Download dados usados nesse tutorial: https://drive.google.com/drive/folders/1hwhqN-CUIGGZZXpVnka08yaItZsMQapx?usp=sharing

Mãos a obra:

Vamos importar o NLTK ( Natural Language Toolkit ), uma das bibliotecas mais usadas para processamento de linguagem natural.

Após isso importamos a nossa base reduzida através do pandas.

Aplicamos um ‘group by’ por tipo de sentimento na base para identificar como os dados estão separados.

Vamos começar a tratar os dados para o nosso modelo de ml. Nessa parte removemos a coluna do dataset em inglês e adicionamos uma coluna de 0 e 1 de acordo com a coluna de sentimento.

Quando trabalhamos com análises de textos é geralmente usado palavras (salvo exceções) em minúsculo, pelo simples fato que a palavra “Carro” não pode ser diferente de “carro” para o modelo.

Função simples para remover brackets.

Tokenização, Stemmer e StopWords: Essa é a parte mais demorado para preparar os dados para o modelo. Aqui criamos uma tokenização dos dados, aplicamos a remoção de stop words (palavras que não agregam na frase) e apos isso o Stemming (Remoção dos sufixos). Esses conceitos são bem importantes para esse processo, recomendo uma leitura mais profunda sobre.

Remoção de sufixos

Criamos um token com regex para remover alguns símbolos e números.
Iniciamos um CountVectorizer, para podermos aplicar no texto. Importante, aqui aplicamos o ngram_range (1,2), onde determinamos o tamanho minimo e máximo de um Ngram.
E finalmente convertemos text_pt para uma matriz sparsa, e logo após imprimimos o vocabulário do CountVectorizer.

Exemplo de como os dados ficam numa matriz sparsa

Nesse momento vamos dividir o nosso dataframe em duas partes, uma parte de treino e outra para teste.

Como essa base já possui o tipo de sentimento para cada texto (Temos um target (Y) ), vamos aplicar o tipo de aprendizado supervisionado.
Usando o Naive Bayes — MultinomiaNB do scikit-learn, aplicamos o treino e fazemos um predict dos dados de teste.

A acuracidade do modelo nós traz um percentual de acerto de 91% com os dados de teste. O próximo passo é usar o modelo com dados novos.

Lê o arquivo de texto para separar em parágrafos e frases. Usei no exemplo um texto de uma crítica de cinema, o arquivo consta no início do artigo.

O código abaixo é muito semelhante ao primeiro processamento feito na parte de cima, a minha escolha de não acoplar em funções foi para que eu possa fazer algum tipo de pre-processamento dos dados diferente (num futuro) de uma base não 100%, por exemplo um dados vindo de um web scrapping. Portanto aplicações parecidas, com a diferença que estou analisando frase por frase e gerando um contador de positivo e negativo.

Com os nossos dados contabilizados em quantidade de negativo e positivo o próximo passo é criar um gráfico de pizza.
Nesse caso passamos o dataframe com os valores e geramos o gráfico usando a biblioteca matplotlib.

Gráfico gerado:

Espero que eu tenha te ajudado a absorver o conhecimento contido neste artigo, há muitas possibilidades de aplicações de NPL no nosso dia a dia. Pretendo fazer mais artigos nessa linha, caso tenho alguns sugestão comente.

Github

https://github.com/wesleykaoru/npl_nltk

Obrigado por ler esse artigo!!!

Você pode me achar no Linkedin: https://www.linkedin.com/in/wesleywatanabe/

Wesley Watanabe

--

--