Introdução
Neste projeto, você aprenderá como implementar um tokenizador de subpalavras (subword tokenizer), que é um passo crucial em tarefas de processamento de linguagem natural (natural language processing - NLP). A tokenização é o processo de dividir uma string de texto em unidades menores, chamadas de tokens, que podem ser palavras individuais, caracteres ou subpalavras. Este projeto se concentra na tokenização em nível de subpalavra, que é comumente usada em inglês e outras línguas baseadas no latim.
👀 Visualização
['I', 'studied', 'in', 'LabEx', 'for', '1', '0', 'days', 'and', 'completed', 'the', '[UNK]', '[UNK]', 'course', '.']
🎯 Tarefas
Neste projeto, você aprenderá:
- Como implementar uma função de tokenizador de subpalavras que realiza tokenização em nível de caractere usando o algoritmo ganancioso (greedy) de correspondência mais longa primeiro (longest-match-first).
- Como testar o tokenizador de subpalavras com um exemplo fornecido e analisar a saída.
- Como entender o algoritmo de tokenização e sua implementação.
🏆 Conquistas
Após concluir este projeto, você será capaz de:
- Entender a importância da tokenização em tarefas de processamento de linguagem natural.
- Implementar um componente central de um pipeline de processamento de linguagem natural.
- Diferenciar entre tokenização em nível de caractere e em nível de subpalavra.
- Aplicar o algoritmo ganancioso de correspondência mais longa primeiro para tokenizar texto em subpalavras.
Entenda o Processo de Tokenização
Nesta etapa, você aprenderá sobre o processo de tokenização e sua importância em tarefas de processamento de linguagem natural (natural language processing - NLP).
Tokenização é o processo de dividir uma string de texto em unidades menores, chamadas de tokens. Esses tokens podem ser palavras individuais, caracteres ou subpalavras, dependendo do método de tokenização específico usado.
Em tarefas de processamento de linguagem natural, a maioria dos modelos de aprendizado de máquina (machine learning) não suporta dados de string diretamente. Para que os modelos aprendam de forma eficaz, os dados de string devem ser numerizados, um processo conhecido como Tokenização. A tokenização também é a preparação para a numerização, e a numerização requer um mapeamento, que é fornecido por uma tabela de mapeamento.
A tokenização em nível de caractere (character-level tokenization) é um método que divide strings com base nos menores símbolos em uma língua e é comumente usado na tokenização em inglês.
A tokenização em nível de subpalavra (subword-level tokenization) é comumente usada em inglês e outras línguas baseadas no latim e é uma melhoria em relação à tokenização em nível de palavra (word-level tokenization).
Implemente o Tokenizador de Subpalavras
Nesta etapa, você implementará uma função de tokenizador de subpalavras que realiza a tokenização em nível de caractere para palavras em inglês usando o algoritmo ganancioso (greedy) de correspondência mais longa primeiro (longest-match-first). Esta função também remove todos os símbolos, incluindo espaços, da string de entrada.
Abra o arquivo subword_tokenizer.py em seu editor de código. Este arquivo contém um esqueleto da função subword_tokenizer(). Sua tarefa é preencher as partes ausentes da função.
A função deve ter os seguintes requisitos:
- A função deve receber uma string como entrada. Esta função recebe uma string contendo caracteres em inglês, números e sinais de pontuação. A string foi fornecida a você, e você não pode alterar o conteúdo da string.
- A função deve retornar o resultado da tokenização como uma lista.
Aqui está o código completo para a função subword_tokenizer():
import re
def subword_tokenizer(text, vocab) -> list:
"""
Tokeniza o texto de entrada em subpalavras com base em um vocabulário fornecido.
Args:
- text (str): Texto de entrada a ser tokenizado.
- vocab (list): Lista de vocabulário contendo subpalavras.
Returns:
- list: Lista de tokens de subpalavras.
"""
def is_in_vocab(word) -> bool:
"""
Verifica se uma determinada palavra está no vocabulário.
Args:
- word (str): Palavra a ser verificada.
Returns:
- bool: True se a palavra estiver no vocabulário, False caso contrário.
"""
return word in vocab
def find_longest_match(word) -> tuple:
"""
Encontra a subpalavra correspondente mais longa para uma determinada palavra no vocabulário.
Args:
- word (str): Palavra para encontrar uma correspondência.
Returns:
- tuple: Uma tupla contendo a subpalavra correspondente mais longa e a parte restante da palavra.
"""
for i in range(len(word), 0, -1):
subword = word[:i]
if is_in_vocab(subword):
return subword, word[i:]
return "[UNK]", ""
tokens = []
## Remove non-alphanumeric characters and split the text into words
words = re.findall(r"\b\w+\b", text)
for word in words:
while word:
subword, remaining = find_longest_match(word)
tokens.append(subword)
word = remaining
return tokens
if __name__ == "__main__":
## Example usage:
vocab = [
"I",
"studied",
"in",
"LabEx",
"for",
"1",
"0",
"days",
"and",
"completed",
"the",
"course",
]
text = "I studied in LabEx for 10 days and completed the TensorFlow Serving course."
tokenization_result = subword_tokenizer(text, vocab)
print(tokenization_result)
Teste o Tokenizador de Subpalavras
Nesta etapa, você testará a função subword_tokenizer() com o exemplo fornecido e verificará a saída.
Execute o script subword_tokenizer.py em seu terminal:
python3 subword_tokenizer.py
A saída deve ser semelhante à seguinte:
['I', 'studied', 'in', 'LabEx', 'for', '1', '0', 'days', 'and', 'completed', 'the', '[UNK]', '[UNK]', 'course', '.']
Observe a saída e certifique-se de que o processo de tokenização está funcionando conforme o esperado. A função deve tokenizar o texto de entrada em uma lista de subpalavras, onde as palavras desconhecidas são representadas pelo token [UNK].
Entenda o Algoritmo de Tokenização
Nesta etapa, você se aprofundará na implementação da função subword_tokenizer() e entenderá o algoritmo de tokenização.
A função subword_tokenizer() usa um algoritmo ganancioso (greedy) de correspondência mais longa primeiro (longest-match-first) para tokenizar o texto de entrada. Veja como o algoritmo funciona:
- A função primeiro remove todos os caracteres não alfanuméricos do texto de entrada e divide o texto em palavras individuais.
- Para cada palavra, a função tenta encontrar a subpalavra correspondente mais longa no vocabulário fornecido.
- Se uma subpalavra for encontrada no vocabulário, ela é adicionada à lista de tokens. Se nenhuma subpalavra for encontrada, o token
[UNK]é adicionado à lista. - O processo continua até que todas as palavras no texto de entrada tenham sido tokenizadas.
A função is_in_vocab() é uma função auxiliar que verifica se uma determinada palavra está presente no vocabulário fornecido.
A função find_longest_match() é o núcleo do algoritmo de tokenização. Ela itera pela palavra, começando pela subpalavra mais longa possível, e verifica se a subpalavra atual está no vocabulário. Se uma correspondência for encontrada, ela retorna a subpalavra e a parte restante da palavra. Se nenhuma correspondência for encontrada, ela retorna o token [UNK] e uma string vazia.
Entender o algoritmo de tokenização o ajudará a aprimorar ainda mais o tokenizador de subpalavras ou adaptá-lo a diferentes casos de uso.
Resumo
Parabéns! Você concluiu este projeto. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.



