В Авито есть вертикаль Услуг, где исполнители (селлеры) размещают объявления о разных видах работ. Объявления организованы по категориям и микрокатегориям внутри них. Например, объявление о полном ремонте квартиры может относиться к категории «Ремонт и отделка» и микрокатегории «Ремонт квартир и домов под ключ».
При этом селлеры нередко создают одно объявление, в котором описывают сразу несколько видов работ. Например, в тексте одного объявления могут одновременно встречаться:
-
ремонт под ключ;
-
электрика;
-
сантехника;
-
натяжные потолки;
-
укладка плитки
Однако само объявление публикуется только в одной микрокатегории. Из-за этого селлер не попадает в точечные выдачи по другим релевантным микрокатегориям, где пользователи ищут конкретную услугу.
В нашей категории мы хотим решить эту проблему, автоматически создавая для селлера дополнительные черновики объявлений на основе уже существующего объявления. Такие черновики должны создаваться только для тех микрокатегорий, где из текста действительно следует, что селлер оказывает услугу как самостоятельную, а не просто упоминает ее как часть комплексной работы.
Простого поиска по ключевым словам для этого недостаточно. Упоминание услуги в тексте не всегда означает, что исполнитель продает ее отдельно. Например:
-
«делаем ремонт под ключ, включая электрику и сантехнику» — скорее говорит о составе комплексной услуги;
-
«выполняем электрику отдельно, сантехнику отдельно, а также ремонт под ключ» — уже дает основания создать несколько отдельных черновиков.
Нужно разработать систему, которая по тексту объявления определяет:
-
какие микрокатегории представлены в объявлении на основе словаря характерных ключевых фраз;
-
нужно ли создавать дополнительные черновики объявлений, и если да, то для каких микрокатегорий.
В идеале решение должно не только определить целевые микрокатегории для новых черновиков, но и предложить вариант текста для каждого из них.
Все данные, с которыми работают участники, относятся только к категории «Ремонт и отделка».
Участникам передаются:
-
словарь микрокатегорий категории «Ремонт и отделка» с ключевыми фразами, описывающими услуги микрокатегории;
-
набор примеров объявлений с эталонным решением: нужно ли создавать дополнительные черновики и для каких микрокатегорий.
Каждая микрокатегория задается следующими полями:
-
mcId— уникальный идентификатор микрокатегории; -
mcTitle— текстовое название микрокатегории; -
keyPhrases— список характерных ключевых фраз, связанных с микрокатегорией.
Пример:
{
"mcId": 101,
"mcTitle": "Сантехника",
"keyPhrases": [
"разводка труб",
"установка сантехники",
"монтаж унитаза",
"замена смесителя"
]
}
Каждое объявление задается следующими полями:
-
itemId— уникальный идентификатор объявления; -
mcId— идентификатор исходной микрокатегории объявления; -
mcTitle— название исходной микрокатегории объявления; -
description— текст объявления.
Пример:
{
"itemId": 5001,
"mcId": 201,
"mcTitle": "Ремонт квартир и домов под ключ",
"description": "Делаем ремонт квартир под ключ, а также отдельно выполняем сантехнические и электромонтажные работы."
}
Решение должно реализовывать интерфейс, который по входному объявлению определяет:
-
какие микрокатегории представлены в тексте объявления;
-
нужно ли создавать дополнительные черновики объявлений;
-
если да, то для каких микрокатегорий;
-
по возможности — предлагает текст для каждого черновика.
Результат работы решения должен содержать:
-
shouldSplit— признак необходимости создания дополнительных черновиков; -
drafts— список предложенных черновиков.
Каждый черновик содержит:
-
mcId— идентификатор микрокатегории; -
mcTitle— название микрокатегории; -
text— предложенный текст черновика.
Пример:
{
"shouldSplit": true,
"drafts": [
{
"mcId": 101,
"mcTitle": "Сантехника",
"text": "Выполняем сантехнические работы отдельно: разводка труб, установка сантехники."
},
{
"mcId": 102,
"mcTitle": "Электрика",
"text": "Отдельно выполняем электромонтажные работы: замена проводки, перенос розеток."
}
]
}