nerbert-recipe
Автор: fastyBOOM. Учебная модель выделения именованных сущностей в английских строках ингредиентов.
Модель BertForTokenClassification и собственный токенизатор WordPiece обучены с нуля. Используется стандартный интерфейс Hugging Face token-classification.
Блокнот
В репозитории размещён блокнот обучения recipe_ner.ipynb с кодом и сохранёнными результатами запуска.
Открыть блокнот в Google Colab.
Датасет
bio-recipe-datasettxt.bz2 — предоставленный размеченный датасет: слово и метка на строке, записи разделены пустыми строками. Содержит 49 848 записей ингредиентов. Разметка сохранена без исправлений и удаления повторов.
Для обучения использовано 39 868 записей, для проверки — 9 980. Разделение выполняется GroupShuffleSplit с test_size=0.2 и random_state=42: одинаковые тексты находятся в одной части.
B- обозначает начало сущности, I- — продолжение. OTHER — токен вне сущности. Типы: NAME — ингредиент, QTY — количество, UNIT — единица, COMMENT — уточнение, RANGE_END — конец диапазона. Редкая исходная метка INDEX также сохранена.
Обучение
| Параметр | Значение |
|---|---|
| Словарь WordPiece | 4 719 токенов |
| Классы | 10 |
| Слои BERT | 4 |
| Размер представления | 256 |
| Головы внимания | 4 |
| Промежуточный слой | 1 024 |
| Эпохи | 5 |
| Размер обучающего пакета | 32 |
| Learning rate | 0.0003 |
Словарь обучен только на обучающих текстах. Токенизатор приводит регистр к нижнему. В этой версии метка слова назначается первому подтокену; остальные части и служебные позиции исключаются из функции потерь через -100.
Результаты
Результаты сохранённого запуска в блокноте:
| Показатель | Значение |
|---|---|
| Accuracy на отложенных записях | 91.60% |
| Loss на отложенных записях | 0.271906 |
| Средняя training loss | 0.288697 |
| Время обучения | 113.81 с |
Accuracy рассчитана по первым подтокенам исходных слов, без позиций -100. F1 целых сущностей в этом запуске не измерялась. Время обучения относится к конкретному запуску в Colab.
Использование
pip install transformers==5.16.1 torch
from transformers import pipeline
ner = pipeline("token-classification", model="fastyBOOM/nerbert-recipe")
text = "1 tablespoon olive oil"
for entity in ner(text, ignore_labels=[]):
print(text[entity["start"]:entity["end"]], "→", entity["entity"])
Пример ответа из сохранённого запуска:
1 → B-QTY
tablespoon → B-UNIT
olive → B-NAME
oil → I-NAME
Для повторного обучения в Colab выбрать GPU, загрузить исходный .bz2 в /content, установить transformers==5.16.1 accelerate scikit-learn и выполнить ячейки сверху вниз. Последняя ячейка проверяет опубликованную копию модели с HF.
Особенности
Модель предназначена для коротких английских строк ингредиентов. В pipeline один элемент датасета может разделиться на несколько токенов. Дополнительные подтокены в этой версии не обучались напрямую, поэтому возможны ошибки на дробях и числах, например 1/2 и 200. Допустимые переходы BIO отдельным правилом не ограничиваются.