В этом сообщении в блоге я дам обзор проекта, над которым я работал последние несколько месяцев в качестве инженера-исследователя НЛП в SnapTravel.

SnapTravel помогает людям бронировать отели, разговаривая с чат-ботом. На простом английском языке пользователь описывает нашему боту, какой отель он ищет, и мы рекомендуем ему лучшие отели, соответствующие ее критериям. Для этого нам необходимо построить модели НЛП, чтобы понимать сообщение пользователя и извлекать соответствующие фрагменты информации.

Например, типичное сообщение может выглядеть так:

В этом запросе пользователь указывает множество вещей, в том числе город, в который он едет, дату заезда, продолжительность пребывания, количество людей, а также упоминает, что ему нужна парковка.

Другой пример:

На этот раз пользователь хочет забронировать Bellagio, роскошный курорт в Лас-Вегасе. Слово белладжио может означать город в Италии, поэтому само слово белладжио неоднозначно. Однако в сочетании с вегасом мы точно знаем, что ей нужен курорт, а не итальянский городок. Это лишь один из многих примеров лингвистической двусмысленности, которые нам необходимо учитывать при разработке нашей системы НЛП.

Первая попытка: регулярные выражения

Первое, что мы попробовали, - это составленный вручную набор регулярных выражений для поиска ключевых слов. Эта элементарная система сработала достаточно хорошо для некоторых вещей - не так уж много способов сказать, что вы хотите парковаться. Это также служит хорошей отправной точкой для сравнения наших более сложных моделей.

Мы использовали эвристику на основе регулярных выражений для анализа некоторых простых ключевых слов, таких как предпочтения звезд. Однако для других категорий, таких как названия городов и отелей, было ясно, что регулярные выражения не будут масштабироваться. В нашем каталоге более 1,5 миллиона отелей и 60 000 городов, поэтому нам требовался более разумный подход.

Маркировка данных

Прежде чем мы смогли заняться каким-либо машинным обучением, нам потребовались данные для обучения наших моделей, а также для оценки их эффективности. Для этого мы создали инструмент аннотации с использованием PyBossa и наняли несколько профессиональных агентов по разметке данных, которые тратят несколько часов каждую неделю на аннотирование наших данных.

Для большей точности мы настроили его так, чтобы маркировку выполнял один агент, а затем то же сообщение передавалось второму, другому агенту, который проверял наличие ошибок.

Вскоре мы получили несколько тысяч аннотированных сообщений. Да начнется машинное обучение!

Распознавание нейронных именованных сущностей SpaCy

В этом разделе мы решаем проблему разрешения названий городов и отелей в сообщениях пользователей.

Если ваш друг говорит вам: «Я ездил в Санта-Барбару на выходных», вы можете сделать вывод из контекста, что «Санта-Барбара» - это название места, даже если вы никогда раньше о нем не слышали. Это очевидно по форме слова и окружающим его словам. Компьютеры тоже могут это делать с помощью НЛП.

Эта проблема - хорошо изученная область НЛП, называемая распознаванием именованных сущностей (NER). NER занимается извлечением токенов в тексте, которые являются именами собственными, и принятием решения о том, какой тип собственного имени это, например, имя человека, места или организации.

Lample et al. (2016) был первым, кто использовал рекуррентные нейронные сети для NER. В их модели входное предложение преобразуется в последовательность вложений слов, которая передается в двунаправленный LSTM. LSTM учится выводить последовательность тегов сущностей, по одному для каждого слова, в то время как условное случайное поле (CRF) изучает ограничения, так что выходная последовательность является разумной локально.

Звучит сложно, но SpaCy реализует вариант этого алгоритма, так что вам не придется реализовывать его самостоятельно. Все, что вам нужно, это набор данных с предложениями и достоверными тегами NER, который обеспечивает предварительную обработку входных данных и обучение сети. Более того, он поставляется с предварительно обученными векторами слов, которые вы можете настроить с помощью собственных данных.

Когда мы обучили нашу модель SpaCy NER, она научилась извлекать маркеры местоположения из предложения с приличной точностью, но у нее возникли трудности с различением названий городов и отелей. Рассмотрим следующие вопросы:

  • «Белладжио-Вегас на следующих выходных»
  • «Абано-Терме, Италия в следующие выходные»

В первом примере «Белладжио» - это название отеля, а «Вегас» - это название города. А второй пример - «Абано Терме» - это гостиница «Абано» в городе под названием «Терме»?

На самом деле, Абано-Терме - город в Италии, но вы не можете узнать об этом, если не знаете географию Италии. Эти два предложения синтаксически идентичны. Без доступа к каким-либо знаниям о внешнем мире модель NER изо всех сил пытается понять разницу.

Увеличение NER

Как упоминалось выше, модель NER сама по себе не дает нам необходимой точности.

Чтобы улучшить разрешение для наших отелей и городов, мы дополнили NER SpaCy нашими собственными моделями ( конфиденциальными для SnapTravel ). Это существенно повысило точность нашей модели: в то время как NER SpaCy определил правильный отель с 65% баллом F1, мы смогли поднять балл F1 до более чем 80%, объединив его с другими моделями.

Наша модель также распознала ситуации, когда пользователю нужно было задавать дополнительные вопросы, чтобы уточнить, что он ищет.

Будущие направления

Вот и все, что вам нужно для общего обзора нашей системы НЛП для уточнения поиска!

Раньше я проходил стажировку в качестве инженера-программиста в нескольких компаниях, но это моя первая стажировка в области машинного обучения и обработки данных. Машинное обучение сильно отличается от разработки программного обеспечения. Работа гораздо более экспериментальная, и вы никогда не знаете, какие модели будут работать или какой результат в F1 вы достигнете, пока не попробуете. На каждую модель, которая попадает в производство, у меня есть пять блокнотов Jupyter, полных неудачных экспериментов, которые не увенчались успехом.

Хороший подход - прочитать много исследовательских работ, чтобы получить идеи, что можно попробовать, а также понять характеристики множества различных моделей, чтобы вы могли судить, какие из них наиболее подходят для вашей задачи. В машинном обучении теорема нет бесплатного обеда гласит, что не существует универсального алгоритма обучения, подходящего для всех задач. Вместо этого вы должны настроить свои модели, чтобы воспользоваться неявными бизнес-предположениями и конкретными свойствами вашего набора данных.

В следующие несколько месяцев мы продолжим работу над множеством мелких деталей, чтобы запустить эту систему в производство, и продолжим пробовать различные модели для повышения ее точности. Спасибо Леону Цзяну и Нехилу Джайну из нашей команды инженеров за их поддержку, сделавшую возможным этот проект!

Хотите узнать больше о команде SnapTravel или присоединиться к нам, чтобы помочь нам решить эти сложные задачи? Посетите нашу страницу вакансий здесь!