Primeiras aulas do curso Linguagem Natural parte 1: introdução a NLP com análise de sentimento

Linguagem Natural parte 1: introdução a NLP com análise de sentimento

Dados Textuais: classificação e exploração. - Introdução

Boas-vindas ao curso de Introdução ao Processamento de Linguagem Natural. Você já deve ter se perguntado como o Google faz, por exemplo, quando você digita na barra de busca deles, para interpretar o que você está querendo dizer, e trazer as respostas mais relevantes, assim como o Google Home ou a Alexa fazem para entender o que você está falando. Tudo isso está intrinsecamente relacionado com Processamento de Linguagem Natural.

Iniciaremos o curso criando um analisador de sentimentos. Imaginemos que queremos assistir um filme, e busquemos críticas sobre ele na internet. Você lê, interpreta, e classifica a resenha como boa ou ruim. É exatamente isso que ensinaremos o computador a fazer, a classificar críticas de filmes. Para isso, importaremos uma base de dados já classificada, depois criaremos um modelo de Machine Learning capaz de interpretar a linguagem humana e classificar o texto.

Utilizaremos algumas visualizações como as word clouds para obtermos insights sobre como podemos melhorar, que pré-processamentos podemos fazer em nossos textos para torná-los mais interpretáveis o possível, para que o computador entenda melhor o que é um sentimento ruim e um sentimento positivo.

Também iremos criar um pareto que nos auxiliará na análise desses dados. Depois, aprenderemos o que é tokenização, e a utilizar o NLTK (Natural Language Toolkit), que é uma das principais bibliotecas do mundo do Processamento de Linguagem Natural.

Faremos tudo isso neste curso. Espero vocês! Meu nome é Thiago e serei o seu instrutor.

Dados Textuais: classificação e exploração. - Machine Learning para classificar textos

Conforme vimos na introdução, o que iremos criar em nosso curso? Vamos criar um analisador de sentimentos, ou seja, um modelo de Machine Learning capaz de analisar um determinado texto e classificá-lo de acordo com o sentimento, se a pessoa gostou ou não do texto. Para isso utilizaremos uma base de dados do IMDb (Internet Movie Database), uma plataforma que reúne dados de filmes, programas, comerciais, música e até de jogos.

O único problema é que ele é todo em inglês, e queremos criar algo em português, para facilitar e ficar mais próximo de todo mundo. Para isso, utilizaremos uma base de dados disponível no Kaggle, podemos digitar "Kaggle" na barra de pesquisa do Google e escolhemos a primeira opção. No camp ode busca do Kaggle vamos buscar por por "imdb pt".

Dentre os resultados, optaremos por "IMDB PT-BR", tradução automática de uma das bases do IMDb realizada por um membro da comunidade. Tal base consiste em aproximadamente 50 mil resenhas de filmes já classificadas como positivas ou negativas, mas em inglês. O que ele fez foi traduzir, mesmo que uma tradução automática, para o português, disponível para uso.

Basta clicarmos no botão de download no topo da página, sendo necessário nos cadastrarmos para isto. Salvaremos a base de dados em alguma pasta local, e então poderemos começar a trabalhar com esses dados. Neste curso, utilizaremos o Jupyter Notebook, você pode utilizar o Google Colab, ou os próprios Kernels do Kaggle.

Para a leitura da base de dados usaremos o Pandas, então digitaremos import pandas as pd. O texto da base de dados é como se fosse uma resenha, a opinião da pessoa em relação a determinado filme, então chamaremos este dado de resenha = pd.read_csv("dados/imdb-reviews-pt-br.csv"), que é onde se encontram os dados.

Vamos dar uma olhada em como estão estes dados? Rodaremos resenha.head(), e obteremos uma tabela contendo "id"; "text_eng", o texto em inglês; "text_pt", o mesmo texto em português; e o "sentiment", o sentimento correspondente. Ou seja, se em relação a esse primeiro texto a opinião da pessoa é negativa ou positiva, no caso foi negativa. Legal, vamos digitar resenha e pressionar "Enter" para vermos ela integralmente.

A tabela é similar, com as quatro colunas já mencionadas, mas no começo temos os textos cujos sentimentos são negativos, e lá embaixo os de sentimento positivo. Temos aproximadamente 50 mil linhas, isto é, 50 mil resenhas. Este é um número suficiente para conseguirmos treinar o modelo para a classificação do sentimento.

Nos cursos de Machine Learning da Alura, você já deve ter visto que precisamos de uma parte para treinar o modelo e uma parte para testar o nosso modelo Então, iremos separar os nossos dados em treino e teste; ao buscarmos por "train test" no Google, um dos primeiros resultados será o SKLearn Model Selection, página acessível neste link. Utilizaremos esta biblioteca, Sklearn e o método train_test_split, para segregar os nossos dados.

Isso porque queremos realizar uma primeira classificação, para termos um baseline e vermos como os dados se comportam. Para importar esse método rodaremos: from sklearn.model_selection import train_test_split, o retorno será uma lista com os dados segregados. Queremos os dados de treino, teste, a classe_treinoe classe_teste. Usaremos o train_test_split, para o qual passaremos a coluna que queremos segregar, no caso, text_pt, para classificarmos os textos em português.

Além disso, também passaremos a coluna cuja proporção deve ser seguida, que neste caso é "sentiment", a coluna que gerará as classes de treino, ou seja, são as labels. Por fim, passaremos também random_state = 42, que pode ser qualquer número.

from sklearn.model_selection import train_test_split

treino, teste, classe_treino, classe_teste = train_test_split(resenha.text_pt,
                                                              resenha.sentiment,
                                                              random_state = 42)

Rodaremos, e com isso dividimos nossos dados em "treino" e "teste", e para testarmos podemos digitá-los individualmente, para que sejam exibidos.

Feito isso, importaremos o SKLearn Linear Model Logistic Regression para realizarmos o treinamento e depois a classificação. E então precisaremos treinar, e para tal criaremos a variável regressao_logistica, que recebe LogisticRegression. Depois, chamaremos regressao_logistica.fit para treinar com os dados de treino e as labels de treino, classe_treino.

from sklearn.linear_model import LogisticRegression

regressao_logistica = LogisticRegression()
regressao_logistica.fit(treino, classe_treino)

Em seguida, como queremos testar e saber um valor de acerto, a acurácia, para o qual existe um parâmetro pronto para uso, o score. Passaremos para ele os dados de teste e as labels de teste, e ele nos retornará a acurácia desses dados, e isto se chamará acuracia. Também pediremos para que ela seja impressa na tela.

from sklearn.linear_model import LogisticRegression

regressao_logistica = LogisticRegression()
regressao_logistica.fit(treino, classe_treino)
acuracia = regressao_logistica.score(teste, classe_teste)
print(acuracia)

Vamos ver qual será o resultado?

Ele retornou uma mensagem de erro. A mensagem diz que "não foi possível converter string para float". Nossa, que interessante. Isso porque os nossos textos não estão da maneira como os modelos de Machine Learning conseguem interpretar. E é nesse ponto que o NLP entra, o PLN (Processamento de Linguagem Natural) é responsável pela realização desta interpretação, transformando o texto em algo legível para máquinas.

De alguma maneira, é realizar uma tradução entre ser humano e máquina. Em nosso curso, nós focaremos em realizar e aprender algumas destas formas, e também em como melhorá-las, deixando-as mais limpas para o computador. Vamos realizar esta tradução, transformar nossos dados de texto em formas legíveis aos modelos de Processamento de Linguagem Natural, para os nossos modelos de Machine Learning?

Dados Textuais: classificação e exploração. - Explorando dados textuais

Antes de prosseguirmos, vamos dar uma olhada no que fizemos? Buscamos uma base de dados com opiniões sobre filmes, e essa base de dados já vem rotulada para conseguir treinar o nosso modelo de Machine Learning supervisionado, depois repartimos nossos dados entre "treino" e "teste", e tentamos aplicar o modelo de regressão logística, para treinarmos e gerarmos o modelo preditivo.

O problema é que o nosso modelo preditivo não interpreta dados textuais, então, de alguma forma, precisaremos traduzir os nossos textos em algo que a máquina consegue ler. Antes de entrarmos neste assunto de tradução dos dados textuais para uma linguagem plausível para os nossos modelos de Machine Learning, quero salientar alguns pontos importantes no Processamento de Linguagem Natural.

O primeiro ponto é que precisamos conhecer um pouco mais sobre os nossos textos, a nossa base de dados, como ela se comporta, se são textos longos, curtos, se temos dicas que podem existir no texto, para os classificarmos como sendo positivos ou negativos, isso tudo pode facilitar na criação do modelo. Vamos ver algum exemplo?

Imaginemos uma situação em que temos uma frase como "filme ok", isso é bom ou ruim para você? É difícil dizer, não? Mas e se depois do texto tivermos uma carinha triste, ":("? Fica mais simples, e isso nos ajuda a definir esse texto como algo negativo. Mas a vida não é assim, geralmente os dados textuais são longos, requerem uma análise maior e precisam de um olhar mais cuidadoso. Assim, conseguiremos ter insights futuramente sobre como melhorarmos.

Ao longo do curso, perceberemos que isso é essencial. Então, algo interessante de se fazer é conhecer um pouco dos textos. Vamos printar o texto de uma resenha classificada como negativa. Você lembra quais são? São as primeiras, no topo da nossa tabela. Pediremos para que seja impressa a de posição 189, por exemplo, e daremos uma olhada neste texto.

print("Negativa \n")
print(resenha.text_pt[189])

É importante lermos, para vermos mais ou menos como é a escrita, entender um pouco se ela é formal ou informal, se possui muitos números, ou não. Tudo isso facilitará sua vida a longo prazo. Neste caso, quando pegamos uma resenha de classificação negativa, vemos de cara "Este é sem dúvida o pior filme que eu já vi". Para nós, fica fácil assim, basta lermos a primeira linha. Mas o computador não consegue ter essa análise semântica tão facilmente.

Conhecer os dados nos ajuda a salientar as palavras mais importantes para o nosso texto, para a nossa semântica, ou seja, as palavras que farão a diferença no momento da classificação dos textos. Vamos verificar um exemplo positivo? Os exemplos posotivos estão lá para o final, vou pegar o 49002.

print("Positivo \n")
print(resenha.text_pt[49002])

Um texto longo, com pontuação, não há nenhuma carinha feliz ou triste para nos auxiliar, mas vemos isso escrito em caixa alta "BRILHANTE!". Mais uma vez, para um computador isso não torna a classificação mais clara, acaba sendo um desafio conseguir entender a semântica por trás do texto, o que ele está querendo dizer.

Conforme dito, conhecer um pouco dos textos é importante, e irá nos ajudar a melhorar a modelagem, ou seja, salientar as palavras mais importantes, aquilo que é fundamental. Ao longo do curso faremos isso. Outra coisa interessante de se fazer é verificar se os dados estão relativamente proporcionais, isso é, se a mesma quantidade de dados negativos que temos é próxima da de positivos. Pois se forem quantidades desproporcionais, precisaremos de outra tratativa, que é a classificação de dados desbalanceados.

Se os dados forem equilibrados, podemos seguir normalmente. Assim, conhecer a distribuição de classificação também é importante; veremos como fazê-lo usando o Pandas, bem como uma função já conhecida para quem vem fazendo os cursos de Machine Learning, que é o value_counts, da coluna "sentiment" de resenha.

print(resenha.sentiment.value_counts())

neg 24765 pos 24694 Name: sentiment, dtype: int64

Com isso, conseguimos saber que há 24765 resenhas negativas e 24694 positivas, e este é um indício de que podemos seguir com o nosso modelo de classificação. Desta vez, vamos printar as cinco primeiras linhas da tabela. Como vimos, as resenhas negativas ficam no topo, como "neg", e as positivas no fim, como "pos". Porém, geralmente não é assim que encontramos estes dados. As negativas costumam ser lidas como "0", e as positivas, como "1".

Então, só para termos algo mais padronizado, conforme será encontrado na vida real, vamos fazer esta substituição, isto é, criar mais uma coluna no DataFrame, e quando for "neg" será "0", e quando for "pos", será "1". Para fazermos isso, usaremos o Pandas Replace. Criaremos a variável classificacao, a que atribuiremos os dados do DataFrame resenha da coluna "sentiment".

classificacao = resenha["sentiment"].replace(["neg", "pos"], [0,1])

Vamos ver como ficou a variável classificacão?

Funcionou, está aparecendo "0" em vez de "neg" e "1" em vez de "pos" e a ordem segue sendo a mesma de antes. Criaremos a coluna com esta variável classificação, resenha["classificacao"] = classificacao.

E veremos como fica o nosso DataFrame com head, resenha.head(). Se utilizarmos resenha.tail(), continuamos com a coluna "classificacao", e os dados que estão como "pos" possuem "1", enquanto que aqueles como "neg" estão com "0", como gostaríamos.

Agora já entendemos como é importante conhecer um pouco mais dos textos, lê-los para termos um pouco mais de noção em relação à sua estrutura, verificamos que as cargas estão balanceadas, isto é, os diferentes dados possuem quantidades próximas, e já criamos uma coluna classificacao para torná-los mais padronizados, conforme será encontrado em artigos científicos, e tudo o mais.

O próximo passo será entrar nesta questão de tradução do texto para a linguagem de máquina. Vamos fazer isso? Até daqui a pouco.

Sobre o curso Linguagem Natural parte 1: introdução a NLP com análise de sentimento

O curso Linguagem Natural parte 1: introdução a NLP com análise de sentimento possui 144 minutos de vídeos, em um total de 40 atividades. Gostou? Conheça nossos outros cursos de Machine Learning em Data Science, ou leia nossos artigos de Data Science.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Machine Learning acessando integralmente esse e outros cursos, comece hoje!

Plus

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$85
à vista R$1.020
Matricule-se

Pro

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$120
à vista R$1.440
Matricule-se
Conheça os Planos para Empresas

Acesso completo
durante 1 ano

Estude 24h/dia
onde e quando quiser

Novos cursos
todas as semanas