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 отдельным правилом не ограничиваются.

Downloads last month
58
Safetensors
Model size
4.5M params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support