Alura > Cursos de Data Science > Cursos de Machine Learning > Conteúdos de Machine Learning > Primeiras aulas do curso NLP: trabalhando com similaridade de sentenças

NLP: trabalhando com similaridade de sentenças

Buscando a similaridade - Apresentação

Já pensou em desenvolver um projeto que realiza buscas textuais de forma mais inteligente? Não estamos falando de busca por palavra-chave, mas sim de utilizar um modelo que compreende o significado do que estamos buscando e traz os textos mais relacionados a ele.

Tem curiosidade? Vamos aprender sobre similaridade de sentenças.

Meu nome é Mirla Costa e sou instrutora da Alura. Estarei acompanhando você durante todo o processo de aprendizado.

Audiodescrição: Mirla se identifica como uma mulher branca. Possui cabelos cacheados e pretos até abaixo dos ombros, amarrados em um rabo de cavalo baixo. No rosto, usa óculos de grau com armação redonda. No corpo, usa uma camiseta preta com uma estampa da escola de dados. Ao fundo, uma parede lisa iluminada em tons de verde e azul, com uma prateleira pequena de cada lado, preenchidas de livros e outros objetos.

Entendendo o contexto

Neste curso, atuaremos como cientistas de dados em uma loja online e precisaremos desenvolver uma aplicação que auxilie o time de produto a encontrar as reviews que mais se relacionam com o tema de interesse que estão estudando.

O que aprenderemos?

Durante todo o projeto, utilizaremos a linguagem Python e bibliotecas como Pandas, NLTK, RE e até TensorFlow para trabalhar com os dados e construir nossos modelos que encontrarão essas reviews mais similares.

Pré-requisitos

Para um aprendizado bem estruturado, recomendamos ter um conhecimento sólido de Python e também das bibliotecas Pandas, NLTK e RE. Além disso, é importante já ter estudado sobre limpeza e tratamento de dados de texto.

Vamos começar?

Buscando a similaridade - Entendendo as reviews

Somos uma equipe de cientistas de dados que trabalha em uma loja de departamento online, a Zoop. Recebemos uma quantidade significativa de reviews de clientes que compraram em loja e avaliaram o serviço.

A partir disso, o time de produto, composto pelas pessoas product managers (PMs), solicitou ajuda para analisar de forma mais rápida o que a clientela comenta sobre determinados temas, como:

A ideia é que eles consigam encontrar as reviews mais relacionadas com o tema de interesse, para assim compreender rapidamente as percepções da clientela, identificando pontos de melhoria na loja, produtos e serviços oferecidos.

Propondo a solução: uma aplicação orientada por NLP

Nossa tarefa é desenvolver uma aplicação que permita ao time de produto encontrar mais facilmente essas reviews. Assim, eles conseguirão identificar de forma ágil os feedbacks relacionados a esse tema.

Como as reviews envolvem dados textuais, é certo que aplicaremos técnicas de NLP (Processamento de Linguagem Natural) para resolver esse problema. Para saber que técnicas utilizar, precisamos conhecer nossos dados e entender, ou mapear, quais problemas podemos atacar e resolver.

Explorando os dados: características iniciais

Vamos acessar o ambiente do Google Colab para conhecer os dados. Utilizaremos o mesmo notebook durante todo o projeto do curso. Aconselhamos baixá-lo por meio de uma atividade desta aula, para que possamos construir este projeto juntos.

Ao acessar o notebook pelo Colab, na primeira célula da seção "Aula 1", já podemos identificar um link de acesso aos dados. Esse link de acesso estará dentro do seu notebook e será disponibilizado nas atividades desta aula.

url = 'https://raw.githubusercontent.com/Mirlaa/NLP-trabalhando-similaridade-sentencas/refs/heads/main/reviews_zoop.csv'

Vamos executar essa célula para salvar a URL de acesso a esses dados. Após salvar, podemos acessar a célula seguinte e importar esses dados para o ambiente. Para isso, utilizaremos o Pandas, adicionando o comando import pandas as pd.

Em seguida, pularemos uma linha na mesma célula e criaremos um data frame chamado dados, recebendo pd.read_csv(url). Por fim, para visualizar os dados em formato de tabela, basta digitar dados na próxima linha.

import pandas as pd

dados = pd.read_csv(url)
dados

Ao executar a célula acima, temos os seguintes dados:

Linhanota_reviewreview
05Recebi bem antes do prazo estipulado.
15Parabéns lojas Zoop adorei comprar pela Intern…
24aparelho eficiente. no site a marca do aparelh…
34Mas um pouco ,travando…pelo valor ta Boa.\r\n
45Vendedor confiável, produto ok e entrega antes…
394575Entregou dentro do prazo. O produto chegou em …
394583O produto não foi enviado com NF, não existe v…
394595Excelente mochila, entrega super rápida. Super…
394601Solicitei a compra de uma capa de retrovisor c…
394611meu produto chegou e ja tenho que devolver, po…

Focaremos apenas nos dados textuais de review, pois nossa análise não se concentrará em notas, mas sim nos comentários e feedbacks.

Identificando problemas nos dados textuais

Vamos observar as características dos dados. Na célula abaixo da tabela, executaremos o seguinte comando para observar uma review:

dados['review'][1]

Retorno do Colab:

'Parabéns lojas Zoop adorei comprar pela Internet seguro e prático Parabéns a todos feliz Páscoa'

É possível constatar que não temos um padrão de letras maiúsculas ou minúsculas dentro dos textos. Também observamos acentos, como em "parabéns" e "prático".

Na célula seguinte, vamos observar a review 8:

dados['review'][8]

Retorno do Colab:

'A compra foi realizada facilmente.\r\nA entrega foi efetuada muito antes do prazo dado.\r\nO produto já começou a ser usado e até o presente,\r\nsem problemas.'

Nesse resultado, encontramos mais problemas: pontuações, os símbolos "\n" e "\r" indicando quebra de linha, letras maiúsculas e pontos.

Na célula seguinte, consultaremos também a review 11:

dados['review'][11]

Retorno do Colab:

'Sempre compro pela Internet e a entrega ocorre antes do prazo combinado, que acredito ser o prazo máximo. No o prazo máximo já se esgotou e ainda não recebi o produto.'

Nesse caso, é válido ler o texto, pois é uma review negativa. Ao contrário da review 1, que parabeniza a loja, e da review 8, que traz pontos positivos, a review 11 relata que o prazo máximo se esgotou e o produto não foi recebido.

Por fim, avaliaremos a review 18 na próxima célula:

dados['review'][18]

Retorno do Colab:

'otimo vendedor chegou ate antes do prazo , adorei o produto'

Esta review não tem acentos e apresenta apenas uma vírgula.

Temos uma grande variação nas características dos textos enviados pela clientela. Qualquer pessoa pode digitar, então é esperado que não haja um padrão textual. Precisamos pensar em técnicas de NLP para tratar esses dados.

Construindo uma solução baseada em similaridade semântica

Nosso desafio consiste em encontrar as reviews mais relacionadas de acordo com o tema. Observando os textos, percebemos que uma solução apenas com palavras-chave não será suficiente. Por exemplo, se uma pessoa PM buscar reviews relacionadas ao tema "entrega", clientes podem dizer que a entrega foi rápida, que o produto chegou rapidamente, que o pacote foi entregue dentro do prazo ou que não receberam o produto.

Ou seja, as reviews podem envolver temas relacionados à entrega, mas sem necessariamente conter a palavra "entrega". Isso é um problema se quisermos construir uma solução com buscas por palavras-chave.

Isso nos traz a oportunidade de construir uma busca mais inteligente. Podemos pensar em uma técnica chamada similaridade semântica, que permite encontrar reviews mais similares de acordo com o contexto e a semântica das frases, não apenas por termos iguais como "entrega" ou "chegou". Com essa técnica, capturaremos a essência dos comentários sobre a entrega.

Próximos passos

No próximo vídeo, veremos como aplicar essa técnica nos dados.

Buscando a similaridade - Encontrando a similaridade entre as palavras

Buscar por similaridades entre palavras é essencial para construir nosso projeto, pois isso permitirá que as reviews similares entre si e que têm temas semelhantes possam ser mostradas sem a necessidade de repetir termos. Verificaremos apenas através do contexto e da semântica o que essas reviews trazem.

Conhecendo o Word2Vec

Uma opção para encontrar essa similaridade é utilizar o Word2Vec, pois ele consegue relacionar palavras através da semelhança entre o contexto e a semântica, mesmo não sendo escritas da mesma forma. No caso, ele consegue identificar a proximidade e similaridade entre a palavra "entrega" e as palavras "chegou" ou "chegada". Ele entende o contexto em que as palavras estão inseridas.

O Word2Vec é uma técnica de aprendizado profundo que transforma palavras em vetores numéricos dentro de um espaço vetorial. Assim, palavras mais semelhantes dentro do contexto têm seus vetores mais próximos.

Conseguimos encontrar a similaridade entre essas palavras e identificar aquelas que são mais similares entre si.

Para saber mais sobre o Word2Vec e a questão da semelhança entre vetores, recomendamos conferir as atividades desta aula.

Tokenizando palavras

Para utilizar o Word2Vec, primeiro precisamos tokenizar palavras, ou seja, enviar as palavras em formato de tokens para o modelo. Para aplicar a tokenização nas palavras das reviews, precisamos de funções que realizem essa tarefa, obtidas utilizando a biblioteca NLTK. Vamos voltar ao notebook para começar a aplicar esse código.

Primeiro, vamos construir a função de tokenização. Acessando a primeira célula da seção "Similaridade entre as palavras", importaremos a função word_tokenize da biblioteca NLTK com o comando abaixo:

from nltk.tokenize import word_tokenize

Na próxima linha, especificaremos que a língua é português, criando outra função que acessará esta. Para isso, importaremos o partial da biblioteca Functools.

Pulando uma linha, criaremos a função de tokenização, chamada word_tokenize_pt, onde "pt" especifica o idioma português. Ele receberá o partial(), e entre os parênteses, especificaremos o word_tokenize e a língua portuguesa, com language = 'portuguese'.

from nltk.tokenize import word_tokenize
from functools import partial

word_tokenize_pt = partial(word_tokenize, language = 'portuguese')

Executaremos o código dessa célula para criar essa função.

Na próxima célula, executaremos o carregamento do modelo que aplicará a tokenização, também da biblioteca NLTK:

import nltk
nltk.download('punkt')

Criando e treinando o modelo Word2Vec

Agora podemos criar e treinar o Word2Vec. Para isso, utilizaremos a biblioteca Gensim importando-a na célula seguinte:

from gensim.models import Word2Vec

Pulando uma linha, criaremos o modelo, recebendo o Word2Vec(). Entre as chaves deste, especificaremos os parâmetros abaixo:

Os parâmetros workers e seed servem apenas para garantir que o resultado do seu código e o do vídeo sejam iguais.

from gensim.models import Word2Vec

modelo = Word2Vec(sentences = dados['review'].apply(word_tokenize_pt),
                            vector_size=100, min_count=1, window=5,
                            workers=1, seed=45)

Por fim, executaremos o código da célula para treinar o modelo.

Encontrando palavras similares

Com o modelo treinado, conseguimos encontrar as palavras mais similares a partir de um determinado tema. Iniciaremos a busca com o tema "entrega", adicionando o comando modelo.wv.most_similar('entrega')na próxima célula, onde wv significa Word2Vec e entre parênteses, adicionamos o termo a ser pesquisado:

modelo.wv.most_similar('entrega')

Após a execução da célula, observamos no retorno palavras relacionadas como "entregue", "compra", "chegou", "entregou", que se relacionam com "entrega" em contexto e semântica.

Retorno:

[('Entrega', 0.7526029944419861),

('entregue', 0.7109662294387817),

('compra', 0.6985824108123779),

('chegou', 0.6755236983299255),

('entregou', 0.6542965769767761),

('envio', 0.6249788403511047),

('cadastrado', 0.6161651611328125),

('Chegou', 0.6127404570579529),

('preparar', 0.6111896634101868),

('mercadoria', 0.6036772727966309)]

Podemos testar com a palavra "vendedor" na célula seguinte:

modelo.wv.most_similar('vendedor')

Retorno:

[('atendimento', 0.8607712388038635),

('serviço', 0.8035672307014465),

('fornecedor', 0.7637899518013),

('veiculo', 0.7295382022857666),

('produto', 0.729019284248352),

('processo', 0.710643470287323),

('parceiro', 0.702766478061676),

('cumpriu', 0.6967913508415222),

('trabalho', 0.6896953582763672),

('cumpriram', 0.6866145133972168)]

Por fim, testaremos com "produto" na próxima célula:

modelo.wv.most_similar('produto')

Retorno:

[('relógio', 0.7635505199432373),

('pedido', 0.7503548860549927),

('vendedor', 0.729019284248352),

('endereço', 0.7101667523384094),

('Produto', 0.6988608837127686),

('mesmo', 0.6944952607154846),

('tempo', 0.678637683391571),

('Mas', 0.673784077167511),

('porém', 0.6504761576652527),

('mercadoria', 0.6491450667381287)]

Próximos passos

Embora o Word2Vec traga palavras similares, ele não é tão eficaz para solucionar nosso problema, pois retorna apenas palavras semelhantes. O ideal é retornar sentenças ou reviews mais semelhantes com o tema, e não apenas palavras. Vamos explorar isso no próximo vídeo.

Sobre o curso NLP: trabalhando com similaridade de sentenças

O curso NLP: trabalhando com similaridade de sentenças possui 143 minutos de vídeos, em um total de 47 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!

Conheça os Planos para Empresas