Lematização e Lematização em Python NLTK com exemplos

O que é stemming e lematização Python NLTK?

Stemming e Lematização in Python NLTK são técnicas de normalização de texto para Processamento de Linguagem Natural. Essas técnicas são amplamente utilizadas para pré-processamento de texto. A diferença entre stemming e lematização é que stemming é mais rápido, pois corta palavras sem conhecer o contexto, enquanto a lematização é mais lenta, pois conhece o contexto das palavras antes do processamento.

O que é stemização?

Stemming é um método de normalização de palavras em Processamento de Linguagem Natural. É uma técnica na qual um conjunto de palavras de uma frase é convertido em uma sequência para encurtar sua pesquisa. Neste método, são normalizadas as palavras que têm o mesmo significado, mas apresentam algumas variações de acordo com o contexto ou frase.

Em outras palavras, existe uma palavra raiz, mas existem muitas variações das mesmas palavras. Por exemplo, a raiz da palavra é “comer” e suas variações são “come, come, comido e assim por diante”. Da mesma forma, com a ajuda de Stemming em Python, podemos encontrar a palavra raiz de quaisquer variações.

Por exemplo

He was riding.	
He was taking the ride.

Nas duas frases acima, o significado é o mesmo, ou seja, atividade de equitação no passado. Um ser humano pode compreender facilmente que ambos os significados são iguais. Mas para máquinas, ambas as frases são diferentes. Assim, tornou-se difícil convertê-lo na mesma linha de dados. Caso não forneçamos o mesmo conjunto de dados, a máquina não consegue prever. Portanto é necessário diferenciar o significado de cada palavra para preparar o conjunto de dados para aprendizado de máquina. E aqui a lematização é usada para categorizar o mesmo tipo de dados, obtendo sua palavra raiz.

Vamos implementar isso com um Python program.NLTK possui um algoritmo denominado “PorterStemmer”. Este algoritmo aceita a lista de palavras tokenizadas e a transforma na palavra raiz.

Programa para entender o stemming

from nltk.stem import PorterStemmer
e_words= ["wait", "waiting", "waited", "waits"]
ps =PorterStemmer()
for w in e_words:
    rootWord=ps.stem(w)
    print(rootWord)

saída:

wait	
wait	
wait	
wait 

Programa para compreender o stemming

Explicação do código:

  • Existe um módulo tronco no NLTk que é importado. Se você importar o módulo completo, o programa ficará pesado, pois contém milhares de linhas de códigos. Portanto, de todo o módulo stem, importamos apenas “PorterStemmer”.
  • Preparamos uma lista fictícia de dados de variação da mesma palavra.
  • É criado um objeto que pertence à classe nltk.stem.porter.PorterStemmer.
  • Além disso, passamos para PorterStemmer um por um usando o loop “for”. Finalmente, obtivemos a palavra raiz de saída de cada palavra mencionada na lista.

A partir da explicação acima, também pode-se concluir que a lematização é considerada uma importante etapa de pré-processamento porque removeu redundância nos dados e variações na mesma palavra. Como resultado, os dados são filtrados, o que ajudará no melhor treinamento da máquina.

Agora passamos uma frase completa e verificamos seu comportamento como saída.

Programa:

from nltk.stem import PorterStemmer
from nltk.tokenize import sent_tokenize, word_tokenize
sentence="Hello Guru99, You have to build a very good site and I love visiting your site."
words = word_tokenize(sentence)
ps = PorterStemmer()
for w in words:
	rootWord=ps.stem(w)
	print(rootWord)

Saída:

hello	
guru99	
,	
you	
have	
build	
a	
veri	
good	
site	
and	
I	
love	
visit	
your	
site	 

Programa para compreender o stemming

Explicação do código:

  • O pacote PorterStemer é importado do módulo stem
  • Pacotes para tokenização de frases e palavras são importados
  • Uma frase é escrita e deve ser tokenizada na próxima etapa.
  • A tokenização de palavras resultante da lematização é implementada nesta etapa.
  • Um objeto para PorterStemmer é criado aqui.
  • O loop é executado e a lematização de cada palavra é feita usando o objeto criado na linha 5 do código

Conclusão:

Stemming é um módulo de pré-processamento de dados. A língua inglesa tem muitas variações de uma única palavra. Essas variações criam ambiguidade no treinamento e na previsão do aprendizado de máquina. Para criar um modelo bem-sucedido, é vital filtrar essas palavras e convertê-las para o mesmo tipo de dados sequenciados usando lematização. Além disso, esta é uma técnica importante para obter dados de linha de um conjunto de frases e remoção de dados redundantes, também conhecida como normalização.

O que é Lematização?

Lemmatização em NLTK é o processo algorítmico de encontrar o lema de uma palavra dependendo de seu significado e contexto. A lematização geralmente se refere à análise morfológica das palavras, que visa remover terminações flexionais. Ajuda a retornar a forma base ou de dicionário de uma palavra conhecida como lema.

O método de lematização NLTK é baseado na função de metamorfose integrada do WorldNet. O pré-processamento de texto inclui lematização e lematização. Muitas pessoas acham os dois termos confusos. Alguns os tratam como iguais, mas há uma diferença entre lematização e lematização. A lematização é preferida à primeira devido ao motivo abaixo.

Por que a Lematização é melhor do que o Stemming?

O algoritmo stemming funciona cortando o sufixo da palavra. Em um sentido mais amplo, corta o início ou o fim da palavra.

Pelo contrário, a Lematização é uma operação mais poderosa e leva em consideração a análise morfológica das palavras. Ele retorna o lema que é a forma base de todas as suas formas flexionais. É necessário conhecimento linguístico aprofundado para criar dicionários e procurar a forma adequada da palavra. A lematização é uma operação geral, enquanto a lematização é uma operação inteligente onde a forma adequada será procurada no dicionário. Conseqüentemente, a lematização ajuda a formar melhores aprendizado de máquina características.

Código para distinguir entre Lematização e Lematização

Código de derivação:

import nltk
from nltk.stem.porter import PorterStemmer
porter_stemmer  = PorterStemmer()
text = "studies studying cries cry"
tokenization = nltk.word_tokenize(text)
for w in tokenization:
print("Stemming for {} is {}".format(w,porter_stemmer.stem(w)))  

Saída::

Stemming for studies is studi
Stemming for studying is studi
Stemming for cries is cri
Stemming for cry is cri

Código de lematização:

import nltk
	from nltk.stem import 	WordNetLemmatizer
	wordnet_lemmatizer = WordNetLemmatizer()
	text = "studies studying cries cry"
	tokenization = nltk.word_tokenize(text)
	 for w in tokenization:
		print("Lemma for {} is {}".format(w, wordnet_lemmatizer.lemmatize(w)))  

Saída:

Lemma for studies is study
Lemma for studying is studying
Lemma for cries is cry
Lemma for cry is cry

Discussão do Resultado

Se você procurar por estudos e estudos, a saída é a mesma (studi), mas o lematizador NLTK fornece um lema diferente para ambos os tokens, estudo para estudos e estudo para estudo. Portanto, quando precisarmos criar um conjunto de recursos para treinar a máquina, seria ótimo se a lematização fosse preferida.

Caso de uso do lematizador

Lemmatizer minimiza a ambiguidade do texto. Palavras de exemplo como bicicleta ou bicicletas são convertidas na palavra base bicicleta. Basicamente, ele converterá todas as palavras com o mesmo significado, mas com representações diferentes, para sua forma base. Reduz a densidade de palavras em um determinado texto e ajuda na preparação de recursos precisos para o treinamento da máquina. Quanto mais limpos os dados, mais inteligente e preciso será o seu modelo de aprendizado de máquina. O NLTK Lemmatizer também economiza memória e também custos computacionais.

Exemplo em tempo real mostrando o uso da lematização Wordnet e marcação POS em Python

from nltk.corpus import wordnet as wn
	from nltk.stem.wordnet import WordNetLemmatizer
	from nltk import word_tokenize, pos_tag
	from collections import defaultdict
	tag_map = defaultdict(lambda : wn.NOUN)
	tag_map['J'] = wn.ADJ
	tag_map['V'] = wn.VERB
	tag_map['R'] = wn.ADV

	text = "guru99 is a totally new kind of learning experience."
	tokens = word_tokenize(text)
	lemma_function = WordNetLemmatizer()
	for token, tag in pos_tag(tokens):
		lemma = lemma_function.lemmatize(token, tag_map[tag[0]])
		print(token, "=>", lemma)

Caso de uso do lematizador

Explicação do código

  • Primeiramente, o leitor de corpus wordnet é importado.
  • WordNetLemmatizer é importado do wordnet.
  • A tokenização de palavras, bem como as tags de classes gramaticais, são importadas do nltk.
  • O Dicionário Padrão é importado das coleções.
  • O dicionário é criado onde pos_tag (primeira letra) são os valores-chave cujos valores são mapeados com o valor do dicionário wordnet. Pegamos a única primeira letra, pois a usaremos posteriormente no loop.
  • O texto é escrito e tokenizado.
  • É criado o objeto lemma_function que será usado dentro do loop.
  • O loop é executado e a lematização levará dois argumentos, um é token e o outro é um mapeamento de pos_tag com valor wordnet.

saída:

guru99 => guru99				
is => be				
totally => totally				
new => new				
kind => kind				
of => of				
learning => learn				
experience => experience				
. => .				 

Python A lematização tem uma estreita relação com dicionário wordnet, por isso é fundamental estudar este tema, por isso mantemos este como próximo tópico.