JulioLucieto's picture
Update app.py
c2e400a verified
# Imports
import re
import spacy
import unidecode
import pandas as pd
import numpy as np
import gradio as gr
import tensorflow_hub as hub
from sklearn.metrics.pairwise import cosine_similarity
# No ambiente virutal é preciso baixoa e carregar o modelo
# python -m spacy download pt_core_news_sm
# Variáveis Globais
arquivo = None
tema = None
df_dados = None
nlp = None
tokenized_sentences = None
modelo = None
similar_reviews = None
# Carregamento do modelo USE
def carrega_modelo_use():
global modelo
# Link de acesso ao modelo no Hub do Tensorflow
modulo_url = 'https://tfhub.dev/google/universal-sentence-encoder/4'
# Carrega o modelo
modelo = hub.load(modulo_url)
# Carregar modelo Spacy em português
def carrega_modelo_spacy():
global nlp
nlp = spacy.load("pt_core_news_sm")
# Carregamento dos dados
def carrega_dados():
global df_dados
# Carrega o arquivo com as reviews (avaliações)
df_dados = pd.read_csv(arquivo)
# Função para remover caracteres repetidos excessivamente
def corrigir_repeticoes(texto):
return re.sub(r'(?!rr|ss)(.)\1+', r'\1', texto)
# Transforma o texto em minúsculas com a função lower().
def lower(texto):
texto = re.sub(r'\W',' ', texto.lower())
return texto
# Tokeniza cada texto recebido
# Se o token for um espaço desconsidera
def word_tokenize_spacy(texto):
global nlp
return [token.text for token in nlp(texto) if not token.is_space]
# Remove Stop Words
def remove_stop_words(texto):
global nlp
stop_words = set(sorted(nlp.Defaults.stop_words))
stop_words.discard('não')
return ' '.join([word for word in texto if word not in stop_words])
# Limpeza e preparação dos dados
def limpa_prepara_dados():
global df_dados
# Removendo acentuações utilizando o pacote Unidecode, que fornece
# suporte para remover acentos na língua portuguesa.
df_dados['review'] = [unidecode.unidecode(texto) for texto in df_dados['review']]
# Removendo linhas que review seja vazio
df_dados = df_dados[df_dados['review'] != '']
# Remover caracteres repetidos excessivamente
df_dados['review'] = df_dados['review'].apply(corrigir_repeticoes)
# Remove conteudos review que forem duplicados
df_dados = df_dados.drop_duplicates(subset = ['review'])
# Converte para minusculas
df_dados['review'] = df_dados['review'].apply(lower)
# Chama a função para tokenizar os reviews
df_dados['review'] = df_dados['review'].apply(word_tokenize_spacy).tolist()
# Remove StopWords
df_dados['review'] = df_dados['review'].apply(remove_stop_words)
# Função para Processamento
def processar (parametro_arquivo, parametro_tema):
global arquivo
global tema
global df_dados
global nlp
global tokenized_sentences
global modelo
global similar_reviews
global similar_reviews
arquivo = parametro_arquivo.name
tema = parametro_tema
carrega_modelo_use()
carrega_modelo_spacy()
carrega_dados()
limpa_prepara_dados()
reviews_emb = modelo(df_dados['review'].tolist())
tema_emb = modelo([tema])
similaridades = cosine_similarity(tema_emb,reviews_emb).flatten()
top_indices = np.argsort(-similaridades)
similar_reviews = df_dados[['nota_review','review']].iloc[top_indices]
similar_df = similar_reviews.head(200)
nome_arquivo = f'reviews_similares_{tema}.csv'
similar_reviews.to_csv(nome_arquivo)
return similar_df, nome_arquivo
# Criando uma aplicação Gradio
with gr.Blocks() as app:
with gr.Row():
gr.Markdown('## Pesquisa Comentários (reviews) Similares a um Tema')
csv_entrada = gr.File(label='Envie o Arquivo .CSV com os Comentários (reviews)', file_types=['.csv'])
tema_entrada = gr.Textbox(label='Digite o Tema Para Busca das Similaridades (Exemplo : Atraso)')
botao = gr.Button('Clique Para Iniciar a Pesquisa')
tabela_saida = gr.Dataframe(label='Top 200 Comentários Similares', headers=['Nota', 'Reviews'], interactive=False)
arquivo_saida = gr.File(label='Baixar Arquivo .CSV com os Comentários Mais Similares', interactive =False)
botao.click(processar, inputs=[csv_entrada,tema_entrada], outputs=[tabela_saida,arquivo_saida])
app.launch()