1. NLP (Processamento de Linguagem Natural)

O que é NLP?

NLP, ou Processamento de linguagem natual, é um ramo da inteligência artificial que busca traduzir a linguagem humana de forma que os computadores possam compreendê-la. Há uma grande chance de que você já interagiu com ferramentas que utilizam NLP (possivelmente hoje). É a partir desse processo que muitas dos produtos amplamente utilizados hoje (Alexa, Siri, Google Assistant…) conseguem compreender o que foi falado por seus usuários e realizar as tarefas adequadamente.

Objetivos

O objetivo principal da NLP é transformar um dado não-estruturado em um dado estruturado. Mas o que isso quer dizer? Imaginemos que acionei meu assistente de IA para realizar uma tarefa, como:

"Alexa, adicione creatina à minha lista de compras."

A NLP precisa “formatar” essa informação de forma que a ação seja executada por um serviço com acesso a meu carrinho de compras. Suponhamos que essa informação precise ser passada no formato JSON. O dado estruturado, então, seria estruturado de forma semelhante a apresentada a seguir:

"carrinho_de_compras": [
  {
  "produto": "creatina",
  "quantidade": 1
  }
]

Dentre outras ferramentas que aplicam o uso de NLP, podemos citar:

  • Tradução de textos (ex. inglês → português)
  • Filtro de spam (e-mails)
  • Moderação de conteúdo (redes sociais)

Principais desafios

Como esperado, a “tradução” desses dados envolve alguns desafios, uma vez que o texto que produzimos através da fala não possui regras claras de divisão. Desta forma, precisamos utilizar algumas estratégias de pré-processamento para realizar este processo, dentre as quais se destacam:

  • Tokenização (Tokenization)
  • Stemização (Stemming)
  • Lematização (Lemmatization)
  • Marcação POS (POS Tagging)

Pré-processamento

Nos algoritmos a seguir, utilizamos scripts python com auxílio da biblioteca nltk (Natural language Toolkit) para testar os diferentes métodos utilizados na NLP.

import nltk
nltk.download('punkt_tab')
nltk.download('stopwords')
nltk.download('averaged_perceptron_tagger_eng')
nltk.download('wordnet')
nltk.download('tagsets')

Tokenização

A ideia por trás da tokenização envolve separar a string recebida (instrução passada, texto a ser traduzido…) em unidades menores chamadas tokens. Esses tokens podem ser, por exemplo, as palavras ou símbolos utilizados na frase. No exemplo a seguir, utilizamos a famosa frase “There is nothing either good or bad but thinking makes it so.” do livro Hamlet, de Shakespeare e aplicamos um script python para realizar a tokenização:

from nltk.tokenize import word_tokenize

text = "There is nothing either good or bad but thinking makes it so."
words = word_tokenize(text)

print("Original:", text)
print("Quantidade de tokens: ", len(words))
print("Tokenizado:", words)

Stemização

O processo de stemização é realizado após o processo de tokenização e envolve reduzir palavras flexionadas à sua raiz. Palavras com a mesma raiz, como “universo” e “universal”, então, poderiam ser facilmente associadas para facilitar a compreensão. Porem, existem algumas dificuldades presentes nesse processo. Dentre elas, se destaca a frequente associação errônea de palavras, como “universal” e “universidade”, que poderiam facilmente ser reduzidas a uma mesma raiz “universo”, o que não é correto. No exemplo abaixo, realizamos o processo de stemização nos tokens gerados anteriormente:

from nltk.stem.snowball import SnowballStemmer
from nltk.tokenize import word_tokenize

stemmer = SnowballStemmer("english", True)
stemmed_words = [stemmer.stem(word) for word in words]

print("Stemmed:", stemmed_words)

Lematização

A lematização, semelhantemente à stemização, reduz palavras flexionadas à sua raiz, mas não se baseia unicamente na morfologia das palavras. As palavras flexionadas são reduzidas à sua forma base utilizando uma consulta ao dicionário. Problemas de associação errônea do processo de stemização, então, são drasticamente reduzidos, mas em troca, são utilizados mais recursos. A seguir, realizamos o processo de stemização também nos tokens gerados:

from nltk.stem import WordNetLemmatizer
from nltk.corpus import wordnet
from nltk import word_tokenize, pos_tag

def get_wordnet_pos(tag):
    if tag.startswith('J'):
        return wordnet.ADJ
    elif tag.startswith('V'):
        return wordnet.VERB
    elif tag.startswith('N'):
        return wordnet.NOUN
    elif tag.startswith('R'):
        return wordnet.ADV
    else:
        return wordnet.NOUN

def lemmatize_passage(text):
    words = word_tokenize(text)
    pos_tags = pos_tag(words)
    lemmatizer = WordNetLemmatizer()
    lemmatized_words = [lemmatizer.lemmatize(word, get_wordnet_pos(tag)) for word, tag in pos_tags]
    lemmatized_sentence = ' '.join(lemmatized_words)
    return lemmatized_sentence

result = lemmatize_passage(text)

print("Lemmatized:", result)

POS tagging

O Part-of-Speech tagging é o processo de associar cada token de uma frase à sua respectiva classe gramatical, como verbo, substantivo, adjetivo, advérbio, entre outras. Essa técnica é fundamental para que sistemas de PNL compreendam a estrutura sintática e, consequentemente, interpretem a semântica de forma mais precisa. Além disso, o POS tagging serve como etapa preliminar para tarefas mais complexas, como análise sintática, extração de informações e compreensão de contexto em modelos de linguagem. A biblioteca nltk também nos fornece ferramentas para realizar a POS tagging:

from nltk import pos_tag

pos_tags = pos_tag(words)

print("\nResultado da PoS Tagging :")
for word, pos_tag in pos_tags:
    print(f"{word}: {pos_tag}")

As classes gramaticais retornadas estão abreviadas de acordo com a tabela abaixo:

nltk-speech-codes.png

Transformers

Os Transformers (aqui não estamos falando de Autobots ou Decepticons) são uma arquitetura desenvolvida por engenheiros do Google que revolucionou a área de Processamento de Linguagem Natural (NLP). Eles introduziram o mecanismo de atenção, capaz de atribuir pesos diferentes às palavras de um texto de entrada. Essa característica deu nome ao artigo original “Attention is All You Need”. O mecanismo de atenção possibilita que o modelo identifique o contexto da frase e relacione palavras mesmo quando estão distantes entre si.

A arquitetura dos Transformers é composta por um codificador e um decodificador, e adota execução em paralelo, substituindo os modelos sequenciais tradicionais. Isso permite um treinamento significativamente mais rápido.

LLMs

As LLMs (Large Language Models) são modelos de machine learning treinados com uma quantidade massiva de dados (da ordem de terabytes) e utilizam bilhões de parâmetros. Ganharam destaque nos últimos anos, especialmente após o lançamento do ChatGPT em 2022.

Esses modelos geram conteúdo prevendo a próxima palavra em uma sequência, o que lhes permite produzir textos coerentes, traduzir idiomas, responder perguntas e até criar código. Também podem passar por ajuste fino ou prompt engineering para se especializarem em tarefas ou domínios específicos.

Principais usos:

  • Chatbots (ex.: atendentes virtuais de bancos)
  • Geração e resumo de conteúdo
  • Tradução automática
  • Auxílio à programação
  • Análise de sentimentos e classificação de texto

Referências

https://arxiv.org/abs/1706.03762

https://aircconline.com/acii/V3N1/3116acii04.pdf

https://www.researchgate.net/publication/348306833_An_Interpretation_of_Lemmatization_and_Stemming_in_Natural_Language_Processing