Processamento de linguagem natural e inteligência artificial
Processamento de linguagem natural é uma subárea da inteligência artificial. Ela desenvolve algoritmos que possibilitam interações entre humanos e computadores através da linguagem. O objetivo da área é criar programas de computadores capazes de entender, interpretar e gerar linguagem natural.
Entre as aplicações mais comuns de processamento de linguagem natural estão algoritmos de reconhecimento de discurso, chatbots, tradutores, algoritmos para análise sentimental e criação de sumários. Mas a área é um campo em rápida expansão e suas aplicações aumentam rapidamente.
A grande variedade de aplicações de algoritmos de processamento de linguagem natural faz desse campo um dos mais promissores da inteligência artificial para obter lucros. Algoritmos de processamento de linguagem natural como chatbots podem ser vendidos diretamente para empresas. Além disso, é possível usar as técnicas da área para criar aplicações online ou aplicativos para celulares e cobrar por seus usos.
Portanto, se você tem interesse em inteligência artificial e pensa em ingressar ou se aprofundar na área, aprender sobre processamento de linguagem natural é essencial.
A biblioteca spaCy para processamento de linguagem natural
A característica mais importante do processamento de linguagem natural para o desenvolvimento de algoritmos é que ele envolve processos com dados não estruturados como entrada. Portanto, esses algoritmos precisam ter elementos de estruturação desses dados. Geralmente, apenas após essa estruturação os algoritmos conseguem extrair significados e definir formas de outputs. E, para isso, uma das mais poderosas bibliotecas do Python, uma linguagem de programação fundamental em inteligência artificial, é a spaCy.
A biblioteca spaCy é de graça, open-source e tem uma grande variedade de funcionalidades prontas para uso. Ela foi desenvolvida especificamente para processamento de linguagem natural e é bastante popular. Além disso, ela foi desenhada totalmente voltada para o uso em produção. Por isso, ela é rápida, eficiente e muito apropriada para tarefas de processamento de linguagem natural de larga escala.
No entanto, é importante entender que spaCy não é uma biblioteca para a criação direta de certos aplicativos como chatbots. Geralmente ela é usada como um assistente na implementação deste tipo de aplicação. Principalmente para aplicações ou aplicativos em que os usuários podem submeter inputs longos de texto, a spaCy é fundamental na etapa de processamento de sentenças.
Instalação e teste
A instalação do spaCy pode ser feita com pip, o que requer outras dependências também, principalmente o modelo de linguagem para português:
pip install -U pip setuptools wheel
pip install -U spacy
python -m spacy download pt_core_news_sm
A instalação também pode ser feita através do anaconda, o que pode precisar da instalação do wheel também:
conda install -c conda-forge spacy
conda install -c conda-forge wheel
python -m spacy download pt_core_news_sm
Para verificar a instalação, digite e rode no seu terminal o código abaixo.
import spacy
from spacy.lang.pt.examples import sentences
nlp = spacy.load("pt_core_news_sm")
doc = nlp(sentences[0])
print(doc.text)
for token in doc:
print(token.text, token.pos_, token.dep_)
Se sua instalação estiver correta, o output deve ser assim:
Apple está querendo comprar uma startup do Reino Unido por 100 milhões de dólares
Apple PROPN nsubj
está AUX aux
querendo VERB ROOT
comprar VERB xcomp
uma DET det
startup NOUN obj
do ADP case
Reino PROPN nmod
Unido PROPN flat:name
por ADP case
100 NUM obl
milhões NUM flat
de ADP case
dólares NOUN nmod
Dica importante: se a sua instalação tiver erros e o código não rodar, busque em fóruns na web como lidar com eles. Simplesmente cole a mensagem de erro num browser e veja o que ele retorna em fóruns com StackOverFlow. Se as respostas forem em inglês, use um tradutor se precisar É normal ter erros no início, o importante é aprender a lidar com eles.
Dica importante 2: é fundamental que sua biblioteca spaCy tenha uma versão compatível com o modelo de português. Isso geralmente significa que os dois primeiros números da versão de cada arquivo precisam ser iguais. Se as suas instalações foram feitas com os comandos acima, provavelmente esse problema não irá ocorrer. Mas ele pode acontecer se você tentar instalar o modelo para português para usá-lo com uma versão que você já possuía da spaCy.
Para verificar a versão da spaCy, digite no terminal:
python -m spacy info
SpaCy pipeline
A biblioteca spaCy é totalmente desenvolvida para ser usada em produção, auxiliando desenvolvedores a realizar diversas tarefas necessárias na estruturação de discurso. Na prática, o processamento de linguagem natural realizado pela spaCy pode ser representado como uma pipeline. Isso significa que ela opera por um processo composto por várias etapas encadeadas. Algumas das principais são mostradas na figura abaixo. Cada etapa pode ser entendida como um algoritmo específico. A saída de cada algoritmo é a entrada do algoritmo da etapa seguinte.
O que torna essa configuração poderosa para a produção é que ela não precisa ser implementada em sua totalidade. Ou seja, é possível criar aplicações usando apenas algumas funcionalidades. Os critérios ficam a cargo dos desenvolvedores e de seus objetivos. Além disso, a estrutura da spaCy também possibilita que desenvolvedores criem suas próprias pipelines facilmente. Em sua totalidade, as funcionalidades da spaCy combinadas numa pipeline podem ser usadas para aplicações com um grau elevado de complexidade.
spaCy em ação
Para usar a spaCy é necessário importar a biblioteca e o modelo de línguagem que será usado.
import spacy
nlp = spacy.load("pt_core_news_sm")
Após essa etapa, a spaCy está pronta para ser explorada em algumas de suas funcionalidades.
Conhecendo as principais funcionalidades da spaCy: tokenizer
Tokenizer se refere a segmentação de um texto em seus componentes. O código a seguir é um exemplo de como esse procedimento pode ser realizado:
import spacy
nlp = spacy.load("pt_core_news_sm")
intro_doc = nlp("Isso é um tutorial em português do B.R. sobre a biblioteca spaCy. Essa biblioteca existe desde 2015 e tem suporte para mais de 73 línguas.")
for token in intro_doc:
print(token)
Esse é seu output:
Isso
é
um
tutorial
em
português
do
B.R.
sobre
a
biblioteca
spaCy
.
Essa
biblioteca
existe
desde
2015
e
tem
suporte
para
mais
de
73
línguas
.
Note que o resultado, a primeira vista, se parece com uma simples separação da string inicial a partir dos espaços presentes. Mas, se você analizar o resultado com mais cuidado, verá que na verdade a spaCy é mais precisa do que isso. A sigla B.R., por exemplo, é percebida como um único termo, embora a spaCy tenha separado o ponto final da sentença. Isso significa que sua separação reconhece tokens e não simplesmente espaços.
Conhecendo as principais funcionalidades da spaCy: tagger
O componente tagger é uma funcionalidade para categorizar as partes de um texto (part of speech ou POS). Essa funcionalidade explica o paper gramatical de cada palavra numa sentença. Isso significa classificar palavras em categorias como substantivos, verbos, entre outras. O código abaixo exemplifica algumas destas categorias sendo classificadas. Nesse código, a função spacy.explain também é usada para criar uma breve explicação sobre cada categoria encontrada no texto.
intro_doc = nlp("Isso é um tutorial em português do B.R. sobre a biblioteca spaCy, criada em 2015.")
for token in intro_doc:
print('TOKEN:', token, 'TAG:', token.tag_, 'POS:', token.pos_, 'EXPLICAÇÃO:', spacy.explain(token.tag_))
Esse é seu output:
TOKEN: Isso TAG: PRON POS: PRON EXPLICAÇÃO: pronoun
TOKEN: é TAG: AUX POS: AUX EXPLICAÇÃO: auxiliary
TOKEN: um TAG: DET POS: DET EXPLICAÇÃO: determiner
TOKEN: tutorial TAG: NOUN POS: NOUN EXPLICAÇÃO: noun
TOKEN: em TAG: ADP POS: ADP EXPLICAÇÃO: adposition
TOKEN: português TAG: NOUN POS: NOUN EXPLICAÇÃO: noun
TOKEN: do TAG: ADP POS: ADP EXPLICAÇÃO: adposition
TOKEN: B.R. TAG: PROPN POS: PROPN EXPLICAÇÃO: proper noun
TOKEN: sobre TAG: ADP POS: ADP EXPLICAÇÃO: adposition
TOKEN: a TAG: DET POS: DET EXPLICAÇÃO: determiner
TOKEN: biblioteca TAG: NOUN POS: NOUN EXPLICAÇÃO: noun
TOKEN: spaCy TAG: PROPN POS: PROPN EXPLICAÇÃO: proper noun
TOKEN: , TAG: PUNCT POS: PUNCT EXPLICAÇÃO: punctuation
TOKEN: criada TAG: VERB POS: VERB EXPLICAÇÃO: verb
TOKEN: em TAG: ADP POS: ADP EXPLICAÇÃO: adposition
TOKEN: 2015 TAG: NUM POS: NUM EXPLICAÇÃO: numeral
TOKEN: . TAG: PUNCT POS: PUNCT EXPLICAÇÃO: punctuation
Conhecendo as principais funcionalidades da spaCy: parser
O componente parser realiza segmentação de um texto ao mesmo tempo em que rastreia suas sentenças para indicar suas dependências. Para cada token do texto de entrada, o campo .dep_ indica o tipo de dependência que ela possui. O trecho de código abaixo mostra alguns exemplos dessa funcionalidade. Note que, como no trecho acima, a biblioteca spaCy também está sendo usada para gerar uma pequena explicação sobre sua própria funcionalidade.
intro_doc = nlp("Na coleção, o estilista pernambucano homenageia a excêntrica figura que por anos impactou telespectadores dos anos 1980.")
for token in intro_doc:
print('TOKEN:', token, '-- DEP:', token.dep_, '-- EXPLICAÇÃO:', spacy.explain(token.dep_))
Esse é output do código:
TOKEN: Na -- DEP: case -- EXPLICAÇÃO: case marking
TOKEN: coleção -- DEP: obl -- EXPLICAÇÃO: oblique nominal
TOKEN: , -- DEP: punct -- EXPLICAÇÃO: punctuation
TOKEN: o -- DEP: det -- EXPLICAÇÃO: determiner
TOKEN: estilista -- DEP: nsubj -- EXPLICAÇÃO: nominal subject
TOKEN: pernambucano -- DEP: amod -- EXPLICAÇÃO: adjectival modifier
TOKEN: homenageia -- DEP: ROOT -- EXPLICAÇÃO: root
TOKEN: a -- DEP: det -- EXPLICAÇÃO: determiner
TOKEN: excêntrica -- DEP: amod -- EXPLICAÇÃO: adjectival modifier
TOKEN: figura -- DEP: obj -- EXPLICAÇÃO: object
TOKEN: que -- DEP: mark -- EXPLICAÇÃO: marker
TOKEN: por -- DEP: case -- EXPLICAÇÃO: case marking
TOKEN: anos -- DEP: obl -- EXPLICAÇÃO: oblique nominal
TOKEN: impactou -- DEP: ccomp -- EXPLICAÇÃO: clausal complement
TOKEN: telespectadores -- DEP: obj -- EXPLICAÇÃO: object
TOKEN: dos -- DEP: case -- EXPLICAÇÃO: case marking
TOKEN: anos -- DEP: nmod -- EXPLICAÇÃO: modifier of nominal
TOKEN: 1980 -- DEP: obl -- EXPLICAÇÃO: oblique nominal
TOKEN: . -- DEP: punct -- EXPLICAÇÃO: punctuation
Já o campo .head indica quem é o pai sintático de cada token. Nesse exemplo o poder da spaCy no estabelecimento de relações linguísticas entre diferentes tokens se torna evidente.
intro_doc = nlp("Acharam que era Lady Gaga, mas era Elke Maravilha. É assim que Walério Araújo descreve o impacto da coleção desfilada na SPFW N55 entre os mais jovens.")
for token in intro_doc:
print('TOKEN:', token, '-- HEAD:', token.head)
Veja abaixo o output criado por esse trecho de código:
TOKEN: Acharam -- HEAD: Acharam
TOKEN: que -- HEAD: Lady
TOKEN: era -- HEAD: Lady
TOKEN: Lady -- HEAD: Acharam
TOKEN: Gaga -- HEAD: Lady
TOKEN: , -- HEAD: Elke
TOKEN: mas -- HEAD: Elke
TOKEN: era -- HEAD: Elke
TOKEN: Elke -- HEAD: Lady
TOKEN: Maravilha -- HEAD: Elke
TOKEN: . -- HEAD: Acharam
TOKEN: É -- HEAD: É
TOKEN: assim -- HEAD: É
TOKEN: que -- HEAD: descreve
TOKEN: Walério -- HEAD: descreve
TOKEN: Araújo -- HEAD: Walério
TOKEN: descreve -- HEAD: É
TOKEN: o -- HEAD: impacto
TOKEN: impacto -- HEAD: descreve
TOKEN: da -- HEAD: coleção
TOKEN: coleção -- HEAD: impacto
TOKEN: desfilada -- HEAD: coleção
TOKEN: na -- HEAD: SPFW
TOKEN: SPFW -- HEAD: desfilada
TOKEN: N55 -- HEAD: descreve
TOKEN: entre -- HEAD: jovens
TOKEN: os -- HEAD: jovens
TOKEN: mais -- HEAD: jovens
TOKEN: jovens -- HEAD: descreve
TOKEN: . -- HEAD: É
A spaCy também é capaz de gerar representações gráficas das relações entre os diferentes tokens de um texto. Isso é mostrado no exemplo abaixo. Note que para criar a representação gráfica, é necessário importar o displacy.
from spacy import displacy
intro_doc = nlp("Acharam que era Lady Gaga, mas era Elke Maravilha.")
displacy.serve(intro_doc, style="dep")
A figura gerada com as relações entre tokens da string intro_doc usada no código acima é mostrada abaixo:
Conhecendo as principais funcionalidades da spaCy: NER
Na pipeline da spaCy, o componente NER (Named-Entity Recognition) provavelmente é um dos mais poderosos. Seu forte é a extração de informações de textos. Isso significa que ele é capaz de localizar e classificar os tokens de um texto em categorias como nomes de pessoas, organizações, localizações geográficas, quantidades, valores monetários, entre muitas outras possibilidades. Com essas capacidades, fica evidente por que a spaCy é uma biblioteca poderosa para o processamento de linguagem natural. Por exemplo, no texto a seguir, a função label é capaz de reconhecer que Ana é uma pessoa (person), São Paulo é uma localização e Google é uma organização.
intro_doc = nlp("Um dos comportamentos mais automáticos no cotidiano de Ana quando está em São Paulo é buscar no Google sobre qualquer assunto.")
for token in intro_doc.ents:
print(token, token.label_)
Veja o resultado do código abaixo:
Ana PER
São Paulo LOC
Google ORG
Conhecendo as principais funcionalidades da spaCy: lemmatizer
A última funcionalidade da spaCy que iremos demonstrar é a lemmatizer, que pode ser utilizada para identificar a base de cada token. Por exemplo, a base da palavra foi é o verbo ser. Veja alguns exemplos com o código abaixo:
intro_doc = nlp("Os paulistas sempre adoraram uma fila.")
for token in intro_doc:
print(token.lemma_)
O output deste trecho de código é esse aqui:
o
paulista
sempre
adorar
um
fila
.
Conclusão
E com isso nós chegamos ao final deste post.
Neste post você conheceu um pouco sobre as funcionalidades tokenizer, tagger, parser, NER e lemmatizer. Mas o que nós mostramos aqui é apenas uma pequena parte do que a spaCy é capaz de fazer. A spaCy tem várias outras funcionalidades e muitos outros recursos. Para saber mais, visite o site oficial da biblioteca.
O código completo usado neste post está abaixo.
import spacy
from spacy import displacy
nlp = spacy.load("pt_core_news_sm")
intro_doc = nlp("Isso é um tutorial em português do B.R. sobre a biblioteca spaCy. Essa biblioteca existe desde 2015 e tem suporte para mais de 73 línguas.")
for token in intro_doc:
print(token)
intro_doc = nlp("Isso é um tutorial em português do B.R. sobre a biblioteca spaCy, criada em 2015")
for token in intro_doc:
print('TOKEN:', token, 'TAG:', token.tag_, 'POS:', token.pos_, 'EXPLICAÇÃO:', spacy.explain(token.tag_))
intro_doc = nlp("Isso é um tutorial em português sobre a biblioteca spaCy.")
for token in intro_doc:
print('TOKEN:', token, 'TAG:', token.tag_, 'POS:', token.pos_, 'EXPLICAÇÃO:', spacy.explain(token.tag_))
intro_doc = nlp("Na coleção, o estilista pernambucano homenageia a excêntrica figura que por anos impactou telespectadores dos anos 1980.")
for token in intro_doc:
print('TOKEN:', token, '-- DEP:', token.dep_, '-- EXPLICAÇÃO:', spacy.explain(token.dep_))
intro_doc = nlp("Acharam que era Lady Gaga, mas era Elke Maravilha. É assim que Walério Araújo descreve o impacto da coleção desfilada na SPFW N55 entre os mais jovens.")
for token in intro_doc:
print('TOKEN:', token, '-- HEAD:', token.head)
intro_doc = nlp("Acharam que era Lady Gaga, mas era Elke Maravilha.")
displacy.serve(intro_doc, style="dep")
intro_doc = nlp("Um dos comportamentos mais automáticos de Ana quando está em São Paulo é buscar no Google sobre qualquer assunto.")
for token in intro_doc.ents:
print(token, token.label_)
intro_doc = nlp("Os paulistas sempre adoraram uma fila.")
for token in intro_doc:
print(token.lemma_)