Spaces:
Build error
Build error
| # 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() | |