Введение
В этом проекте вы научитесь реализовывать токенизатор субслов, который является важным этапом в задачах обработки естественного языка. Токенизация - это процесс разбиения строки текста на более мелкие единицы, называемые токенами, которые могут быть отдельными словами, символами или субсловами. Этот проект посвящен токенизации на уровне субслов, которая широко используется в английском и других языках на основе латиницы.
👀 Предварительный просмотр
['I','studied', 'in', 'LabEx', 'for', '1', '0', 'days', 'and', 'completed', 'the', '[UNK]', '[UNK]', 'course', '.']
🎯 Задачи
В этом проекте вы научитесь:
- реализовывать функцию токенизатора субслов, которая выполняет токенизацию на уровне символов с использованием алгоритма жадного поиска самого длинного совпадения слева направо;
- тестировать токенизатор субслов на предоставленном примере и анализировать выходные данные;
- понимать алгоритм токенизации и его реализацию.
🏆 Достижения
После завершения этого проекта вы сможете:
- понять важность токенизации в задачах обработки естественного языка;
- реализовать ядро компонента пайплайна обработки естественного языка;
- различать токенизацию на уровне символов и токенизацию на уровне субслов;
- применить алгоритм жадного поиска самого длинного совпадения для токенизации текста на субслова.
Разобраться с процессом токенизации
В этом шаге вы узнаете о процессе токенизации и его важности в задачах обработки естественного языка.
Токенизация - это процесс разбиения строки текста на более мелкие единицы, называемые токенами. Эти токены могут быть отдельными словами, символами или субсловами, в зависимости от конкретного метода токенизации.
В задачах обработки естественного языка большинство машинно-обучаемых моделей не поддерживают строковые данные напрямую. Чтобы модели могли эффективно обучаться, строковые данные должны быть числовыми, что называется процессом токенизации. Токенизация также является подготовкой к числованию, и для числования требуется отображение, которое предоставляется таблицей отображения.
Токенизация на уровне символов - это метод, который делит строки на основе наименьших символов в языке, и он широко используется в токенизации английского языка.
Токенизация на уровне субслов широко используется в английском и других языках на основе латиницы и представляет собой улучшение по сравнению с токенизацией на уровне слов.
Реализовать токенизатор субслов
В этом шаге вы реализуете функцию токенизатора субслов, которая выполняет токенизацию на уровне символов для английских слов с использованием алгоритма жадного поиска самого длинного совпадения слева направо. Эта функция также удаляет все символы, включая пробелы, из входной строки.
Откройте файл subword_tokenizer.py в вашем редакторе кода. Этот файл содержит структуру функции subword_tokenizer(). Ваша задача - заполнить пропущенные части функции.
Функция должна соответствовать следующим требованиям:
- Функция должна принимать на вход строку. Эта функция получает строку, содержащую английские буквы, цифры и знаки препинания. Строка уже предоставлена вам, и вы не можете изменить ее содержимое.
- Функция должна возвращать результат токенизации в виде списка.
Вот полный код функции 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() использует алгоритм жадного поиска самого длинного совпадения для токенизации входного текста. Вот, как работает алгоритм:
- Функция сначала удаляет все неалфанумерические символы из входного текста и разбивает текст на отдельные слова.
- Для каждого слова функция пытается найти самое длинное совпадающее субслово в предоставленном словаре.
- Если субслово найдено в словаре, оно добавляется в список токенов. Если субслово не найдено, в список добавляется токен
[UNK]. - Процесс продолжается, пока все слова в входном тексте не будут токенизированы.
Функция is_in_vocab() - это вспомогательная функция, которая проверяет, присутствует ли данное слово в предоставленном словаре.
Функция find_longest_match() является ядром алгоритма токенизации. Она перебирает слово, начиная от самого длинного возможного субслова, и проверяет, находится ли текущее субслово в словаре. Если совпадение найдено, она возвращает субслово и оставшуюся часть слова. Если совпадение не найдено, она возвращает токен [UNK] и пустую строку.
Понимание алгоритма токенизации поможет вам дальнейше улучшить токенизатор субслов или адаптировать его для различных случаев использования.
Резюме
Поздравляем! Вы завершили этот проект. Вы можете практиковаться в более многих лабораторных работах в LabEx, чтобы улучшить свои навыки.



