NLTK vs. SpaCy
Para trabalhar com texto no âmbito computacional precisamos fazer diversos tratamentos nos dados. Isso ocorre porque para utilizarmos os dados em modelos e para extrairmos informações precisamos transformá-los. Para facilitar esses processos temos algumas bibliotecas que vão simplificar a aplicação de diversas técnicas e facilitar seu uso. Hoje iremos conhecer as duas principais do mundo do Processamento de Linguagem Natural (PLN ou NLP em inglês), a SpaCy e a NLTK.
NLTK significa Natural Language Toolkit, que é algo como uma caixa de ferramentas para linguagem natural. Essa biblioteca foi desenvolvida na universidade da Pennsylvania e é totalmente voltada para o contexto acadêmico. Ela contém vários algoritmos já implementados para resolver os mais diversos tipos de tratamento. Uma característica da NLTK é que ela foi construída como um manipulador de listas e strings, isso quer dizer que, ela recebe uma string ou lista, faz transformações e depois retorna também os mesmo tipos.
Já o SpaCy foi desenvolvido pensando em aplicações reais, mas o que isso quer dizer?
Bom, ele não vai te fornecer 10 algoritmos diferentes para resolver o mesmo problema, sendo que já foi demonstrado em estudos qual é o mais eficaz. Outro ponto é que o SpaCy faz uso das melhores práticas de engenharia de software visando entregar a performance mais adequada para o ambiente de produção.
O SpaCy trabalha com a abordagem de orientação a objetos, isso quer dizer que você vai criar um objeto com seu texto e a partir dele poderá chamar os métodos de transformação dos seus dados.
Um procedimento bastante utilizado quando trabalhamos com dados textuais é a tokenização. A tokenização é o processo de separação de um trecho de texto em unidades menores chamadas tokens. Para exemplificar, vamos utilizar a técnica de tokenização para verificar as diferenças e semelhanças de se utilizar as bibliotecas SpaCy e NLTK. Vamos lá!?
SpaCy
Primeiro vamos salvar uma frase na variável text.
text = '"You only live once, but if you do it right, once is enough."'
Agora vamos utilizar o SpaCy, para isso devemos importar o pacote spacy e carregar o pipeline em inglês.
import spacy
nlp = spacy.load("en_core_web_sm")
Depois vamos criar o objeto Doc, que tem como valor de construtor o texto da variável text.
doc = nlp(text)
Por fim, já podemos iterar sobre o objeto Doc e passar por cada **token* criado, acessando seu valor pelo atributo .text**.
lst = []
for token in doc:
lst.append(token.text)
print(lst)
Saída:
['"', 'You', 'only', 'live', 'once', ',', 'but', 'if', 'you', 'do', 'it', 'right', ',', 'once', 'is', 'enough', '.', '"']
NLTK
Agora vamos fazer a mesma coisa utilizando a NLTK:
Primeiro importamos a NLTK e fazemos o download do punkt o modelo de tokenização.
import nltk
nltk.download('punkt')
Depois importamos a função word_tokenize.
from nltk.tokenize import word_tokenize
Por fim, utilizamos a função enviando a frase que estão na variável text.
print(word_tokenize(text))
Saída:
['``', 'You', 'only', 'live', 'once', ',', 'but', 'if', 'you', 'do', 'it', 'right', ',', 'once', 'is', 'enough', '.', "''"]
Obtivemos os mesmos resultados nesse caso. Vale notar que em ambos os casos houve a necessidade de fazer download de uma parte específica da toolbox, isso porque ambas têm a preocupação de não baixar diversos modelos que não serão utilizados no seu projeto, então você pode escolher quais baixar.
Uma diferença que podemos destacar é em como as bibliotecas interagem com seu texto. Na NLTK o usuário fica com a responsabilidade de fornecer o texto e guardar seu retorno. Já no SpaCy, com sua abordagem OO, depois de receber o texto, o usuário pode só se preocupar em utilizar os diversos recursos contidos no objeto.
Para ver mais sobre as diferenças na aplicação destas bibliotecas recomendo o artigo Lemmatization vs. stemming: quando usar cada uma? onde temos outro exemplo aplicando ambas as bibliotecas.
Então, embora a NLTK possua uma infinidade de implementações de soluções, a estratégia do SpaCy de ter apenas as melhores soluções para cada problema traz uma facilidade para o desenvolvedor e para o ambiente de prototipação e produção. Avaliando as bibliotecas e suas propostas, fica claro que a melhor aplicação da NLTK fica para o ambiente acadêmico e de pesquisa no campo do NLP, enquanto o SpaCy deve ser usado quando estivermos construindo protótipos e visando uma aplicação real e em escala.
Para verificar o que estudamos nesse artigo, você pode consultar o notebook que exemplifica o explicado aqui.