Иногда люди обращаются к Яндексу, чтобы найти фильм, название которого вылетело из головы. Описывают сюжет, запомнившиеся сцены, яркие детали: например, [как называется фильм там где мужик выбирает красная или синяя таблетка]. Мы решили изучить описания забытых фильмов и выяснить, что сильнее всего запоминается людям в кино.

Сегодня мы не только поделимся ссылкой на наше исследование, но и вкратце расскажем о том, как развивался семантический поиск Яндекса. Вы узнаете, какие технологии помогают поиску находить ответ даже тогда, когда точно сформулировать запрос просто не получается.

А ещё мы добавили слайдеры-загадки с примерами реальных запросов людей — почувствуйте себя поисковой системой и попробуйте угадать ответ.


Все поисковые системы начинались с поиска слов. Яндекс уже на старте умел учитывать морфологию русского языка, но это был всё тот же поиск слов из запроса на страницах в сети. Мы хранили списки всех известных страниц для каждого слова. Если запрос содержал фразу, то достаточно было пересечь списки слов — вот вам ответ. Отлично работало в те времена, когда сайтов было мало, а вопрос ранжирования ещё не стоял так остро.

Рунет развивался, сайтов становилось всё больше. К фактору пересечения слов добавились ещё два. С одной стороны, нам помогли сами пользователи. Мы стали учитывать, какие сайты и по каким запросам они выбирают. Нет точного соответствия слов, но сайт решает проблему человека? Это полезный сигнал. С другой стороны, на помощь пришли ссылки между сайтами, которые помогли оценить значимость страниц.

Три фактора — это очень мало. Особенно когда их пытаются накрутить зачастую очень талантливые поисковые оптимизаторы. Но переварить больше вручную было сложно. И здесь началась эпоха машинного обучения. В 2009 году мы внедряем Матрикснет на основе градиентного бустинга (позднее эта технология легла в основу более совершенной опенсорсной библиотеки CatBoost).

С тех пор факторов становилось всё больше, потому что нам уже не приходилось искать взаимосвязи между ними вручную. За нас это делала машина.

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


Ранжирование — это уже давно не только сравнение слов запроса и страницы. Два примера.

Ещё в 2014-м мы внедрили технологию аннотации документа характерными запросами. Допустим, что в прошлом был запрос [сериал из бразилии про мясного короля], для которого хороший ответ уже известен. Затем другой пользователь вводит запрос [бразильский сериал в котором были мясной король и молочный король], для которого машина ещё не знает ответ. Но у этих запросов много общих слов. Это сигнал, что найденная по первому запросу страница может быть релевантна и по второму.

Другой пример. Возьмём запросы [бразильский сериал в котором были мясной король и молочный король] и [сериал роковое наследство]. Из общего у них только одно слово — «сериал», а этого мало для явного сопоставления запросов. На этот случай мы начали учитывать историю поиска. Если у двух непохожих запросов пользуются спросом одни и те же сайты в выдаче, то можно предположить, что запросы взаимозаменяемы. Это полезно, потому что теперь мы будем использовать для поиска тексты обоих запросов, чтобы найти больше полезных страниц. Но это работает только для повторяющихся запросов, когда уже есть хоть какая-то статистика. Что делать с новыми запросами?

Недостаток статистических данных можно компенсировать анализом контента. А в анализе однородных данных (текст, голос, изображения) лучше всего себя показывают нейронные сети. В 2016-м мы впервые рассказали сообществу Хабра о технологии «Палех», которая стала отправной точкой для более масштабного применения нейросетей в Поиске.

Мы начали обучать нейросеть сравнивать смысловую (семантическую) близость текстов запроса и заголовка страницы. Два текста представляются в виде векторов в многомерном пространстве так, чтобы косинус угла между ними хорошо предсказывал вероятность выбора страницы человеком, а значит, и смысловую близость. Это позволяет оценить близость смыслов даже тех текстов, в которых нет пересечения слов.

Пример архитектуры слоёв для любопытных
image

Таким же способом мы стали сравнивать тексты запросов, чтобы выявлять между ними связи. Реальный пример из-под капота поисковой системы: для запроса [американский сериал про то как варят метамфетамин] именно нейронная сеть находит в качестве похожих по смыслу фразы [во все тяжкие] и [breaking bad].

Запросы и заголовки — это уже хорошо, но мы не оставляли надежду применить нейросети и на полном тексте страниц. Кроме того, когда мы получаем пользовательский запрос, то среди миллионов страниц индекса начинаем поэтапно выбирать лучшие страницы, но в «Палехе» мы использовали нейросетевые модели только на самых поздних этапах ранжирования (L3) — приблизительно к 150 лучшим документам. Это может привести к потере хороших ответов.

image

Причина предсказуема — ограниченность ресурсов и высокие требования к скорости ответа. Жёсткие ограничения вычислений связаны с простым фактом: нельзя заставлять пользователя ждать. Но затем мы кое-что придумали.


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

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

Ещё одна схема для любопытных
image

Мы построили дополнительный индекс. В его основе лежит гипотеза: если к запросу из нескольких слов взять достаточно большой список из самых релевантных документов по каждому слову или словосочетанию, то среди них найдутся документы, релевантные одновременно всем словам. На практике это значит вот что. Для всех слов и популярных пар слов формируется дополнительный индекс со списком страниц и их предварительной релевантностью запросу. То есть мы переносим часть работы из этапа L0 на этап индексирования и опять же экономим.

В итоге изменение архитектуры и перераспределение нагрузок позволило нам применить нейросети не только на стадии L3, но и для L2 и L1. Более того, возможность сформировать вектор заранее и с менее жёсткими требованиями к производительности позволила нам использовать не только заголовок страницы, но и её текст.


Дальше — больше. Со временем мы стали применять нейросети на самом раннем этапе ранжирования. Мы учим нейросети выявлять неявные закономерности в порядке слов и их взаимном расположении. И даже выявлять смысловую схожесть текстов на разных языках. Каждое из этих направлений тянет на отдельную статью, и мы постараемся вернуться с ними в ближайшем будущем.



Сегодня мы ещё раз напомнили о том, как поисковые системы учатся находить ответ в условиях размытости запроса и недостатка информации. Поиск фильмов по их описанию — это не только частный случай таких запросов, но и отличная тема для исследования. Из него вы узнаете: что сильнее всего запоминается людям в кино, с чем ассоциируются разные жанры и кинематографы разных стран, какие сюжетные ходы производят особенное впечатление.

Комментарии (21)


  1. mig126
    21.08.2019 10:10
    +2

    Спасибо, это огромная и нужная работа. Так по описанию поисковик находил только тот же(или похожий) текст на разных форумах. А уже на них можно с некоторой вероятностью найти нужный фильм.


  1. Eldhenn
    21.08.2019 10:41

    Слабо для музыкальных клипов сделать?
    А впрочем… с фильмами тоже как-то неочень.


    1. domix32
      21.08.2019 12:01

      И мультфильмы


    1. p07a1330
      21.08.2019 14:55
      +1

      А в чем принципиальная разница?
      Да и тот же знаменитый «Eagle flies alone» вполне себе находится по фразе «клип синие волосы орел метал» — только что тестил)


      1. Eldhenn
        21.08.2019 15:30

        1. «Фильм мужику в шлем бросили гранату» — ничего не находит. Фильм был в 80х, боевик, в конце эпизода диалог "- Он мёртв? — У него нет головы!". Название не скажу, не помню, яндекс не подсказал.
        2. «Клип два космических корабля с женщинами и мужчинами». Примерно так я когда-то его искал, коллективный разум тогда подсказал — The Cars, «You Are The Girl». Да, это не Ангус Янг («мужик в шортах с гитарой прыгает по сцене»), и даже не знаменитый «синие волосы метал» (про который я впервые услышал), но в том и суть, чтобы находить малопупулярное, старое и крепко забытое.


        1. mig126
          21.08.2019 15:47

          Суть в том, что индексация пока ручная. И далеко не всё фильмы просмотрели.


          1. Eldhenn
            21.08.2019 17:09

            А, ну так не интересно.


          1. BarakAdama
            21.08.2019 17:13

            Индексация не может быть ручной :)


            1. vedenin1980
              21.08.2019 18:52

              Она может быть только дикой и свирепой? :)


        1. slarionoff
          21.08.2019 19:35

          Спасибо, Eldhenn, сколько же я этот клип искал! Тридцать лет назад в Москве по 2х2 крутили…


          1. Eldhenn
            22.08.2019 07:46

            Вот и я его почти 30 лет искал :)


    1. klvov
      21.08.2019 21:19

      «А это мысль». Ну-ка, попробуем спросить у Яндекса:
      клип где медленно ходят по свалкам и сбрасывают стул с обрыва — не нашел (Metallica, Unforgiven)
      клип где мужик подбрасывал монету а потом у него посинели руки — не нашел (тут я не помню, что это было, но крутили в поздних 90-х по MTV)
      клип где мужик ставит кассету и все начинают колбаситься — а вот тут Яндекс не сплоховал, и сразу выдал Push the tempo


  1. Squoworode
    21.08.2019 12:00
    +1

    Эх, вот бы ещё заголовки слайдеров на экране телефона помещались…


  1. ionicman
    21.08.2019 12:08
    +2

    Простите, не удержался :)

    image

    А что до самих алгоритмов — занимались похожей проблемой — главное, за что споткнулись — при поиске по ассоциациям у людей в памяти зачастую всплывает «полузабытая» ассоциация с чем-то — например с фильмом, т.е. если-бы человек напрягся — полуразрушенная нейронная связь восстановилась, и он бы дал гораздо более правильное определение (так работает наша память), но так как все спешат — этого не происходит. Получается мало того, что ассоциации у каждого человека на одно и тоже явление отличаются, так они еще и оказываются искажены. С Грутом и грунтом как раз тоже самое.


    1. mig126
      21.08.2019 15:15

      Сразу вспомнилось

      Ещё по телевизору смотрел.


    1. asmodeusta
      21.08.2019 18:39
      +1

      Думаю что с грутом и груНтом сработала банальная автокоррекция


  1. GlukKazan
    21.08.2019 14:50

    С «кольцом» промахнулись. Это Спайдервик.


    1. Kate1313
      22.08.2019 17:20
      +1

      Да, в ВК Кольцо немного другую дичь показывало


  1. Ogoun
    21.08.2019 16:31

    Если убрать буквенные триграммы, на сколько упадет точность? И как вообще пришли к ним?


  1. Mingun
    21.08.2019 18:19

    Хм, ищите по описанию… Ладно.


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


    Что это? Когда-то давно читал, сейчас даже примерно не представляю, что это могло быть.


  1. Sergey6661313
    21.08.2019 22:21
    +1

    «Порно с мёдом» по прежнему настаивает на поиске видео в мед клиниках. Слишком интеллектуальный поиск мало того что заменяет «мёд» на «мед», он так-же же сам автоматически подставляет английские синонимы — «medical, medicinal, medic», вместо «sweetness, sweet, honey, goody»

    А если серьёзно:
    «Фильм где зелёные буквы падают» — в вкладке картинки — находится именно то что искал, однако во вкладке видео и поиск — ни намёка.