import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import os
from nltk.corpus import stopwords 
from nltk.tokenize import word_tokenize
import re
import collections

for dirname, _, filenames in os.walk('/kaggle/input'):
    for filename in filenames:
        print(os.path.join(dirname, filename))
"""
## Leitura dos arquivos
"""
reviews = pd.read_csv("/kaggle/input/olist-reviews-category/olist-reviews-category.csv")
df_positive_words = pd.read_csv("/kaggle/input/olist-reviews-category/positivos.csv")
df_negative_words = pd.read_csv("/kaggle/input/olist-reviews-category/negativos.csv")
"""
## Extração das palavras negativas e positivas a partir dos tratamentos feitos pelo fluxo no KNIME
"""
good_words = [w.lower().split("[")[0] for w in list(df_positive_words['Term'])] 
bad_words = [w.lower().split("[")[0] for w in list(df_negative_words['Term'])] 
"""
## Criação de um dataframe apenas com dados cujos reviews estejam devidamente preenchidos
"""
df_filtered = reviews[pd.notna(reviews.review_comment_message)]
"""
#### Tamanho do dataset
"""
len(df_filtered)
df_filtered.head()
"""
## Método que faz o tratamento dos reviews, removendo stop words, pontuação e numerais
"""

def treating(reviews):
    stop_words = set(stopwords.words('portuguese')) 
    treated = []
    for review in reviews:
        op_string = re.sub(r'[^\w\s]','',review)
        
        word_tokens = word_tokenize(op_string)
        filtered_sentence = [w.lower() for w in word_tokens if not w.lower() in stop_words and not w.isdigit()] 
        
        treated.append(filtered_sentence)
    return treated
    

"""
## Adição de uma nova coluna no DataFrame, contendo as avaliações após o tratamentos
"""
df_filtered.loc[:,"reviews"] = treating(df_filtered["review_comment_message"])
"""
## Recuperação das categorias de produtos mais avaliadas
"""
categories = df_filtered.product_category_name.unique()
popular_category_counter = collections.Counter()
popular_category_counter.update(list(df_filtered.product_category_name))
popular_categories = dict(popular_category_counter.most_common(5)).keys()
popular_categories
"""
## Faz uma contagem de todas as palavras utilizadas nas reviews, apenas nas categorias mais populares
"""
words_by_category = {}

for category in popular_categories:
    
    # filtra apenas pela categoria específica
    df_category = df_filtered[df_filtered.product_category_name == category]
    words_by_category[category] = {}
    
    catCounter = collections.Counter()
    
    # faz um loop por todas as linhas do dataframe filtrado da categoria específica
    for index, content in df_category.iterrows():  
        catCounter.update(content['reviews'])
    
    # add as n palavras mais comuns em tal categoria
    words_by_category[category] = catCounter.most_common()
words_by_category
"""
## Exibição dos gráficos das palavras mais ditas por categorias, diferenciando as positivas e negativas
"""
import matplotlib.pyplot as plt

for cat in popular_categories:
    good_keys = []
    good_values = []
    
    bad_keys = []
    bad_values = []
    for a, i in words_by_category[cat]:
        if a in good_words and len(good_keys) <= 10:
            good_keys.append(a)
            good_values.append(i)
        elif a in bad_words and len(bad_keys) <= 10:
            bad_keys.append(a)
            bad_values.append(i)
        
    
    # good feeling
    if len(good_keys) > 0:
        title = cat+"-pos"
        plt.title(cat + " - POSITIVE ")
        plt.barh(good_keys, good_values, color="#009e73")
        plt.savefig(title+'.png')
        plt.show()
        
    if len(bad_keys) > 0:
        title = cat+"-neg"
        plt.title(cat + " - NEGATIVE")
        plt.barh(bad_keys, bad_values, color="#d55e00")
        plt.savefig(title+'.png')
        plt.show()