Apresentando o Natural Language Toolkit (NLTK)

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:

Verifique se instalamos o NLTK com sucesso

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:

Uma GUI a partir da qual você pode especificar o destino

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:

A saída do NLTK

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 é:

A saída resultante do script

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:

Procurando a palavra língua

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:

A saída do script acima

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+.

[ad_2]

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *