NLTK Tutorial
Sejam bem vindos, esperamos que esse tutorial consiga resumir os principais tópicos sobre NLTK e esclarecer quaisquer possíveis dúvidas que venham a surgir durante o exercício final. Caso ainda estejam com problemas na resolução sintam-se à vontade para entrar em contato com o grupo por email.
O QUE É?
NLTK (Natural Language ToolKit) é uma biblioteca de Python utilizada para natural language processing (NLP), que é, de forma resumida, o processo para desenvolver algoritmos capazes de “entender” a linguagem humana. Atividades simples para nós, como resumir um texto, associar palavras que têm alguma relação, como pássaro e ninho, ou dizer quem é que está praticando a ação descrita pelo verbo tornam-se muito mais complicadas quando pretendemos passar essas tarefas para uma máquina.
Para facilitar esse trabalho foram desenvolvidas plataformas como a NLTK que tem como objetivo proporcionar as ferramentas necessárias para estudos e pesquisas na área, além de ser utilizada para ensinar NLP e temas relacionados.
Mais detalhes:
Desenvolvido por: Steven Bird, Edward Loper e Ewan Klein
Ano de lançamento: 2001
Disponível para Windows, Mac OS X e Linux. É um projeto gratuito e de código aberto (open source). Site oficial https://www.nltk.org/
COMO INSTALAR?
Iremos dar uma pequena explicação sobre como instalar o NLTK no Python antes de começarmos a demonstrar o que pode ser feito com o auxílio dessa biblioteca.
- Primeiramente certifique-se de ter o Python instalado e em alguma dessas versões: 2.7, 3.5, 3.6 ou 3.7 com o pacote pip (você pode procurar o arquivo na pasta Scripts para se certificar ou escrever o comando pip — version)
- Se você estiver usando Mac ou Linux talvez tenha que baixar o pip por fora, mais informações em: https://packaging.python.org/tutorials/installing-packages/
- Se não tiver o Python baixado vá no site https://www.python.org/downloads/, baixe o Python em alguma das versões acima escolha a instalação customizada e selecione todas as opções, se desejar vá em opções avançadas e modifique o local de download.
- Posteriormente procure o endereço onde o arquivo pip foi salvo (pasta Scripts) e o copie
- Depois abra o terminal, escreva o endereço da pasta Scripts e decida qual das alternativas se encaixa na sua situação:
(No lugar de pip usar pip2 para Python 2 e pip3 para o Python 3)
- Ubuntu
Para instalar no Ubuntu escreva no terminal:
>>> sudo pip install -U nltk
2. Windows
Para instalar no Windows baixe diretamente pelo site https://pypi.org/project/nltk/#files ou escreva no terminal:
>>> pip install nltk
3. Mac
Para instalar no Mac escreva no terminal:
>>> pip install — user -U nltk
Observação:
Versões mais antigas de Python podem necessitar de mais etapas para instalação, caso se encontre com esse problema ou deseje mais informações sobre o processo de instalação você pode acessar: https://www.nltk.org/install.html
- Outra opção disponível é instalar através do anaconda digitando no prompt:
>>> conda install -c anaconda nltk
- Para verificar sua instalação e ir para o próximo passo importe o nltk usando o comando:
>>> import nltk
- Para abrir opções de download digite:
>>> nltk.download()
- Escolha uma das opções, se desejar baixar todos os dados escolha a primeira opção. O popular normalmente é o suficiente para atividades iniciais. Baixe-o também com o comando nltk.download(‘popular’). Para mais informações acesse: http://www.nltk.org/data.html
APLICAÇÕES
O NLTK fornece classes básicas para representar dados relevantes ao processamento de texto; interfaces padrão para executar tarefas, análise sintática e classificação textual.
Algumas funções que você pode usar nesta biblioteca são:
PRIMEIROS PASSOS
- Primeiramente vamos aprender a tokenize, ou seja, separar seu texto em partes menores.
Aqui está um passo a passo de como separar por frases:
>>> text=”Estamos aprendendo a usar essa biblioteca. Esperamos sair deste tutorial sabendo o básico. Bons estudos a todos!”
>>> from nltk.tokenize import sent_tokenize
>>> print(sent_tokenize(text, “portuguese”))
Resultado: {“Estamos aprendendo a usar essa biblioteca.”; “ Esperamos sair deste tutorial sabendo o básico.”;”Bons estudos a todos!”}
Você não deve ter problemas com vírgulas, pontos ou pronomes de tratamento como Sr. e Sra nem em dividir sentenças de outras línguas que o NLTK é capaz de interpretar, contanto que especifique como no exemplo ou modifique o padrão. O que pode ocorrer são erros em abreviações.
Vamos ver a separação por palavras:
>>> print(nltk.word_tokenize(text, “portuguese”))
Resultado: {“Estamos”; “aprendendo”; “a”; “usar”; “essa”; “biblioteca”;”.”; “Esperamos”; “sair”; “deste”; “tutorial”; “sabendo”; “o”; “básico”; “.” ; ”Bons”; “estudos”; “a”; “todos”; “!” }
- Podemos também achar sinônimos e suas definições
>>> from nltk.corpus import wordnet
>>> sin = wordnet.synsets(‘love’)
>>> print(sin)
O resultado será uma lista de palavras sinônimas a que você escolheu. Para buscar a definição determine a posição do sinônimo que quer saber a definição e escreva
>>> print(sin[posição].definition())
Para ter acesso a exemplos de aplicação dessa palavra coloque
>>> print(sin[posição].examples())
- Stemming é remover os afixos da palavra, a reduzindo a uma forma mais simples. O stem (tronco) não precisa ser idêntico à raiz morfológica da palavra.
>>> from nltk.stem import PorterStemmer
>>> stemmer = PorterStemmer()
>>> print(stemmer.stem(‘loving’))
Resultado: {love}
Para usar essa ferramenta para outras línguas faça:
>>> SnowballStemmer.languages
disponiveis: (‘arabic’, ‘danish’, ‘dutch’, ‘english’, ‘finnish’, ‘french’, ‘german’, ‘hungarian’, ‘italian’, ‘norwegian’, ‘porter’, ‘portuguese’, ‘romanian’, ‘russian’, ‘spanish’, ‘swedish’)
>>> rom_stemmer = SnowballStemmer(‘portuguese’)
>>> print(rom_stemmer.stem(‘dançando’))
Resultado: {danç}
Esse método, contudo, pode devolver palavras incorretas, como no exemplo acima, portanto se usa mais lemmatizing para fazer a mesma função
>>> from nltk.stem import WordNetLemmatizer
>>> lem = WordNetLemmatizer()
>>> print(lem.lemmatize(‘believes’))
Resultado: {belief}
- Outro processo muito utilizado no análise de texto é a identificação e, normalmente, separação das stopwords que são termos que não agregam assunto ao texto, como pronomes, conectivos, etc.
Lista de stopwords:
>>> from nltk.corpus import stopwords
>>> stopwords.words(‘portuguese’)
Retirando-as de um textos:
>>> stw = set(stopwords.words(‘portuguese’))
>>> from nltk.tokenize import word_tokenize
>>>palav = word_tokenize(text)
>>>filtro = [ ]
>>> for p in palav:
if p not in stw:
filtro.append(p)
>>> print(filtro)
- Classificar de palavras nas seguintes categorias pode ser feito desse modo:
>>> from nltk.tokenize import PunktSentenceTokenizer
Armazene seu texto em uma variável para facilitar o processo, a separe em palavras usando a lógica já explicada nos tópicos anteriores e guarde essas palavras em uma lista desse modo:
>>> palavras = nltk.sent_tokenize(texto)
Depois navegue nessa lista imprimindo na tela cada palavra seguido por sua classificação
>>> for palav in palavras:
print(nltk.pos_tag(nltk.word_tokenize(palav)))
Resultado: Deve mostrar cada palavra da seguinte forma {(‘I’, ‘PRP’)}
ATIVIDADE RESOLVIDA
Vamos demonstrar mais funcionalidades dessa ferramenta com esse exercício resolvido
- Utilize um texto do nltk ou oriundo da internet e realize o pré processamento, posteriormente use a ferramenta para resumir o texto escolhido.
Para essa atividade é necessário instalar outra ferramenta:
pip install beautifulsoup4
# importando texto de site online :
from urllib.request import Request, urlopen
link = Request(‘http://ultimosegundo.ig.com.br/politica/2017-04-25/reforma-da-previdencia.html',headers={'User-Agent': ‘Mozilla/5.0’})
pagina = urlopen(link).read().decode(‘utf-8’, ‘ignore’)
from bs4 import BeautifulSoup
soup = BeautifulSoup(pagina, “lxml”)
texto = soup.find(id=”noticia”).text
from nltk.tokenize import word_tokenize
from nltk.tokenize import sent_tokenize
# separando nosso texto em frases e em palavras
sentencas = sent_tokenize(texto)
palavras = word_tokenize(texto.lower())
# texto.lower() para mudar todas as palavras para minúsculas (útil na contagem de frequência)
# Importando stopwords e pontuações
from nltk.corpus import stopwords
from string import punctuation
# Fazendo uma lista com as stopwords e pontuações:
stopwords = set(stopwords.words(‘portuguese’) + list(punctuation))
# Tirando as stopwords e pontuações ao criar uma lista sem os elementos da lista anterior:
palavras_sem_stopwords = [palavra for palavra in palavras if palavra not in stopwords]
# Importando ferramenta para calcular frequência
from nltk.probability import FreqDist
# Fazendo um dicionário com cada palavra da lista e sua frequência
frequencia = FreqDist(palavras_sem_stopwords)
# Importando dicionário
from collections import defaultdict
# Criando um dicionário com o número inteiro 0 como padrão para as chaves não existentes (se solicitada retorna 0, ou seja se buscar a frequência de uma palavra que não está no texto a resposta é 0)
sentencas_importantes = defaultdict(int)
# Preenchendo dicionário:
#Para cada uma das frases do texto (onde cada frase está sendo numerada) dividimos essa frase em palavras (como feito no início)
for i, sentenca in enumerate(sentencas):
for palavra in word_tokenize(sentenca.lower()):
# Se esta palavra estiver em frequência (ou seja se ela não for stopwords ou pontuação)
if palavra in frequencia:
# Adicionamos a sentencas_importantes na posição i o valor da frequência da palavra
sentencas_importantes[i] += frequencia[palavra]
# Importando ferramenta para separar os maiores valores
from heapq import nlargest
# Separando as 4 palavras mais frequentes (posição na lista)
idx_sentencas_importantes = nlargest(4, sentencas_importantes, sentencas_importantes.get)
# Imprimindo em ordem crescente (sorted) a aparição das palavras mais frequentes criando assim um resumo do texto
for i in sorted(idx_sentencas_importantes):
print(sentencas[i])
FAÇA VOCÊ MESMO
Utilize um texto do nltk ou oriundo da internet, realize o pré processamento do texto, remova stopword e retorne uma lista com as palavras mais importantes e a frequência delas.
Dica: Utilize o cálculo de frequência explicado acima a seu favor. Boa atividade!
EQUIPE E FORMAS DE CONTATO
ERICO ANDRE SILVA, ericoandresilva@gmail.com
JEN HORNG LIU, liujenhorng@gmail.com
JOÃO UCHOA, joaopcu@gmail.com
MAELY SOUZA COUTINHO, maelyalways@gmail.com
VIVIANE ARAÚJO, viviane.baraujo1997@gmail.com
Fontes:
https://data-flair.training/blogs/nltk-python-tutorial/
http://www.nltk.org/howto/portuguese_en.html
https://kite.com/python/docs/nltk.FreqDist
https://www.guru99.com/download-install-nltk.html
https://www.geeksforgeeks.org/python-pandas-dataframe-nlargest/
https://data-flair.training/blogs/python-stemming/
https://www.programiz.com/python-programming/methods/built-in/sorted