Dividindo em Dois

PythonBeginner
Pratique Agora

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:

  1. 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.
  2. 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:

  1. A função primeiro remove todos os caracteres não alfanuméricos do texto de entrada e divide o texto em palavras individuais.
  2. Para cada palavra, a função tenta encontrar a subpalavra correspondente mais longa no vocabulário fornecido.
  3. Se uma subpalavra for encontrada no vocabulário, ela é adicionada à lista de tokens. Se nenhuma subpalavra for encontrada, o token [UNK] é adicionado à lista.
  4. 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.

✨ Verificar Solução e Praticar✨ Verificar Solução e Praticar✨ Verificar Solução e Praticar✨ Verificar Solução e Praticar