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.
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_treino
e 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?
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.
O curso Linguagem Natural parte 1: NLP com análise de sentimento possui 168 minutos de vídeos, em um total de 41 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:
Impulsione a sua carreira com os melhores cursos e faça parte da maior comunidade tech.
1 ano de Alura
Assine o PLUS e garanta:
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
No Discord, você tem acesso a eventos exclusivos, grupos de estudos e mentorias com especialistas de diferentes áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Acelere o seu aprendizado com a IA da Alura e prepare-se para o mercado internacional.
1 ano de Alura
Todos os benefícios do PLUS e mais vantagens exclusivas:
Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos, corrige exercícios e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com a Luri até 100 mensagens por semana.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Transforme a sua jornada com benefícios exclusivos e evolua ainda mais na sua carreira.
1 ano de Alura
Todos os benefícios do PRO e mais vantagens exclusivas:
Mensagens ilimitadas para estudar com a Luri, a IA da Alura, disponível 24hs para tirar suas dúvidas, dar exemplos práticos, corrigir exercícios e impulsionar seus estudos.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.