<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 1. Descrição do Problema
A empresa Amazon deseja obter um sistema inteligente para processar os comentários de seus clientes sobre os seus produtos, podendo classificar tais comentários dentre as categorias
Step1:  Importing Data
Step2:  Creating Dictionary
Na variável "charsRemove" são indicados os caracteres a serem removidos do input.
Todas as palavras são transformadas para lower case e os caracteres indesejados são removidos.
Na variável "allWords", são armazenadas todas as palavras a serem utilizadas.
Step3:  Removing Words / Features
Aqui são removidas as palavras que aparecem menos de 52% como positivo ou como negativo.
Step4:  Sentence to Vector
Cria-se um vetor para cada sentença utilizando o dicionário elaborado como base.
Este vetor dependerá das palavras contidas em cada uma das sentenças. Cada ocorrência de palavra acarretará em igualarmos o índice associado a 1 (testou-se também incrementando esse valor, mas não foi viável).
Step5:  Classifier Model
Foram testados uma série de métodos para realizar a classificação dos comentários entre positivo e negativo. O melhor resultado obtido foi utilizando Ensemble, combinando
<ASSISTANT_TASK:>
Python Code:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
Explanation: 1. Descrição do Problema
A empresa Amazon deseja obter um sistema inteligente para processar os comentários de seus clientes sobre os seus produtos, podendo classificar tais comentários dentre as categorias: positivo ou negativo. Para isso ela disponibiliza três bases de dados com sentenças rotuladas.
2. Dados
Os dados estão organizados em sentença e rótulo, sendo 0 negativo e 1 positivo As bases são provenientes dos seguintes sites:
imdb.com
amazon.com
yelp.com
3. Solução
End of explanation
X_1 = pd.read_csv('amazon_cells_labelled.txt', sep="\t", usecols=[0], header=None)
Y_1 = pd.read_csv('amazon_cells_labelled.txt', sep="\t", usecols=[1], header=None)
X_2 = pd.read_csv('imdb_labelled.txt', sep="\t", usecols=[0], header=None)
Y_2 = pd.read_csv('imdb_labelled.txt', sep="\t", usecols=[1], header=None)
X_3 = pd.read_csv('yelp_labelled.txt', sep="\t", usecols=[0], header=None)
Y_3 = pd.read_csv('yelp_labelled.txt', sep="\t", usecols=[1], header=None)
X = np.concatenate((X_1.values[:,0], X_2.values[:,0]), axis=0)
Y = np.concatenate((Y_1.values[:,0], Y_2.values[:,0]), axis=0)
X = np.concatenate((X, X_3.values[:,0]), axis=0)
Y = np.concatenate((Y, Y_3.values[:,0]), axis=0)
Explanation: Importing Data
End of explanation
# Treating Sentences
allSentences = []
charsSplit = "\\`*_{}[]()>#+-.!$,:&?"
charsRemove = ".,-_;\"\'"
for x in X :
    for c in charsSplit:
        x = x.replace(c, ' '+ c +' ')
    for c in charsRemove:
        x = x.replace(c, '')
    allSentences.append(x.lower() )
allWords = []
for x in allSentences :
    allWords.extend(x.split(" "))
allWords = list(set(allWords))
allWords.sort()
Explanation: Creating Dictionary
Na variável "charsRemove" são indicados os caracteres a serem removidos do input.
Todas as palavras são transformadas para lower case e os caracteres indesejados são removidos.
Na variável "allWords", são armazenadas todas as palavras a serem utilizadas.
End of explanation
positiveCount = [0] * len(allWords)
negativeCount = [0] * len(allWords)
sentenceNumber = 0
for sentenceNumber, sentence in enumerate(allSentences) :
    for word in sentence.split(" "):
        wordIndex = allWords.index(word)
        if (Y[sentenceNumber] == 1):
            positiveCount[wordIndex] = positiveCount[wordIndex] + 1
        else:
            negativeCount[wordIndex] = negativeCount[wordIndex] + 1
    
allCount =  np.array(positiveCount) + np.array(negativeCount)
probPositive = np.divide(positiveCount, allCount)
len(allWords)
allWordsFiltered =  np.array(allWords)
len(allWordsFiltered)
index_to_remove = []
for index, prob in enumerate(probPositive):
    if not((prob <= 0.48) or (prob >= 0.52)):
        index_to_remove.append(index)
        a = 1
allWordsFiltered = np.delete(allWordsFiltered, index_to_remove)
Explanation: Removing Words / Features
Aqui são removidas as palavras que aparecem menos de 52% como positivo ou como negativo.
End of explanation
allWords = np.array(allWordsFiltered).tolist()
X = []
for x in allSentences :
    sentenceV = [0] * len(allWords)
    words = x.split(" ")
    for w in words :
        try:
            index = allWords.index(w)
            sentenceV[index] = 1 #sentenceV[index] + 1
        except ValueError:
            pass
    X.append(sentenceV)
Explanation: Sentence to Vector
Cria-se um vetor para cada sentença utilizando o dicionário elaborado como base.
Este vetor dependerá das palavras contidas em cada uma das sentenças. Cada ocorrência de palavra acarretará em igualarmos o índice associado a 1 (testou-se também incrementando esse valor, mas não foi viável).
End of explanation
from sklearn.cross_validation import cross_val_score
cross_val_k = 10
from sklearn.naive_bayes import MultinomialNB
clf1 = MultinomialNB()
from sklearn.neighbors import KNeighborsClassifier
clf2 = KNeighborsClassifier(n_neighbors=5)
from sklearn.linear_model import LogisticRegression
clf3 = LogisticRegression(penalty='l2', C=1.0)
from sklearn.ensemble import VotingClassifier
eclf = VotingClassifier(estimators=[('mnb', clf1), ('knn', clf2), ('lr', clf3)], voting='soft', weights=[3,2,2])
accuracy = cross_val_score(eclf, X, Y, cv=cross_val_k, scoring='accuracy').mean()
print('Precisão: ', accuracy)
Explanation: Classifier Model
Foram testados uma série de métodos para realizar a classificação dos comentários entre positivo e negativo. O melhor resultado obtido foi utilizando Ensemble, combinando:
    - Multinomial Naive Bayes (peso 3)
    - KNN (peso 2)
    - Logistic Regression (peso 2)
End of explanation
<END_TASK>