Similaridade entre comentários

Tempo de leitura: 4 minutos

Oii, tudo bem com você? Hoje vou explicar do zero, como implementar um algoritmo que analisa o quanto semelhante são dois comentários (frases, textos, etc), apenas usando o produto escalar entre dois vetores, algo que é visto no início dos cursos de exatas. Está não é uma solução completa para este tipo de análise, mas te dar uma ideia geral de como podemos mensurar a similaridade entre comentários.

O código foi escrito na linguagem de programação python versão 3 e além de utilizar as bibliotecas padrão do python, vou utilizar a biblioteca numpy.

Primeiro importamos as bibliotecas que serão utilizadas nesta parte e montamos um vetor com frases curtas que foram escolhidas de maneira aleatória.

A variável corpus contém os textos (frases, comentários, etc) que serão analisados, e como pode notar, os textos estão um pouco sujos, mas foi de propósito.

A primeira função que iremos definir será a função clear_text. Esta função fará a limpeza nos textos, mantendo todo o texto com as letras minúsculas, eliminando as pontuações com o auxílio de expressões regulares (biblioteca re) e salvando apenas as palavras com comprimento maior que 1, isso faz com que ignore as vogais.

Na cédula seguinte é feito o comparativo entre antes e depois da limpeza nos textos.

Em seguida vamos construir um vetor com todas as palavras do corpus, após ser feita a limpeza do mesmo, ou seja, estamos construindo o “vocabulário” do algoritmo.

Com o vocabulário construído, transformamos cada frase do vetor corpus de maneira que o computador entenda, ou seja, vamos comparar se cada palavra do vetor vocabulary contém ou não em cada frase do vetor corpus. Se sim insere o valor numérico 1 se não insere 0.

Em outras palavras estamos transformando cada frase em vetores com dimensão igual ao tamanho da variável vocabulary.

Para determinar o quanto similar são os comentários, é necessário utilizar algum procedimento (fórmula) para medir esta similaridade. Uma delas é a métrica chamada similaridade do cosseno. Quem já cursou álgebra linear deve saber que o produto vetorial de dois vetores é igual ao módulo de cada vetor vezes o cosseno do ângulo formado entre eles.

v.w = |v||w|cos(θ), sendo v e w vetores

E é justamente o cosseno do ângulo ( cos(θ) )que utilizaremos para determinar o quanto similar são os comentários. Lembrando que a função cos(θ) vai do intervalo fechado -1 à 1, sendo que quando:

  • cos(θ) = 1 -> Os vetores são paralelos e com mesmo sentido;
  • cos(θ) = 0 -> Os vetores são perpendiculares;
  • cos(θ) = 1 -> Os vetores são paralelos e com mesmo oposto.

De maneira simples, quanto maior for o valor do cos(θ) mais similar são as frases.

Por fim definimos a função text_simillarities que irá calcular a similaridade entre o comentário escolhido com os demais e retornar em ordem decrescente os comentários e sua nota de similaridade. Nesta função temos 4 argumentos, o primeiro id_text, refere-se qual linha do vetor corpus está o texto a ser analisado, features é a matriz de 1 e 0 obtida na linha 6 com a função fit_transform, text é o próprio vetor corpus e n_text refere-se a quantos comentários será retornado na função.

Com tudo pronto, vamos fazer a análise, para isto escolhi a frase “Oi eu sou o goku!” (de maneira aleatória, rsrs), e verificaremos com as demais frases, quais são mais semelhantes e o quanto semelhante elas são em ordem decrescente.

Conclusão

Fiz uma breve ilustração partindo do zero de como podemos analisar de maneira bem simples a similaridade entre comentários, frases ou textos. Como foi dito no início do texto, este procedimento é para fins de estudo e não é uma solução final para este tipo de análise. Você pode melhorar a análise filtrando as “stopwords” (tradução livre — palavras de paradas), como também considerar fazer a mesma análise usando n-gram (em vez de considerar apenas uma única palavra, considera n-grupos de palavras vizinhas, por exemplo, o bigrama do texto [‘oi eu sou o goku’] ficaria [‘oi eu’, ‘eu sou’, ‘sou o’, ‘o goku’]), entre outros procedimentos.

Uma aplicação que pode ser feita é um sistema de recomendação de abstract, ou seja, a partir de um abstract de seu interesse, o código pode recomendar outras abstract semelhante. Neste link tem um artigo onde explico como raspar informações do site web science a partir do tema de busca, no qual uma das informações obtidas é justamente o abstract de cada paper.

similaridade entre comentarios

Linkedin:  https://www.linkedin.com/in/octavio-santana

Github: https://github.com/Octavio-Santana

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *