É 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:
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.
Pingback: Como analisar sentimentos em Tweets usando Python » CSM