![](https://habrastorage.org/getpro/habr/upload_files/061/2a9/9ed/0612a99ed571ac96e184e0493dbdf63c.png)
В предыдущей статье мы уже подробно рассмотрели процесс разметки семантической сегментации в CVAT. Сейчас я подробнее расскажу по NER-разметку в другом популярном open source инструменте - Label Studio.
Как и в прошлый раз мы шаг за шагом пройдем путь от установки и настройки проекта до экспорта уже размеченного датасета. В процессе будем подробнее останавливаться на нюансах связанных с извлечением именованных сущностей и рекомендациях из личного опыта.
Шаг 1: Установка Label Studio
К сожалению, запуск Label Studio не такой простой, как у CVAT. Нужно сперва поднять локальный сервер. Если вы не знаете, как это сделать — ниже будет подробная инструкция. Те, кто знают — смело переходите к шагу 2.
Итак. Создатели Label Studio никого не обделили. Вариантов установки много и по ним всем есть инструкции:
Install with pip
Install with Docker
Install on Ubuntu
Install from source
Install with Anaconda
Я же покажу, как установить с помощью pip на Windows. Для этого нам потребуется стабильная версия Python (версия 3.7 и выше).
1. Создаем папку и копируем путь к ней. У меня это C:\Users\Rustam\Desktop\project (далее буду использовать его, вы указывайте свой)
2. Открываем командную строку и пишем cd C:\Users\Rustam\Desktop\project
![](https://habrastorage.org/getpro/habr/upload_files/2a8/c63/d53/2a8c63d53ddd9f1b416a453edb4967a5.png)
3. В следующем шаге мы создаем виртуальное окружение с помощью команды py -m venv env, где env - название окружения. (Для Linux команда python3 -m venv env)
![](https://habrastorage.org/getpro/habr/upload_files/a16/0ac/169/a160ac169124ba3784b900e5f9a96aa8.png)
4. В этом шаге мы активируем виртуальное окружение командой env\Scripts\activate.bat. Если слева от юзера появилось (env), то окружение активировано. (Для Linux команда source env/bin/activate)
![](https://habrastorage.org/getpro/habr/upload_files/dc9/1ab/800/dc91ab80086e85b97ae42100bbb55133.png)
5. В следующем шаге мы скачиваем Label Studio командой pip install -U label-studio (Для Linux команда pip3 install -U label-studio)
![](https://habrastorage.org/getpro/habr/upload_files/b00/a7f/0a2/b00a7f0a22fbd46e978746a8bbb31144.png)
6. Последний шаг - запуск Label Studio командой label-studio
![](https://habrastorage.org/getpro/habr/upload_files/7f7/129/c13/7f7129c13233c16552b108334ab94049.png)
Если вы всё сделали без ошибок, то откроется страница Label Studio на вашем локальном сервере. Ниже видео этого процесса для большей наглядности:
Для повторного запуска необходимо убедиться, что виртуальное окружение активировано и что вы находитесь в директории проекта.
Шаг 2: Создание проекта в Label Studio
После установки Label Studio открывается страница. Вводим почту и пароль, создаем аккаунт. Не забываем подтвердить создание аккаунта на почте.
![](https://habrastorage.org/getpro/habr/upload_files/330/e07/b0f/330e07b0f98846c96a6ab1fc8dad0858.png)
Затем мы попадаем в совсем пустой каталог проектов. Давайте исправим это и нажмем на Create Project.
![](https://habrastorage.org/getpro/habr/upload_files/b45/716/fcb/b45716fcbc63d4a5cf34c24f67f40eec.png)
В первом окне заполняем информацию о проекте, чтобы было удобно искать его среди других проектов. Если вы планируете работать в команде, то используйте поле Description для описания ТЗ и инструкций.
![](https://habrastorage.org/getpro/habr/upload_files/a1c/353/f72/a1c353f72e821cee1cea065504051591.png)
Следующее окно - импорт сырых (неразмеченных) данных.
![](https://habrastorage.org/getpro/habr/upload_files/64d/b7f/f11/64db7ff119f9b1a6d65fa453926a0e46.png)
Label Studio поддерживает следующие форматы файлов:
— Text - txt
— Audio - wav, aiff, mp3, au, flac, m4a, ogg
— Images - jpg, png, gif, bmp, svg, webp
— HTML - html, htm, xml
— Time Series - csv, tsv
— Common Formats - csv, tsv, txt, json
Для NER-разметки мы создаем txt-файл, в который предварительно вставляем все спарсенный тексты.
Далее переходим в Labeling Setup. Там нам нужно выбрать раздел Natural Language Processing и в нем уже Named Entity Recognition.
![](https://habrastorage.org/getpro/habr/upload_files/1f3/60a/654/1f360a654b891cbde28b3864bcfd5b0b.png)
Теперь необходимо задать классы извлекаемых сущностей. Но прежде, чем мы это сделаем, давайте разберемся, что из себя представляют именованных сущности и какие они бывают.
Именованные сущности — это своего рода категории слов и словосочетаний сгруппированных по значению. Например, самые распространенные сущности, выделяемые в текстах: имена людей, названия организаций, даты и так далее. Хотя в большинстве случаев всё зависит от сферы применения и конкретных задач, которые должна решать нейросеть.
Ниже оставляю список наиболее используемые классы сущностей и их общепринятые обозначения при разметке:
![](https://habrastorage.org/getpro/habr/upload_files/c53/38d/850/c5338d8500437eafc8681443f252cf30.png)
Теперь возвращаемся к настройке нашего проекта. После того, как мы выбрали вид разметки, перед нами откроется окно настройки классов сущностей.
![](https://habrastorage.org/getpro/habr/upload_files/175/ec7/d98/175ec7d986dee4c78d14e22caa38ea9b.png)
Как видно на скриншоте, мы выбрали для наших текстов:
PER - люди, имена
ORG - название компаний, организаций
LOC - не географические локации
GPE - страны, города, населенные пункты
PRODUCT - товары, продающиеся объекты (кроме услуг)
Для удобства назначаем разные цвета для каждой сущности и нажимаем на Save.
Шаг 3: Разметка именованных сущностей
После того, как нажали на Save, нас перекидывает на страницу проекта.
![](https://habrastorage.org/getpro/habr/upload_files/b7b/5f3/e79/b7b5f3e797572f32693a724f0adef795.png)
Для примера я взял небольшой фрагмент из статьи про Apple на Википедии. Label Studio автоматически выносит каждую текстовую строку из файла в отдельный джоб. У меня на скриншоте между ними пробел, так как и в текстовом файле между ними есть отступ.
Теперь кликаем на любой из текстов и начинаем размечать.
Стоит отдать должное Label Studio: интерфейс интуитивно понятен и удобен. Просто кликаешь на нужный класс сущности, а затем выделяешь слово или словосочетание. Повторяешь до тех пор, пока не выделишь все сущности.
А что делать, если забыл какой-то из классов? Прям, как я забыл про сущности дат. Всё просто. Нажимаешь на Submit, чтобы сохранить текущий прогресс, а затем возвращаемся к настройкам проекта. Далее кликаем на Settings в правом верхнем углу экрана.
![](https://habrastorage.org/getpro/habr/upload_files/733/925/4ba/7339254baf950007ab2c412a12fc06d5.png)
Теперь переходим во вкладку Labeling Interface и добавляем нужный класс, как в самом начале настройки проекта.
![](https://habrastorage.org/getpro/habr/upload_files/e05/f3b/8b7/e05f3b8b72c12a9897541c028233a9fb.png)
Следующий важный нюанс, с которым мы можем столкнуться в ner-разметке, это неоднородность сущностей в тексте. Самый лучший пример - сущности даты. Только в рассматриваемых трех абзацах мы встречаем разные вариации:
— в середине 1970-х годов
— 1 апреля 1976 года
— в 1976 году
— в 1974—1975 годах
— в 1976—1977 годах
— с 1977 года
— с 1977 по 1993 годы
— с конце 1970-х и начале 1980-х годов
Чтобы неоднородность формулировок не повлияла на точность модели, важно максимально стандартизировать принципы аннотации каждой сущности.
Я столкнулся с этой проблемой лично, когда моя компания по разметке делала первые шаги. Каждый разметчик выделял начало и конец сущности по-разному, из-за датасет получался довольно мусорным.
Решением стало написание подробного ТЗ и инструкции с разбором конкретных примеров. То есть под каждую сущность мы разбирали различные примеры написания и аннотации.
Есть и другой способ решения проблемы начала-конца многосоставной сущности — BIOES-схема. Её суть заключается в присвоении метке сущности префиксов, указывающих на расположении внутри класса. Схема BIOES включает 4 подобных префикса:
— B (beginning) – первое слово в сущности
— I (inside) – все слова между первым и последним словом в сущности
— O (out) — слово не относящееся к сущности
— E (ending) — последнее слово в сущности
— S (single) — сущность состоящая из одного слова
Использование BIOES позволяет нам представить разметку сущности в виде токенов и точно определять начало и конец каждой сущности. Пример ниже:
![](https://habrastorage.org/getpro/habr/upload_files/513/30a/47c/51330a47c92b6377942968c5a7b5ab8e.png)
Этот метод более трудоемок, да и в Label Studio нет этого функционала, но и не упомянуть о нем нельзя.
Но это лирическое отступление. Для большинства задач по автоматизации достаточно описанной выше NER-разметки.
Шаг 4: Экспорт размеченных данных
Итак, мы разметили все сущности в имеющихся текстах. Теперь нужно их выгрузить. Для этого выделяем нужные джобы или все сразу, кликнув на ID. Затем жмем на Export в правой части экрана.
![](https://habrastorage.org/getpro/habr/upload_files/e5b/243/abb/e5b243abbf652ad94e655d9ca8826278.png)
Label предложит один из нескольких форматов. Для задачи по извлечению именованных сущностей чаще всего это:
— JSON
— JSON-MIN
— CSV
— TSV
— CONLL2003
![](https://habrastorage.org/getpro/habr/upload_files/f22/6d0/797/f226d0797d3f9c1a49ef72929dff62bb.png)
Ставите поинт на нужный и нажимаете Export. Готово.
Заключение
В этой статье мы прошлись по полному циклу NER-разметки в Label Studio от установки и настройки проекта до аннотации сущностей и экспорта готового датасета.
Очень надеюсь, что статья была для вас полезной. Если у вас есть какие-то рекомендации, советы или вы нашли неточности — дайте знать в комментария.
Всем хорошей разметки!