O processamento de linguagem natural (PNL) é o processamento automático ou semiautomático da linguagem humana. A PNL está intimamente relacionada à linguística e tem links para pesquisas em ciências cognitivas, psicologia, fisiologia e matemática. No domínio da ciência da computação em particular, o NLP está relacionado a técnicas de compilador, teoria da linguagem formal, interação humano-computador, aprendizado de máquina e prova de teoremas. Esta questão do Quora mostra diferentes vantagens da PNL.
Neste tutorial, vou guiá-lo por uma plataforma Python interessante para NLP chamada Natural Language Toolkit (NLTK). Antes de vermos como trabalhar com esta plataforma, deixe-me primeiro dizer o que é NLTK.
O que é NLTK?
O Natural Language Toolkit (NLTK) é uma plataforma usada para construir programas para análise de texto. A plataforma foi lançada originalmente por Steven Bird e Edward Loper em conjunto com um curso de linguística computacional na Universidade da Pensilvânia em 2001. Há um livro que acompanha a plataforma chamado Natural Language Processing with Python.
Instalando o NLTK
Vamos agora instalar o NLTK para começar a experimentar o processamento de linguagem natural. Será divertido!
A instalação do NLTK é muito simples. Estou usando o Windows 10, então no meu prompt de comando (MS-DOS
) Eu digito o seguinte comando:
Se você estiver usando Ubuntu ou macOS, execute o comando do Terminal
. Mais informações sobre a instalação do NLTK em diferentes plataformas podem ser encontradas na documentação.
Se você está se perguntando o que pip
ou seja, é um sistema de gerenciamento de pacotes usado para instalar e gerenciar pacotes de software escritos em Python. Se estiver usando Python 2 >=2.7.9 ou Python 3 >=3.4, você já tem pip
instalado! Para verificar sua versão do Python, basta digitar o seguinte no prompt de comando:
Vamos verificar se instalamos o NLTK com sucesso. Para fazer isso, abra o IDLE do Python e digite as duas linhas mostradas na figura abaixo:
Se você obtiver a versão do seu NLTK retornada, parabéns, você instalou o NLTK com sucesso!
Portanto, o que fizemos na etapa acima foi instalar o NLTK do índice do pacote Python (pip) localmente em nosso ambiente virtual.
Observe que você pode ter uma versão diferente do NLTK dependendo de quando instalou a plataforma, mas isso não deve causar problemas.
Trabalhando com NLTK
A primeira coisa que precisamos fazer para trabalhar com o NLTK é baixar o que chamamos de NLTK corpora. Vou baixar todos os corpora. Sei que é muito grande (10,9 GB), mas faremos isso apenas uma vez. Se você souber de quais corpora precisa, não precisará fazer o download de todos os corpora.
No IDLE do seu Python, digite o seguinte:
1 |
import nltk |
2 |
nltk.download() |
Nesse caso, você obterá uma GUI a partir da qual poderá especificar o destino e o que baixar, conforme mostrado na figura abaixo:
Vou baixar tudo neste momento. Clique no Download botão na parte inferior esquerda da janela e aguarde um pouco até que tudo seja baixado para o diretório de destino.
Antes de prosseguir, você pode estar se perguntando o que é um corpus (singular de corpora) é. Um corpus pode ser definido da seguinte forma:
Corpus, corpora plural; Uma coleção de dados linguísticos, compilados como textos escritos ou como uma transcrição de fala gravada. O principal objetivo de um corpus é verificar uma hipótese sobre a linguagem – por exemplo, determinar como o uso de um determinado som, palavra ou construção sintática varia. A lingüística de corpus lida com os princípios e a prática do uso de corpora no estudo da linguagem. Um corpus de computador é um grande corpo de textos legíveis por máquina.
(Crystal, David. 1992. Um dicionário enciclopédico de idiomas e idiomas. Oxford: Blackwell.)
Um corpus de texto é, portanto, simplesmente qualquer grande corpo de texto.
Tokenização
A tokenização, conforme definido na Wikipedia, é:
O processo de dividir um fluxo de texto em palavras, frases, símbolos ou outros elementos significativos chamados tokens.
Tokenizador de sentenças
A tokenização de sentença é quando o texto é dividido em sentenças usando o sent_tokenize()
método. Considere o seguinte texto.
Considere o seguinte texto.
1 |
"Python is a very high-level programming language. Python is interpreted."
|
Vamos tokenizá-lo usando o sent_tokenize()
método.
1 |
from nltk.tokenize import sent_tokenize |
2 |
text = "Python is a very high-level programming language. Python is interpreted." |
3 |
print(sent_tokenize(text)) |
Aqui está a saída, que retorna uma lista do texto dividido em duas frases.
1 |
['Python is a very high-level programming language.', 'Python is interpreted.'] |
Tokenizador de palavras
A tokenização de palavras é quando o texto é dividido em palavras usando o word_tokenize()
método. Vamos usar o mesmo texto e passá-lo pelo word_tokenize()
método.
1 |
from nltk.tokenize import word_tokenize |
2 |
text = "Python is a very high-level programming language. Python is interpreted." |
3 |
print(word_tokenize(text)) |
Aqui está a saída:
1 |
['Python', 'is', 'a', 'very', 'high-level', 'programming', 'language', '.', 'Python', 'is', 'interpreted', '.'] |
Como você pode ver na saída, as pontuações também são consideradas como palavras.
palavras de parada
Às vezes, precisamos filtrar dados inúteis para torná-los mais compreensíveis pelo computador. No processamento de linguagem natural (NLP), esses dados inúteis (palavras) são chamados pare de palavras. Portanto, essas palavras para nós não têm significado e gostaríamos de removê-las.
O NLTK nos fornece algumas palavras de parada para começar. Para ver essas palavras, use o seguinte script:
1 |
from nltk.corpus import stopwords |
2 |
print(set(stopwords.words('English'))) |
Nesse caso, você obterá a seguinte saída:
O que fizemos foi imprimir um conjunto (coleção não ordenada de itens) de palavras de parada no idioma inglês. Se você estiver usando outro idioma, por exemplo, alemão, deverá defini-lo da seguinte forma:
1 |
from nltk.corpus import stopwords |
2 |
print(set(stopwords.words('german'))) |
Como podemos remover as palavras de parada do nosso próprio texto? O exemplo abaixo mostra como podemos realizar esta tarefa:
1 |
from nltk.corpus import stopwords |
2 |
from nltk.tokenize import word_tokenize |
3 |
|
4 |
text = 'In this tutorial, I'm learning NLTK. It is an interesting platform.' |
5 |
stop_words = set(stopwords.words('english')) |
6 |
words = word_tokenize(text) |
7 |
|
8 |
new_sentence = [] |
9 |
|
10 |
for word in words: |
11 |
if word not in stop_words: |
12 |
new_sentence.append(word) |
13 |
|
14 |
print(new_sentence) |
A saída do script acima é:
Então o que word_tokenize()
função faz é:
Tokenize uma string para separar pontuação diferente de pontos
Procurando
Digamos que temos o seguinte arquivo de texto (baixe o arquivo de texto do Dropbox). Gostaríamos de procurar (pesquisar) a palavra language
. Podemos simplesmente fazer isso usando a plataforma NLTK da seguinte maneira:
1 |
import nltk |
2 |
|
3 |
file = open('NLTK.txt', 'r') |
4 |
read_file = file.read() |
5 |
text = nltk.Text(nltk.word_tokenize(read_file)) |
6 |
|
7 |
match = text.concordance('language') |
Nesse caso, você obterá a seguinte saída:
Notar que concordance()
retorna todas as ocorrências da palavra language
, além de algum contexto. Antes disso, conforme mostrado no script acima, tokenizamos o arquivo lido e depois o convertemos em um nltk.Text
objeto.
Só quero observar que na primeira vez que executei o programa, recebi o seguinte erro, que parece estar relacionado à codificação que o console usa:
1 |
File "test.py", line 7, in |
2 |
match = text.concordance('language').decode('utf-8') |
3 |
File "C:Python35libsite-packagesnltktext.py", line 334, in concordance |
4 |
self._concordance_index.print_concordance(word, width, lines) |
5 |
File "C:Python35libsite-packagesnltktext.py", line 200, in print_concordance |
6 |
print(left, self._tokens[i], right) |
7 |
File "C:Python35libencodingscp437.py", line 19, in encode |
8 |
return codecs.charmap_encode(input,self.errors,encoding_map)[0] |
9 |
UnicodeEncodeError: 'charmap' codec can't encode character 'u2014' in position 11: character maps to |
O que eu simplesmente fiz para resolver esse problema foi executar este comando no meu console antes de executar o programa: chcp 65001
.
O Corpus de Gutemberg
Conforme mencionado na Wikipédia:
O Projeto Gutenberg (PG) é um esforço voluntário para digitalizar e arquivar obras culturais, para “incentivar a criação e distribuição de eBooks”. Foi fundada em 1971 por Michael S. Hart e é a mais antiga biblioteca digital. A maioria dos itens em sua coleção são os textos completos de livros de domínio público. O projeto tenta torná-los o mais gratuitos possível, em formatos abertos e duradouros que podem ser usados em praticamente qualquer computador. Em 3 de outubro de 2015, o Projeto Gutenberg atingiu 50.000 itens em sua coleção.
NLTK contém uma pequena seleção de textos do Projeto Gutenberg. Para ver os arquivos incluídos do Project Gutenberg, fazemos o seguinte:
1 |
import nltk |
2 |
|
3 |
gutenberg_files = nltk.corpus.gutenberg.fileids() |
4 |
print(gutenberg_files) |
A saída do script acima será a seguinte:
Se quisermos encontrar o número de palavras para o arquivo de texto bryant-stories.txt
por exemplo, podemos fazer o seguinte:
1 |
import nltk |
2 |
|
3 |
bryant_words = nltk.corpus.gutenberg.words('bryant-stories.txt') |
4 |
print(len(bryant_words)) |
O script acima deve retornar o seguinte número de palavras: 55563
.
Conclusão
Como vimos neste tutorial, a plataforma NLTK nos fornece uma ferramenta poderosa para trabalhar com processamento de linguagem natural (NLP). Eu apenas arranhei a superfície neste tutorial. Se você quiser se aprofundar no uso do NLTK para diferentes tarefas de NLP, consulte o livro que acompanha o NLTK: Natural Language Processing with Python.
Este post foi atualizado com contribuições de Esther Vaati. Esther é desenvolvedora de software e escritora da Envato Tuts+.