На прошлом стриме, что был в субботу, получилось собрать простенький морфемный словарь и базовый токенизатор из учебного
пособия на HuggingFace, к сожалению качество полученного кода да и его логика в целом оставляли желать лучшего, поэтому решил не выкладывать запись стрима, всё равно там за пять часов не было ничего такого важного.
В воскресенье продолжил работу над проектом, получил крайне любопытный, но бесполезный, прототип, однако, наработки очень красиво встраивались в
ruMorpheme поэтому было принято решение там и реализовать всё остальное. Из интересного, в проекте
ruMorpheme появился пакет
tokenizer.py содержащий в себе основную логику токенизации.
Пришлось очень много провозиться в попытках обуздать библиотеку
transformers, так как инструкция из учебного пособия предполагала создание клона токенизатора для моделей типа BERT, но самая главная проблема была даже не с этим, а с т.н. классом пре-токенизации, пришлось реализовать собственный пре-токенизатор
RuMorphemePreTokenizer, но сохранять токенизатор было нельзя (ошибка сериализации) и поэтому пришлось писать ещё и свой класс токенизатора
RuMorphemeTokenizerFast, который бы перед сохранением модели на диск отключал мой пре-токенизатор. Ещё потребовался свой декодер
RuMorphemeDecoder, он нужен для того, чтобы полученные токены преобразовывать обратно в читабельный текст.
И уже после того как всё это было готово, работало как надо и было протестировано на разных пограничных случаях взялся за скрипт
tokenizer_build.py, он собственно выполняет несколько простых задач, читает текст из датасета, прогоняет его через модель
ruMorpheme, далее сортирует по алфавиту все токены создавая словарь с морфемами, специальными символами, цифрами и служебными токенами. С полученным словарём инициализируется
RuMorphemeTokenizerFast, после чего полученный токенизатор сохраняется на диск.
Морфемный токенизатор решил назвать morphemizer (морфемизатор) и создал репозиторий
evilfreelancer/morphemizer на HuggingFace.
Закинул в него полученные конфиги и скрипты. Чтобы всё это работало через
AutoTokenizer потребовалось добавить ещё пакет
tokenizer.py в корень морфемизатора на HF, а так же добавить в
tokenizer_config.json поле
auto_map, с вот таким вот значением:
"AutoTokenizer": ["","tokenizer.RuMorphemeTokenizerFast"]
.
Как видно без костылей и тут не обошлось, похоже я первый человек который захотел реализовать свой токенизатор, да так чтобы он работал через AutoTokenizer, постараюсь не забыть запилить issue или сразу PR, потому как должно быть вот так:
"AutoTokenizer": "tokenizer.RuMorphemeTokenizerFast"
.
Если вы хотите использовать морфемизатор нужно для начала установить пару библиотек
pip install transformers rumorpheme
, после чего можно использовать морфемизатор вот так:
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("evilfreelancer/morphemizer", trust_remote_code=True)
test_text = "Философское восприятие мира."
input_ids = tokenizer.encode(test_text)
print("Text:", test_text)
print("Encoded:", input_ids)
print("Tokens:", tokenizer.convert_ids_to_tokens(input_ids))
print("Decoded:", tokenizer.decode(input_ids))
Результат работы будет такой же как на картинке.