Como criar e treinar um classificador usando PLN

Como criar e treinar um classificador usando PLN

Classificador treinado usando Processamento de Linguagem Natural (PLN) ? é possível? – Quando falamos em classificadores quase sempre vem na nossa mente aqueles conjuntos de dados clássicos, por exemplo, o dataset Iris, ou então aquele clássico “jogar tenis“.

Lógico que esses são bons exemplos de como utilizar o aprendizado supervisionado para criar um modelo, porém fica a dúvida, será que podemos usar palavras para construir um classificador?

A resposta é: depende.

Voltando um pouco ao básico dos classificadores

Antes de mais nada, vamos voltar um pouco e entender o porquê nós construímos classificadores. Os classificadores são ferramentas que trabalham com aprendizado supervisionado (geram modelos) e não supervisionado (não geram modelos). Essas ferramentas podem ser criadas quando queremos predizer o comportamento de determinado indivíduo ou sistema.

Por exemplo, quando queremos olhar para uma imagem e entender o qual fruta está contida na imagem o sistema deverá compreender quais são as características de cada fruta. Vamos considerar as seguintes frutas:

Algumas características dessas frutas poderiam ser:

  • Formato (arredondado, quadrado, retangular, etc)
  • Cor ( vermelho, laranja, verde)
  • Tamanho do cabo (inexistente, curto, médio, longo)
  • Você consegue pensar em mais alguma?

Bom, agora sabendo dessas características, qual delas seriam a melhor para diferenciar uma maçã de uma laranja? O formato não é muito bom, pois ambas são arredondadas. No entanto, a cor e o tamanho do cabo parecem alternativas melhores.

Mas pense um pouco, será que se usássemos apenas a cor seria suficiente?

Nesse caso sim, mas se adicionássemos um limão ao nosso conjunto de treino o nosso classificador já ficaria completamente perdido.

Agora falando de palavras

Até o momento estamos usando exemplos de frutas e classificadores que buscam identificar objetos em imagens. Isso pode parecer muito distante do PLN, mas não é. Quando utilizamos classificadores em PLN queremos identificar características dos textos e marcá-las automaticamente com o classificador (predição).

Vamos para um exemplo, imagine as seguintes frases:

  • frase 1: ” Eu amei esse produto, ele era simplesmente tudo que eu precisava, ele é incrível”
  • frase 2: ” O produto é de boa qualidade, a sua lâmina é afiada e facilita muito minha vida, gostei muito.”
  • frase 3: “O produto é péssimo, feito com materiais de terceira categoria, usei uma vez e joguei fora.”

Você deve ter percebido que essas são reviews de produtos, porém, o que você poderia tentar classificar dentro desse contexto? Em geral as pessoas veem uma possibilidade, seria – Satisfeito / Insatisfeito.

Agora imagine as seguintes sentenças:

  • Frase 1: “essas mulheres são incríveis, precisam dar um prêmio para elas.”
  • Frase 2: “um absurdo essas mulherada se metendo onde não deve, deveriam estar em casa.”

Aqui você consegue ver a tendência ao machismo nessa sentença? será que poderíamos classificar essas sentenças entre machistas e não machistas?

Implementação de um classificador simples em Python

Para ilustrar esse post, vou utilizar sentenças que eu inventei que indicam frases machistas ou não machistas e vou tentar criar um classificador que faça essa predição.

f1 = "Meu deus, essas mulheres deveriam estar na cozinha lavando a louça"
f2 = "Você nem precisa reclamar, é mulher, está certo que você ganhe menos"
f3 = "Essa mulher é incrível, tem uma capacidade de raciocínio muito rápido"
f4 = "quando pensei que iam contratar uma mulher, logo fiquei feliz"
f5 = "sou criado à moda antiga, mulher tem que cuidar do marido"

corpus = [f1,f2,f3,f4,f5]

# classificações: 1 - frase machista | 0 - Frase neutra
classification = [1,1,0,0,1] 

Após termos nosso pequeno corpus, podemos utilizar alguns algoritmos para extrair as palavras que são mais importantes para indicar o machismo nas frases. Por exemplo:

"Meu deus, essas mulheres deveriam estar na cozinha lavando a louça"

Geralmente quando “mulher” aparece no mesmo contexto de lavando a louça, isso pode indicar uma frase machista. No entanto, temos que tomar muito cuidado porque uma variação comum dessa frase seria: “minha mulher estava lavando a louça e eu cuidei da nossa filha”.

Mas, mesmo sabendo que existem limitações, vamos em frente. Agora vamos usar o TF-IDF para fazer esse trabalho de extração de palavras importantes.

# primeiro importamos o countvectorizer para transformar o corpus em vetor de palavras

from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(corpus)
X_train_counts.shape

# agora importamos o TF-IDF e tranformamos o vetor de palavras outro vetor, porém agora, com a filtragem proporcionada pelo TF-IDF

from sklearn.feature_extraction.text import TfidfTransformer
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
X_train_tfidf.shape

Agora nós podemos treinar nosso classificador para fazer predições:

from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB().fit(X_train_tfidf, classification)

Ao criar todos os elementos necessários, podemos criar um pipeline onde usamos o TF-IDF e o classificador que criamos para predizer novas amostras.

from sklearn.pipeline import Pipeline
text_clf = Pipeline([('vect', CountVectorizer()),('tfidf', TfidfTransformer()),('clf', MultinomialNB())])
text_clf = text_clf.fit(corpus, classification)

Vamos testar!

Agora que tudo está pronto, podemos testar e sugerir algumas frases para nosso classificador. Por exemplo:

Teste de classificador construído com pln
Quer ver esse código completo? acesse nosso github aqui.

Lembre-se um classificador que usa processamento de linguagem natural é bastante genérico, você não precisa se restringir fazendo apenas a análise de sentimentos padrão. Seja inovador e descubra o poder do machine learning e do PLN.

Vinicius dos Santos

Apenas um apaixonado por Ciência da Computação e forma com que ela pode transformar vidas!

Este post tem um comentário

Deixe uma resposta