Você está visualizando atualmente Como criar e treinar um classificador usando PLN

Como criar e treinar um classificador usando PLN

É possível criar e treinar um classificador 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.

Se você gosta de artigos sobre PLN e data science, veja nossa seção de artigos sobre esse assunto.

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)

Como salvar ou importar um modelo em Python

Para que possamos utilizar posteriormente o classificador treinado, devemos salvar o modelo através de um pickle file.

# salvando o modelo

with open('classifier.pickle', 'wb') as f:
    pickle.dump(classifier,f)

with open (‘tfidfmodel.pickle’, ‘wb’) as f: pickle.dump(vectorizer,f)

# unpickling the classifier and vectorizer

with open('classifier.pickle', 'rb') as f:
    clf = pickle.load(f)
    
with open('tfidfmodel.pickle', 'rb') as f:
    tfidf = pickle.load(f)
    
sample = ['you are a nice person man, have a good life']
sample = tfidf.transform(sample).toarray()
    
print (clf.predict(sample))

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.

Avaliando a performance

A predição de novos exemplos baseia-se no treinamento feito. O classificador treinado utiliza o modelo criado para predizer qual é a classe do novo exemplar. Em python utilizamos a função predict:

# predicting um novo exemplar
sent_pred = classifier.predict(text_test)     

A variável sent_pred retornará um array contendo as classes na qual o classificador acredita que o novo exemplar pertença.   Para realizar a avaliação do classificador devemos utilizar a geração da matriz de confusão:  

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(sent_test,sent_pred)
print (cm)

    [[157 51] [ 28 164]]   A matriz de confusão mostra em sua diagonal principal os exemplos que tiveram acerto (157 + 164) e na diagonal secundária (28 + 51) os exemplos que o classificador errou.        

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 a forma com que ela pode transformar vidas!

Este post tem um comentário

Deixe um comentário

12 + 5 =