Derivação e lematização em Python NLTK com exemplos

O que é Stemming e Lemmatization em Python NLTK?

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

Neste tutorial Stemming & Lemmatization, você aprenderá:

O que é Stemming?

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

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

Por exemplo

 He was riding. He was taking the ride. 

Nas duas frases acima, o significado é o mesmo, ou seja, a atividade de cavalgar no passado. Um humano pode entender facilmente que os dois significados são os mesmos. 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 falha em prever. Portanto, é necessário diferenciar o significado de cada palavra para preparar o conjunto de dados para o aprendizado de máquina. E aqui o radical é usado para categorizar o mesmo tipo de dados obtendo sua palavra raiz.

Vamos implementar isso com um programa Python. O NLTK tem um algoritmo chamado 'PorterStemmer'. Este algoritmo aceita a lista de palavras tokenizadas e converte-as em palavras 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 

Explicação do código:

  • Existe um módulo de tronco em 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 de haste, 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'. Por fim, 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 derivação é considerada uma etapa de pré-processamento importante 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 on2vhf , you have build a veri good site and I love visit your site 

Explicação do código:

  • O pacote PorterStemer é importado da haste do módulo
  • Pacotes para tokenização de frases e palavras são importados
  • Uma frase é escrita e deve ser simbolizada na próxima etapa.
  • A tokenização de palavras com 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 de código 5

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 ambigüidade no treinamento e na previsão do aprendizado de máquina. Para criar um modelo de sucesso, é vital filtrar essas palavras e converter 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 remover dados redundantes, também conhecido como normalização.

O que é Lemmatizaçã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 de palavras, que visa remover terminações flexionais. Ajuda a retornar a forma base ou dicionário de uma palavra conhecida como lema.

O método de Lemmatização NLTK é baseado na função de metamorfose integrada da WorldNet. O pré-processamento de texto inclui lematização e lematização. Muitas pessoas acham os dois termos confusos. Alguns tratam isso como o mesmo, mas há uma diferença entre lematização e lematização. A lematização é preferível à anterior por causa da razão abaixo.

Por que a lematização é melhor do que o stemming?

O algoritmo de derivação 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 básica de todas as suas formas flexionais. É necessário um conhecimento linguístico aprofundado para criar dicionários e procurar a forma adequada da palavra. Stemming é uma operação geral, enquanto a lematização é uma operação inteligente em que a forma apropriada será consultada no dicionário. Portanto, a lematização ajuda a formar melhores recursos de aprendizado de máquina.

Código para distinguir entre lematização e derivaçã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 de saída

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

Caso de uso do Lemmatizer

O Lemmatizer minimiza a ambiguidade do texto. Palavras de exemplo como bicicleta ou bicicletas são convertidas na palavra básica bicicleta. Basicamente, ele converterá todas as palavras com o mesmo significado, mas representações diferentes, em sua forma básica. Ele reduz a densidade de palavras no texto fornecido e ajuda a preparar os recursos precisos para a máquina de treinamento. 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 de Wordnet Lemmatization e POS Tagging 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 = 'on2vhf 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) 

Explicação do código

  • Em primeiro lugar, o leitor de corpus wordnet é importado.
  • WordNetLemmatizer é importado do wordnet.
  • A tokenização de palavras, bem como a tag de classes gramaticais são importadas do nltk.
  • O Dicionário padrão é importado de 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 mais tarde no loop.
  • O texto é escrito e é tokenizado.
  • O objeto lemma_function é criado e será usado dentro do loop.
  • O loop é executado e o lemmatize terá dois argumentos, um é token e o outro é um mapeamento de pos_tag com valor wordnet.

Saída :

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

A Lemmatização Python tem uma relação próxima com dicionário wordnet , por isso é essencial estudar este tópico, por isso o mantemos como o próximo tópico.