Разрезание на два

PythonBeginner
Практиковаться сейчас

Введение

В этом проекте вы научитесь реализовывать токенизатор субслов, который является важным этапом в задачах обработки естественного языка. Токенизация - это процесс разбиения строки текста на более мелкие единицы, называемые токенами, которые могут быть отдельными словами, символами или субсловами. Этот проект посвящен токенизации на уровне субслов, которая широко используется в английском и других языках на основе латиницы.

👀 Предварительный просмотр

['I','studied', 'in', 'LabEx', 'for', '1', '0', 'days', 'and', 'completed', 'the', '[UNK]', '[UNK]', 'course', '.']

🎯 Задачи

В этом проекте вы научитесь:

  • реализовывать функцию токенизатора субслов, которая выполняет токенизацию на уровне символов с использованием алгоритма жадного поиска самого длинного совпадения слева направо;
  • тестировать токенизатор субслов на предоставленном примере и анализировать выходные данные;
  • понимать алгоритм токенизации и его реализацию.

🏆 Достижения

После завершения этого проекта вы сможете:

  • понять важность токенизации в задачах обработки естественного языка;
  • реализовать ядро компонента пайплайна обработки естественного языка;
  • различать токенизацию на уровне символов и токенизацию на уровне субслов;
  • применить алгоритм жадного поиска самого длинного совпадения для токенизации текста на субслова.

Разобраться с процессом токенизации

В этом шаге вы узнаете о процессе токенизации и его важности в задачах обработки естественного языка.

Токенизация - это процесс разбиения строки текста на более мелкие единицы, называемые токенами. Эти токены могут быть отдельными словами, символами или субсловами, в зависимости от конкретного метода токенизации.

В задачах обработки естественного языка большинство машинно-обучаемых моделей не поддерживают строковые данные напрямую. Чтобы модели могли эффективно обучаться, строковые данные должны быть числовыми, что называется процессом токенизации. Токенизация также является подготовкой к числованию, и для числования требуется отображение, которое предоставляется таблицей отображения.

Токенизация на уровне символов - это метод, который делит строки на основе наименьших символов в языке, и он широко используется в токенизации английского языка.

Токенизация на уровне субслов широко используется в английском и других языках на основе латиницы и представляет собой улучшение по сравнению с токенизацией на уровне слов.

Реализовать токенизатор субслов

В этом шаге вы реализуете функцию токенизатора субслов, которая выполняет токенизацию на уровне символов для английских слов с использованием алгоритма жадного поиска самого длинного совпадения слева направо. Эта функция также удаляет все символы, включая пробелы, из входной строки.

Откройте файл subword_tokenizer.py в вашем редакторе кода. Этот файл содержит структуру функции subword_tokenizer(). Ваша задача - заполнить пропущенные части функции.

Функция должна соответствовать следующим требованиям:

  1. Функция должна принимать на вход строку. Эта функция получает строку, содержащую английские буквы, цифры и знаки препинания. Строка уже предоставлена вам, и вы не можете изменить ее содержимое.
  2. Функция должна возвращать результат токенизации в виде списка.

Вот полный код функции subword_tokenizer():

import re

def subword_tokenizer(text, vocab) -> list:
    """
    Токенизирует входной текст на субслова на основе предоставленного словаря.

    Аргументы:
    - text (str): Входной текст для токенизации.
    - vocab (list): Список словаря, содержащий субслова.

    Возвращает:
    - list: Список токенов субслов.
    """

    def is_in_vocab(word) -> bool:
        """
        Проверяет, содержится ли данное слово в словаре.

        Аргументы:
        - word (str): Слово для проверки.

        Возвращает:
        - bool: True, если слово содержится в словаре, иначе False.
        """
        return word in vocab

    def find_longest_match(word) -> tuple:
        """
        Находит самое длинное совпадающее субслово для заданного слова в словаре.

        Аргументы:
        - word (str): Слово, для которого нужно найти совпадение.

        Возвращает:
        - tuple: Кортеж, содержащий самое длинное совпадающее субслово и оставшуюся часть слова.
        """
        for i in range(len(word), 0, -1):
            subword = word[:i]
            if is_in_vocab(subword):
                return subword, word[i:]
        return "[UNK]", ""

    tokens = []
    ## Удалить неалфанумерические символы и разбить текст на слова
    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__":
    ## Пример использования:
    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)

Тестировать токенизатор субслов

В этом шаге вы протестируете функцию subword_tokenizer() на предоставленном примере и проверите выходные данные.

Запустите скрипт subword_tokenizer.py в терминале:

python3 subword_tokenizer.py

Выходные данные должны быть похожи на следующие:

['I','studied', 'in', 'LabEx', 'for', '1', '0', 'days', 'and', 'completed', 'the', '[UNK]', '[UNK]', 'course', '.']

Изучите выходные данные и убедитесь, что процесс токенизации работает как ожидается. Функция должна токенизировать входной текст в список субслов, где неизвестные слова представлены токеном [UNK].

Разобраться с алгоритмом токенизации

В этом шаге вы будете более глубоко изучать реализацию функции subword_tokenizer() и понимать алгоритм токенизации.

Функция subword_tokenizer() использует алгоритм жадного поиска самого длинного совпадения для токенизации входного текста. Вот, как работает алгоритм:

  1. Функция сначала удаляет все неалфанумерические символы из входного текста и разбивает текст на отдельные слова.
  2. Для каждого слова функция пытается найти самое длинное совпадающее субслово в предоставленном словаре.
  3. Если субслово найдено в словаре, оно добавляется в список токенов. Если субслово не найдено, в список добавляется токен [UNK].
  4. Процесс продолжается, пока все слова в входном тексте не будут токенизированы.

Функция is_in_vocab() - это вспомогательная функция, которая проверяет, присутствует ли данное слово в предоставленном словаре.

Функция find_longest_match() является ядром алгоритма токенизации. Она перебирает слово, начиная от самого длинного возможного субслова, и проверяет, находится ли текущее субслово в словаре. Если совпадение найдено, она возвращает субслово и оставшуюся часть слова. Если совпадение не найдено, она возвращает токен [UNK] и пустую строку.

Понимание алгоритма токенизации поможет вам дальнейше улучшить токенизатор субслов или адаптировать его для различных случаев использования.

Резюме

Поздравляем! Вы завершили этот проект. Вы можете практиковаться в более многих лабораторных работах в LabEx, чтобы улучшить свои навыки.

✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться