Создание базового токенизатора
Введение
Мы подробно рассмотрим одну из тем в обработке естественного языка: Токенизатор.
Цель этой статьи – подробно рассказать о том, как работает токенизация и как реализовать токенизатор. Основная идея заключается в том, чтобы разбить текстовый ввод на фрагменты, содержащие подробные, но полезные данные – они называются токенами.
https://t.me/data_analysis_ml – анализ данных наш телеграм канал
“Сентенсирование”, или разделение входного текста на предложения, – это еще один шаг, который выполняется вместе с токенизацией текста. Важно иметь структуру предложений для определения частей речи, отношений зависимости и т.д. Разбиение на предложения может быть немного сложнее, чем разбиение на токены, поскольку структура текста более свободна, чем структура предложения (я имею в виду не в морфологических терминах, а скорее в графических).
Базовый приговор
Basic Sentencizer будет создавать новое предложение при каждой точке, восклицательном или вопросительном знаке. Пользователь может изменить это, предоставив отдельный список символов.
Далее мы предоставляем специальный “тег” (delimiter_token) для разделения нашего текста, который будет добавляться рядом со знаками препинания. Для этого мы создаем специальный “тег” (DEFAULT: )
class BasicSentencizer:
def __init__(self, input_text, split_characters=['.','?','!'], delimiter_token='<SPLIT>'):
self.sentences = []
self.input_text = str(input_text)
self._split_characters=split_characters
self._delimiter_token=delimiter_token
self._index=0
self._sentencize()
# For every iteration return the self object
def __iter__(self):
return self
# For next iteration get the next sentence.
def __next__(self):
if self._index < len(self.sentences):
result = self.sentences[self._index]
self._index += 1
return result
raise StopIteration
def _sentencize(self):
string_with_separator = self.input_text
for character in self._split_characters:
string_with_separator = string_with_separator.replace(character, character+" "+self._delimiter_token)
self.sentences = [x.strip() for x in string_with_separator.split(self._delimiter_token) if x !='']
Этот класс разделяет предложения из входного текста и помещает их в массив предложений, которые можно перебирать с помощью класса iter.
Cons
Есть несколько проблем, которые возникают с предыдущим токенизатором:
- Списочные числа, десятичные числа, цена: 1.2, 3.4 и т.д. …
- Сокращения: и т.д. , т.е. A.I и т.д. …
- Несколько последовательных восклицательных знаков, вопросительных знаков, несколько полных стоп: “Привет!!!”, “Как дела??”, “Жизнь продолжается ….”.
Будущие шаги
- Создание надежного токенизатора, который преодолеет вышеупомянутые недостатки
- Создать токенизатор на основе производства, подобный тем, которые мы видим в библиотеке NLTK.
- Объяснить все доступные различные токенизаторы
- Создайте распределенную очередь, которая вводит документы и производит токены. Также напишите функцию для хранения этих маркеров в базе данных no-SQL.
Заключение
Вот и все! Удивительное объяснение того, как создать простой токенизатор.
Спасибо что читаете!