Fala galera beleza? No nosso primeiro post vimos como criar nosso primeiro modelo de classificação de sentimentos onde conseguimos chegar à acurácia de 73% e como prometido, nesse post vamos tentar melhorar esse score.

Tf-idf

O Tf-idf (term frequency-inverse document frequency) é uma medida utilizada para determinar o peso de uma palavra de um documento em uma coleção de documentos. Sendo simplista, o tf é um cálculo e o idf é outro, sendo que o tf-idf é o produto do resultado das duas medidas. Para mais detalhes sobre o cálculo recomendo este link.

O mais interessante de utilizar essa abordagem, é que temos algo além de apenas uma vetorização a partir da frequência das palavras como fizemos no primeiro post. Se pararmos para pensar, o maior problema disso é que, considerando que não estamos removendo stop words, palavras como “de”, “para” e“foi” que ocorrem bastante em nosso conjunto de dados estão tendo uma importância maior do que os termos que ocorrem raramente.

Quem resolve esses casos especificamente é o idf que calcula a frequência inversa dos termos, legal né?

Talk is cheap, show me the code!

Para fazer esse tipo de vetorização, a biblioteca sklearn nos oferece a classe TfidfVectorizer com alguns parâmetros, vamos ver mais abaixo:



This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters


from sklearn.feature_extraction.text import TfidfVectorizer
vect = TfidfVectorizer(ngram_range=(1,4), use_idf=True, lowercase=True, min_df=2, max_df=0.95)
vect.fit(df.text_pt)
text_vect = vect.transform(df.text_pt)
https://gist.github.com/sergioprates/f3f07a6779330460b91174ce2b472d81

Veja que temos o parâmetro ngram_range que é igual ao vetorizador anterior que utilizamos, dizemos para nosso algoritmo que queremos utilizar o cálculo idf e também que ele transforme todas as palavras em lowercase para limitar nossas ocorrências.

Os parâmetros min_df e max_df são utilizados para retirar n-gramas que ocorrem pouco e que ocorrem muito respectivamente. Isso serve para remover os casos que podem influenciar muito nosso modelo e também para remover os casos que ocorrem raramente que são irrelevantes para a classificação.

Treinamento e testes

Caso você tenha se aventurado a rodar nosso primeiro notebook com a base inteira, deve ter percebido que nossa acurácia já melhora para 88%, dado que temos mais registros. Mas ainda assim, conseguimos melhorar nossos resultados utilizando outro classificador, o famoso SVM.



This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters


from sklearn.svm import LinearSVC
clf = LinearSVC(C=10, random_state=0)
clf.fit(X_train, y_train)

O Support Vector Machine (SVM) é um dos algoritmos mais robustos para realizar classificação de dados, nesse caso temos que aplicar um parâmetro de “penalidade”, ou seja, com este parâmetro conseguimos trabalhar a margem de separação entre as classes.

Abaixo podemos ver a acurácia da nossa classificação:

Conclusão

A partir desses dois posts, podemos ver duas formas de vetorização de textos que podem influenciar na acurácia do nosso modelo de machine learning, CountVectorizer e TfidfVectorizer. Mostramos também sobre as combinações de n-gramas que são feitas no processamento de texto para identificar padrões que nos ajudem a classificar textos em determinadas categorias.

Essas técnicas podem por exemplo serem utilizadas para classificação de documentos, classificação de comentários, mensagens enviadas para o SAC a fim de categorizar por departamento… Enfim…

Espero que tenham gostado dos posts e até a próxima! 😀

O código está disponível aqui

​(Cross-post de https://medium.com/@sergioprates/intelig%C3%AAncia-artificial-como-fazer-an%C3%A1lise-de-sentimento-com-python-parte-2-fd9521bf07fa?postPublishedType=initial)

Sergio Prates