Оглавление
- Фабрика семантики - 10-15 минут link;
- Источники семантики - 10-15 минут link;
- Итоги разметки - 10-15 минут;
- Вступление, декомпозиция задач, что работает в NLP - 10-15 минут link;
- Кластеры - 10-15 минут link;
- Путь от кластеров до поиска - 10 минут link
- Демонстрация поиска - 10 минут link
- Поиск - 10 минут link
- Деплой - 5 минут link
ДИСКЛЕЙМЕР - воспринимайте эту презентацию как интерактивный конспект, по которому если что вам будет удобно погуглить
<br><br><br><br>
Фабрика семантики
Цель: PROFI.RU, как тонкая платформа, должна научиться во вменяемое время предоставлять возможность найти специалиста по любой поисково востребованной услуге
Подзадачи
- Надо найти новые услуги;
- Они должны быть востребованными с точки зрения рынка;
- Построить для них процесс воспроизведения цепочки (поисковый движок -> визард уточнения -> матчинг специалистов);
<br><br><br><br>
<br><br><br><br>
Активности по нахождению новых услуг и построения цепочки “услуга -> визард -> специалист”
- Новые услуги в областях, которыми мы никогда не занимались:
- Парсинг Интернета. Отдел маркетинговой разработки, Сверкунов Евгений;
- Кластеризация. Отдел DataScience-аналитики, Вейсов Саша;
- Новые услуги в привычных нам вертикалях:
- Поисковый движок или классификатор.Отдел DataScience-аналитики, Вейсов Саша;
- Альтернативный движок услуг. Команда ФротиЩе, Щелоков Илья;
<br><br><br><br>
<br><br><br><br>
up
Источники семантики
Типы источников
- Источники внутри (заказы, анкеты, резюме, поиск) — что еще делают наши специалисты, что еще хотят наши клиенты
- Источники поисковых систем — что еще искали пользователи, которые нашли нас
- Внешние SEO-сервисы — по каким в принципе запросам наши конкуренты ранжируются (по версии этих SEO-сервисов)
- Прямая работа с конкурентами. Авито, FL — заголовки объявлений, youdo — саджесты.
<br><br><br><br>
<br><br><br><br>

up
Итоги разметки
Для справки
Всего за время существования profi было накоплено (порядки):
- 5,000 услуг, реально живых 2,000-3,000, услуг “первого уровня” - порядка 500;
- Несколько десятков тысяч синонимов;
<br><br><br><br>
<br><br><br><br>
Что? |
Размер |
Кто работал? |
Значимость для DS |
Значимость в услугах |
Ссылка |
Разметка запросов конкурентов через дистилляцию |
100,000 + 400,000 (20-80) |
10 дней, 11 человек |
Вместо 15м строк обрабатываем в 100 раз меньше |
400/1233/16527 услуг/подуслуг/синонимов |
link |
Dev set, 3-6 мес поиска + заведение синонимов |
20,396 |
5 человек, 8 дней |
первый размеченный датасет, 20-30 пп роста точности |
323 синонима и услуги |
link |
Разметка доп. услуг по итогу разметки |
300 |
|
больше синонимов |
300 услуг и синонимов в декомпозиции 100/200 |
link |
Поиск новой семантики во внутренних базах - поиск / SEO |
70,000 |
в среднем 6 человек, 1 месяц |
2-3 пп точности классификатор |
450 потенциальных новых услуг и синонимов в декомпозиции 90/450 |
link |
Правка “дубликатов” в дереве услуг |
400 |
|
очевидные косяки дерева |
пока в процессе, 88 синонимов выделено |
link |
Разметка графы “другие услуги” |
400 |
|
|
Скорее всего сотня синонимов |
|
Разметка “Белоснежных заказов” и нестандартных услу |
600 запросов за месяц, обработали ~300 |
|
некий “аналог” active learning |
8/25/53 услуг/подуслуг/синонимов |
link link |
Разметка кластеров |
20,000-100,000 |
TBC |
TBC |
TBC |
TBC |
up
Вступление
Пояснения основных терминов
- Не пугайтесь черных ящиков - их нужно понимать на 1-2 уровня "вниз";
- NLP - natural language processing, раздел машинного обучения, который занимается обработкой текстов на естественном языке;
- Вектор / embedding / вектор fast-text - как правило 300-мерный вектор, который ставят в соответствие некому слову или набору символов;
- Н-грамма / n-gram - несколько символов, например fast-text видит слово кошка примерно так:
<кош
+ кош
+ ошк
+ <кошк
итд;
- Supervised learning - когда мы обучаем алгоритмы и у нас ЕСТЬ РАЗМЕТКА;
- Unsupervised learning - когда мы имитируем разметку (или используем внутреннюю структуру данных) или ее у нас нет;
- Корпус / corpus - много текста на какую-то тематику, в идеале с разметкой;
- Кластер - однородный кусок данных например внутри корпуса;
- Imagenet - изначально датасет в 1M картинок с которого началась вся движуха в ML;
- CNN - сверточная нейросеть. По сути просто много обучаемых фильтров и активации между ними;
- RNN - рекуррентная нейросеть. По сути в ней просто данные гоняются по кругу;
Декомпозиция задач на примере Github
- У них стоит примерно такая задача - ввел три слова => получил ссылку на файл с кодом, который соответствует запросу;

Общее понимание данных
Длина ввода (в символах)

Конверсия
Поисковая сессия => валидная поисковая сессия 77% => ввод или выбор услуги 85%
общая конверсия ~ 65%
Конверсия в заказ
Поисковая сессия => заказ 20-25%
Поведенческие данные
- 26% выбирали предложенные услуги
- 27% редактировали текст
- 42% убирали курсор из строки поиска
- 54% убрали курсор, потом вернул
- 38% mobile / 62% desktop
- 40% пользовались авто-дополнением
Декомпозиция задач и у нас
- У нас 3 задачи:
- Понимать намерения клиента при поиске;
- Помогать ему найти то, что ищет;
- Найти новые услуги и синонимы в разумное время;

Про задачи NLP в целом
- Что работает в NLP?
- The “imagenet moment”;

Общая логика работы
- Пробуем всё до чего можем дотянуться;
- Фокус на dense подходы и сетки против sparse подходов и графов (проще, быстрее, больше гарантии результата);
- Выбрать лучшие вектора;
- Несколько подходов к кластеризации;
- HDBSCAN + UMAP;
Кластеры
Первый подход к кластерам без разметки
- Вектора fast-text c araneum;
- HDBSCAN + PCA + UMAP (PCA легко гуглится, по HDBSCAN и UMAP автор сделал отличные гайды, гуглится “how HDBSCAN works”;
- Смешанные результаты - работает или хорошо или плохо - примерно 50% кластеров “хорошие”;
- Тут мы поняли важность очистки датасета - убрать имена собственные, убрать гео - качество стало сильно выше;
- Если в кластер “затесались” запросы с разметкой, то можно улучшить кластеры через эвристику “какое у тебя соседи, такой и ты”;
- Структура лучших кластеров визуально повторяла структуру “проектов”, что хорошо - ремонт отдельно, маникюр отдельно;


Второй подход к кластерам
- Авито корпус;
- Новые вектора из итогового классификатора;
- Краткое описание для каждого кластера;
- Кластеры меньшего размера, более “специфичные”, большую часть можно описать одной или несколькими услугами;
- Классификатор показывает, какие услуги подходят больше всего;
- Подсвечиваем подозрительные слова, которых пока нет в базе/есть в синонимах другой услуги;


Демонстрация
Пересечение словарей

Пересечение pservice_id

Путь от кластеров до поиска
Готовые вектора для слов
Список векторов
Самые лучшие
- Изначальные вектора с araneum russicum maximum;
- Вектора fast-text натренированные на огромном корпусе (200 ГБ);
- Вектора fast-text натренированные на корпусе конкурентов;
- Сиамские эмбеддинги (натренированные “сближать” похожие фразы);
- Мешок н-грамм из лучшей сетки (причем использую эвристику о разделимости слов - получается чуть лучше);

Сравнение “точности” на KNN на синонимах

Проделанная работа по большим корпусам и н-граммам
- Оперативно собраны гигантские корпуса для русского языка;
- Социальный инжиниринг (дайте пожалуйста - Тайга, araneum - но там с предобработкой), Wiki - очень быстро на готовом + пост-процессинг, Common Crawl - интернет 500 мб/c + ловкость рук и социальный инжиниринг;
- Больше деталей тут и тут;
- Выбран 1М н-грам, который позволит генерализоваться на любых словах;
- Вообще мы думали, что зайдет большой sentence encoder - но не зашел;
- Как наш словарь из 1М н-грам покрывает ВСЕ русские слова из русского интернета (1 ТБ слов):

Псевдо-кластеры или “дистилляция”
Что и зачем
- Чтобы контент мог обработать результаты парсинга в разумное время;
- Было 15м+ запросов;
- Применив 3 лучшие на тот момент сетки и поигравшись порогами, снизили число запросов до адекватного (500к);
- Прогнали через Вордстат - снизили еще в 5 раз до 100к;
Интуиция
Кажется, что сиамские вектора лучше генерализуются
siamese > ft:
keyword |
closest synonym siamese |
closest synonym ft |
посадочная яма яблони |
ручная копка траншей |
посадочная страница |
отделка стен маленькой кухни |
декорирование стен кухне |
отделка стен фанерой |
спасти жесткий диск |
внешний жесткий диск восстановление данных |
жесткий цигун |
ft> siamese:
keyword |
closest synonym siamese |
closest synonym ft |
варочная поверхность bosch подключение |
монтаж подключение смесителя |
подключение варочной поверхности |
мужская прическа косичкой короткой |
прическа выбритым виском женская |
мужская стрижка косичкой сзади |
обои жидкие стен |
жидкие обои |
наклеить обои |
Распределения
<img width=“403” alt=“distrsyn” src="https://user-images.githubusercontent.com/36192906/46403310-db70c000-c70a-11e8-9b55-9f6e6b165474.PNG">
Итоговый классификатор
Демонстрация
(открыть юпитер, спросить примеры из зала, посмотреть что сетка выдаст)
Архитектура
- Обычная bi-LSTM сетка + average pooling внутренних состояний;
- Изначальный хак состоял в замене обычного embedding слоя на мешок векторов, по сути аналогичный fast-text;
- Это было технически интересно - запилить fast-text, но внутри сетки, в т.ч. чтобы соблюсти требования к деплою;
Оригинальный датасет размеченный вручную
Как росла точность наших моделей на оригинальном датасете (крайний левый столбец - нынешний алгоритм)

source |
top1 acc |
top5 acc |
sage acc |
submit |
88% |
98% |
65% |
Больше деталей тут
С опечатками

source |
top1 acc |
top5 acc |
sage acc |
submit |
83% |
95% |
56% |
С частичным вводом

source |
top1 acc |
top5 acc |
sage acc |
submit |
52% |
70% |
39% |
С частичным вводом и опечатками
source |
top1 acc |
top5 acc |
sage acc |
submit |
49% |
67% |
35% |
С частичным вводом и опечатками, в зависимости от длины фразы
# |
0-4 letters |
5-8 letters |
9-15 letters |
0 full words |
13%/13% |
31%/24% |
34%/29% |
1 full word |
63%/45% |
62%/43% |
67%/48% |
2 full words |
75%/42% |
78%/44% |
78%/44% |
3+ full words |
89%/40% |
83%/41% |
85%/40% |
Известные проблемы
- Более хрупкий относительно очень редких слов (пример - собака);
- Для редких и парцеллярных услуг иногда выдает их родительские услуги;
- Не идеальная полная генерализация по смыслу слов. Пример - “кастрировать кота” обработается, а “отрезать коту яйца” - нет;
- Неверная раскладка клавиатуры не обрабатывается by design (на фронте вроде команда Ильи уже решила), но обрабатывается by luck;
- Есть интересные кейсы, которые мы пока не обрабатываем, т.к. выкидываем знаки препинания
2533 R'n'B
3289 A.C.T.
3626 C++
3627 C#
3999 1С
4173 К-1
4176 К.Т.А.
12134 r n b
12135 R&B
14675 С++
16696 O.P.I.
22368 r'n'b
22369 r&b
22609 a.c.t.
22942 c++
22943 с++
22944 c#
23980 1с
24127 к-1
24128 к.т.а.
24529 o.p.i.
39377 F
Решенные проблемы
- Точность;
- Попадание в точные синонимы;
- Медицинские услуги;
- Опечатки;
- Частичный ввод;
- Генерализация, порядок слов, интерполяция;
Деплой
- Docker - контейнер с веб-сервисом внутри;
- Минимизация по памяти - ужали размер модели до ~
1,000
Mb;
- Минимизация по зависимостям - выпилено практически все кроме
PyTorch
;
- Классификация одной фразы -
2-5 ms
;
- Другие применения - по сути можно адаптировать под любого заказчика, т.к. веб-сервис;