Antes de prosseguirmos, vamos dar uma olhada no que fizemos? Buscamos uma base de dados com opiniões sobre filmes, e essa base de dados já vem rotulada para conseguir treinar o nosso modelo de Machine Learning supervisionado, depois repartimos nossos dados entre "treino" e "teste", e tentamos aplicar o modelo de regressão logística, para treinarmos e gerarmos o modelo preditivo.
O problema é que o nosso modelo preditivo não interpreta dados textuais, então, de alguma forma, precisaremos traduzir os nossos textos em algo que a máquina consegue ler. Antes de entrarmos neste assunto de tradução dos dados textuais para uma linguagem plausível para os nossos modelos de Machine Learning, quero salientar alguns pontos importantes no Processamento de Linguagem Natural.
O primeiro ponto é que precisamos conhecer um pouco mais sobre os nossos textos, a nossa base de dados, como ela se comporta, se são textos longos, curtos, se temos dicas que podem existir no texto, para os classificarmos como sendo positivos ou negativos, isso tudo pode facilitar na criação do modelo. Vamos ver algum exemplo?
Imaginemos uma situação em que temos uma frase como "filme ok", isso é bom ou ruim para você? É difícil dizer, não? Mas e se depois do texto tivermos uma carinha triste, ":("? Fica mais simples, e isso nos ajuda a definir esse texto como algo negativo. Mas a vida não é assim, geralmente os dados textuais são longos, requerem uma análise maior e precisam de um olhar mais cuidadoso. Assim, conseguiremos ter insights futuramente sobre como melhorarmos.
Ao longo do curso, perceberemos que isso é essencial. Então, algo interessante de se fazer é conhecer um pouco dos textos. Vamos printar o texto de uma resenha classificada como negativa. Você lembra quais são? São as primeiras, no topo da nossa tabela. Pediremos para que seja impressa a de posição 189, por exemplo, e daremos uma olhada neste texto.
print("Negativa \n")
print(resenha.text_pt[189])
É importante lermos, para vermos mais ou menos como é a escrita, entender um pouco se ela é formal ou informal, se possui muitos números, ou não. Tudo isso facilitará sua vida a longo prazo. Neste caso, quando pegamos uma resenha de classificação negativa, vemos de cara "Este é sem dúvida o pior filme que eu já vi". Para nós, fica fácil assim, basta lermos a primeira linha. Mas o computador não consegue ter essa análise semântica tão facilmente.
Conhecer os dados nos ajuda a salientar as palavras mais importantes para o nosso texto, para a nossa semântica, ou seja, as palavras que farão a diferença no momento da classificação dos textos. Vamos verificar um exemplo positivo? Os exemplos posotivos estão lá para o final, vou pegar o 49002.
print("Positivo \n")
print(resenha.text_pt[49002])
Um texto longo, com pontuação, não há nenhuma carinha feliz ou triste para nos auxiliar, mas vemos isso escrito em caixa alta "BRILHANTE!". Mais uma vez, para um computador isso não torna a classificação mais clara, acaba sendo um desafio conseguir entender a semântica por trás do texto, o que ele está querendo dizer.
Conforme dito, conhecer um pouco dos textos é importante, e irá nos ajudar a melhorar a modelagem, ou seja, salientar as palavras mais importantes, aquilo que é fundamental. Ao longo do curso faremos isso. Outra coisa interessante de se fazer é verificar se os dados estão relativamente proporcionais, isso é, se a mesma quantidade de dados negativos que temos é próxima da de positivos. Pois se forem quantidades desproporcionais, precisaremos de outra tratativa, que é a classificação de dados desbalanceados.
Se os dados forem equilibrados, podemos seguir normalmente. Assim, conhecer a distribuição de classificação também é importante; veremos como fazê-lo usando o Pandas, bem como uma função já conhecida para quem vem fazendo os cursos de Machine Learning, que é o value_counts, da coluna "sentiment" de resenha.
print(resenha.sentiment.value_counts())
neg 24765
pos 24694
Name: sentiment, dtype: int64
Com isso, conseguimos saber que há 24765 resenhas negativas e 24694 positivas, e este é um indício de que podemos seguir com o nosso modelo de classificação. Desta vez, vamos printar as cinco primeiras linhas da tabela. Como vimos, as resenhas negativas ficam no topo, como "neg", e as positivas no fim, como "pos". Porém, geralmente não é assim que encontramos estes dados. As negativas costumam ser lidas como "0", e as positivas, como "1".
Então, só para termos algo mais padronizado, conforme será encontrado na vida real, vamos fazer esta substituição, isto é, criar mais uma coluna no DataFrame, e quando for "neg" será "0", e quando for "pos", será "1". Para fazermos isso, usaremos o Pandas Replace. Criaremos a variável classificacao, a que atribuiremos os dados do DataFrame resenha da coluna "sentiment".
classificacao = resenha["sentiment"].replace(["neg", "pos"], [0,1])
Vamos ver como ficou a variável classificacão?
Funcionou, está aparecendo "0" em vez de "neg" e "1" em vez de "pos" e a ordem segue sendo a mesma de antes. Criaremos a coluna com esta variável classificação, resenha["classificacao"] = classificacao.
E veremos como fica o nosso DataFrame com head, resenha.head(). Se utilizarmos resenha.tail(), continuamos com a coluna "classificacao", e os dados que estão como "pos" possuem "1", enquanto que aqueles como "neg" estão com "0", como gostaríamos.
Agora já entendemos como é importante conhecer um pouco mais dos textos, lê-los para termos um pouco mais de noção em relação à sua estrutura, verificamos que as cargas estão balanceadas, isto é, os diferentes dados possuem quantidades próximas, e já criamos uma coluna classificacao para torná-los mais padronizados, conforme será encontrado em artigos científicos, e tudo o mais.
O próximo passo será entrar nesta questão de tradução do texto para a linguagem de máquina. Vamos fazer isso? Até daqui a pouco.