- PVSM.RU - https://www.pvsm.ru -
Сегодня мы расскажем о механизме, который позволяет поиску Яндекса находить именно то, что имел в виду пользователь, как бы кратко и небрежно он ни сформулировал свой запрос.
В мире поиска такой механизм называют расширением поискового запроса. Термин достаточно широкий, включает в себя переформулировки, синонимы, транслит и даже однокоренные слова (последние иногда ошибочно называют поддержкой морфологии).
Из каких частей этот механизм состоит? Что помогает ему угадывать? И почему на каждую из его редких ошибок приходятся тысячи запросов, на которых он сильно помог?


Используя примитивные реализации поиска в небольшом интернет-магазине или на местном форуме, часто приходится переформулировать первоначальный запрос вручную — заменять слова на синонимы, варьировать падежи, времена глаголов и так далее.
Заметив это много лет назад, разработчики поисковых систем решили, что можно сильно упростить жизнь пользователю, если сразу, автоматически, искать не только заданный запрос, но и различные его вариации и переформулировки. Теперь уже никого не удивляет точная поисковая выдача в руках пользователя, не искушённого в премудростях составления поискового запроса [1] — однако борьба за экономию времени и увеличение свободы при формулировании запроса продолжается.
Сегодня мы рассмотрим только механизмы расширения запроса, то есть дополнение исходного запроса другими словами. О способах изменения запроса (исправлении опечаток в слове «одноклассники» [2] и словоизменении Брич-Муллу, Брич-Муллою [3]) постараемся рассказать в другой раз.
Мы делим расширения на несколько видов, каждый из которых имеет параллели в лингвистике, но и по-своему отличается от своего прообраза:
Раскрытие аббревиатур, пожалуй, самый обманчивый вид расширений — кажется на первый взгляд точным и однозначным («очевидно», «МГУ» — это «Московский Государственный Университет»), но быстро выясняется: есть и «Мордовский», и «Мариупольский», и «Международный Гуманитарный», и другие.
Мы различаем несколько типов аббревиатур:
При сборе вариантов расширений бывает немало ложных гипотез, с которыми мы боремся разными эвристиками:
В отличие от аббревиатур, тут интуиция оказывается права: На него приходится несколько десятков процентов всей пользы от расширений. У него хорошая точность и полнота; он хорошо помогает в любом контексте.
Пользователи не любят переключать раскладку на клавиатуре, а при поиске иностранной фамилии или населённого пункта проще набрать их по-русски («Демонжо» вместо «Demongeot» и «Кёльн» вместо «Cologne»), чем вспоминать правильное написание в оригинале. Нередка и обратная ситуация: жителям русскоязычных диаспор за рубежом привычнее общаться в форумах на русском, но с использованием транслита. Искать же по таким форумам нужно и для кириллических запросов. Транслитерация пригождается и когда слово запроса содержится в адресе найденного сайта.
На практике нам нужна даже не транслитерация, а так называемая практическая транскрипция [5] — максимально близкая передача оригинального звучания средствами другого языка. Иначе, например, французские слова будут искажаться до неузнаваемости.
Ограничимся поверхностным обзором, оставляя нюансы для самостоятельного поста. Самый известный и простой способ — транслитерация с помощью побуквенных правил. Есть несколько стандартов перевода [6] между латиницей и кириллицей, большинство являются взаимно-однозначными (полностью или для почти всех букв). К сожалению, этот метод даёт очень плохое качество для имён — даже «Renault» и «Pegueot» никогда не станут «Рено» и «Пежо».
Более продвинутый способ — по слогам. Перевод каждого слога независимо от контекста работает довольно точно. Но есть сложности:
Мы выбрали третий путь, метод разбиения на сегменты. Сегмент — это группа подряд идущих гласных / согласных букв. Нужно найти большое количество примеров пар слов, когда мы достоверно знаем, что одно является транскрипцией другого. И по этим примерам, с помощью машинного обучения, построить правила преобразования одних сегментов в другие.
Вот как это работает. Для каждой пары из обучающей выборки слова разбиваются на сегменты. Для каждого примера правильной транскрипции между сегментами оригинального слова и его транскрипцией устанавливается соответствие — оказывается, практически во всех случаях число сегментов в русском и иностранном словах оказывается равным.

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

Из этого примера видно, что «й» правильнее считать гласной. А «ъ», «ь», дефис и апостроф мы считаем согласными — ведь они разрывают звучание.
По нашему опыту, метод сегментов даёт самую лучшую точность. Он хорошо работает для всех распространённых языков — в том числе, для таких сложных, как китайский и вьетнамский (разумеется, в их буквенной записи). И даже позволяет с приемлемой точностью восстановить из русского написание на оригинальном языке. При этом метод не требует определения языка слова.
На тестовых коллекциях имен-фамилий, географических названий, популярных брендов и названиях музыкальных коллективов метод показывает точность до 99%. Если же оценивать точность на всём наборе гипотез, которые расширяются по реальным запросам и поисковому индексу, она падает по мере того, как мы увеличиваем словарь всё менее точными гипотезами. Сейчас пользователям доступны порядка 3 млн расширений на базе транслитерации, на них точность составляет около 90%.
Орфоварианты — это слова, которые имеют идентичное значение, а писаться могут и так, и эдак, причём оба написания считаются грамотными.
Во-первых, это иностранные слова, которые записываются со слуха, и часто не имеют единственного канонического написания («икея» / «икеа»; «толкиен» / «толкин»).
В отличие от транслитерации, тут мы имеем дело с парами на одном языке. Несколько слов, которые с помощью транскрипции можно привести к одному латиническому написанию, называются орфовариантами.
Во-вторых, русские слова, допускающие разные написания («бильярд» → «биллиард», «день рождения» → «день рожденья»)
Чем интересны орфоварианты?
Благо, у сленга довольно специфический контекст использования, это помогает отличать его от орфовариантов.
Особняком стоит третий тип — устаревшее написание: «великодержавнаго», «благочестиваго» (например, «царя»). Благодаря расширениям находятся и оригинальные древнерусские тексты с параллельным переводом на современный язык, и сами переводы без оригинала — последние неподготовленному читателю легче распечатать и читать.
Описанные выше виды расширений (аббревиатуры, транслиты, словоизменение, орфоварианты) старались отражать точные слова запроса всеми возможными способами, считая смысл неприкосновенным. Но быстро стало понятно, что нужно смелее допускать смысловые добавки к исходному запросу. Так расширения пополнились словообразованием («москва метро» → «московское метро») и синонимами («бегемот» → «гиппопотам»).
Идея расширения по принципу словообразования [9] состоит в добавлении к запросу однокоренных слов, включая даже другие части речи («москва метро» → «московское метро»).
Механизм словообразования зачастую называют просто морфологией, хотя это не совсем верно: кроме словообразования к морфологии относится и словоизменение (то самое «Брич-Муллою»). Словоизменение крайне редко добавляет к запросу новые смысловые оттенки, обычно оно ищет оригинальное слово запроса во всех формах (как говорят, «всю парадигму [10]»), поэтому в этом посте мы его не затронем.
Словообразование, напротив, может добавлять семантически далекие варианты — вопреки общим соображениям, слова с одним корнем не обязаны быть близкими по смыслу. Лишь малое число типов словообразования оказывается на практике хорошими поисковыми расширениями, поэтому нужно быть аккуратными.
Пары <существительное> -> <имя деятеля> («велосипед» -> «велосипедист») — сильно уводят от смысла первоначального запроса. Если <существительное> -> <прилагательное> «велосипед» -> «велосипедный» полезно (например, [покупка велосипеда] -> [велосипедный магазин]) — то «велосипед» -> «велосипедист» ухудшит поиск, потому что по запросу [покупка велосипеда] в выдачу будет добавляться, например, документы про «посадку велосипедиста», про «травмы велосипедиста» и т.п.
Аналогично, есть масса плохих примеров на смену рода. Возьмём «работник» → «работница»: если запрос [соглашение с работником] даёт широкий класс документов о любых предметах договорённостей, то расширяя его словом «работница», в выдачу попадают нежелательные документы, например про нормативную базу о выходе в декрет (которая с общим случаем про любого работника, скорее всего, не поможет).
Таким образом, схожесть слов по форме часто бывает обманчивой, и с точки зрения поиска содержание очень сильно меняется даже с самыми, казалось бы, невинными преобразованиями.
И если в русском мы можем безболезненно использовать все формы того слова, для которого подготовили расширение — то в турецком приходится рассчитывать контекстную близость не между разными словами, а между формами одного и того же слова. И ограничивать использование далёких форм того же слова, чтобы не допускать искажений смысла.
Можно ли взять за основу академические синонимы из традиционных словарей, и просто загрузить их в поиск? Ведь в словарях собраны обширные ряды надёжных синонимов.
Поэтому мы ушли от чисто словарного, лингвистического понимания синонимов, гораздо лучше работает статистический поиск эквивалентов. Собираются любые варианты, которые могут не быть синонимами в академическом смысле, но помогают найти то, что пользователь ищет. Именно это и является главным критерием качества — полезность расширений для ранжирования (а не их словарная близость по смыслу).
Но и коллекции статистически собранных синонимов в традиционном смысле (как слов с идентичным значение) бывает мало. Для узкоспецифичных запросов, по которым в интернете чрезвычайно мало информации, бывает полезно заменить некоторые слова запроса на более общие понятия («гиперонимы» [11]).
А в обратную сторону, от общего к частному, расширять рискованно. Запросом [одежда для детей] разные пользователи ищут магазины для различных возрастов, поэтому будет правильнее всего показать максимально универсальные сайты, покрывающие весь возможный спектр разных ситуаций пользователя. Если мы будем пытаться расширять запрос более частными понятиями «школьник» или «младенец», это может осложнить пользователю решение его задачи.
В следующем разделе самое интересное — как расширения используются в поиске, но прежде давайте разберёмся, как мы готовим гипотезы расширений.
Из рассказанного выше легко догадаться, что варианты возможных расширений для наших нужд можно построить только через анализ реальных данных, существующих «в диком виде» в интернете. Отвечать на запрос пользователя нужно быстро, поэтому мы готовим такие варианты (т.н. «словарь расширений») заранее — а в момент поиска просто выбираем из готового словаря все пары для слов запроса.
Для составления словаря мы используем ряд источников:
Для русского языка это даёт порядка 150 млн пар — гипотез расширений.
Пары, которые встречаются слишком редко и в запросах, и в текстах в интернете — не очень достоверный источник, поэтому после сбора гипотез мы ограничиваем их по частоте встречаемости.
Нет особого смысла и как-либо учитывать форму (падеж, склонение), в котором слово встретилось вместе с той или иной парой (по крайней мере, для русского языка). Поэтому мы оставляем единственную форму слова (как правило, начальную).
В результате этого обычно получается порядка 100 млн пар.
Но 100 млн сырых гипотез — это руда, которую нельзя просто отдать на этап обработки запроса.
Как многое другое в этой теме, степень близости по смыслу расчитывается машинным обучением.
С другой стороны, специальные эксперты (асессоры [16]) готовят обучающую выборку характерных примеров «какое слово B является хорошим расширением слова A, а какие пары недопустимо считать синонимичными».
Подготовка обучающей выборки — сложная задача, от её решения напрямую зависит качество итогового словаря. Даже опытные асессоры часто расходятся в оценке расширений. Асессорам приходится думать не только о близости слов с точки зрения языка, но и прогнозировать, как конкретная пара повлияет на полезность выдачи в целом сегменте запросов.
В результате этого отбора мы получаем 10 млн расширений — и этот «словарь» используется при обработке запросов. Об этом поговорим в следующем разделе.

Получив от пользователя поисковый запрос, мы выбираем из словаря расширения, подходящие по контексту.
Например, [мгу] расширилось в [мгу ^ mgu ^ msu ^ «московский государственный университет»].
А уже по расширенному запросу поиск находит документы с различными вариантами формулировок, включая оригинальную («точную форму»). В ранжировании документов участвует множество факторов, учитывающих и оригинальное слово, и расширения. При прочих равных совпадение точной формы («мгу») более приоритетно, чем вхождение расширения (даже полного написания, как «московский государственный университет») — хотя другие факторы могут оказаться сильнее точного совпадения.

Мы стараемся подсвечивать в сниппетах [17] не только слова запроса, но и все используемые синонимы, что помогает пользователю понять, почему он видит тот или иной документ.
Как определить, какие расширения уместны для данного запроса, а какие нет; что именно, в каких случаях и в каком объёме добавлять? Чем больше видов расширений, тем сложнее построить алгоритм их замешивания. Обычно начинают с подобранной вручную логики ветвлений и коэффициентов, а когда их становится слишком много — ищут качественно другой способ. По нашему опыту, сложную логику не получается развивать уже после первого десятка факторов: становится слишком трудоёмко подбирать параметры, чтобы рост одного показателя качества не оборачивался сравнимым падением другого. Не так давно мы возложили решение этой задачи на машинное обучение, что позволило быстрее добавлять новые факторы и на 20% повысило вклад расширений в качество поиска. Получившийся механизм мы назвали «контекстной моделью».
Основные признаки, используемые для определения уместности расширения:
Для наиболее характерных запросов асессоры размечают, какие варианты синонимов будут хорошим расширением в данном контексте, а какие плохим. Ведь в каких-то случаях можно дополнять запрос максимально, а в каких-то только заведомо «непортящими» расширениями.
В результате контекстной фильтрации из всех расширений, возможных для всех слов запроса, остаётся 27% пар, которые уместны именно для данного запроса.

Есть несколько больших классов запросов, контекст которых делает неуместным большинство расширений:
Определение каждого класса «что нельзя расширять» также обеспечивается машинным обучением — на основе большого числа примеров от асессоров.
Проблема в том, что операции снятия неоднозначности и подбора синонимов под конкретное значение слова подвержены большой ошибке, сделать их точными крайне сложно. Поэтому мы расширяем из или в многозначное слово в единственном случае: когда оба синонима применяются в интернете в одних и тех же контекстах, а значит и смыслах.
Имена собственные требуют особой аккуратности. Если опираться только на контекстную близость, то «МТС» и «Билайн», «Google» и «Яндекс», «ВКонтакте» и «Facebook» ведут себя как синонимы. И в случае Билайна [20], и в случае МТС [21] пользователей интересуют одинаковые аспекты: «смс», «личный кабинет», «интернет», «тарифы», «роуминг». А при выборе сотового оператора они задают одинаковые запросы (тарифы, зона покрытия и т.п.), меняя только название компании — что неотличимо от классических переформулировок запроса синонимами.
Но примеры, в которых замена вроде «МТС» → «Билайн» действительно помогает лучше ответить на запрос пользователя, встречаются довольно редко. В подавляющем большинстве случаев такая замена не только не помогает, но и выглядит глупостью. Например:

(да простят нас коллеги за эту соринку — у себя мы интересного бревна не нашли)
Поэтому, когда дело касается имён собственных, мы стараемся сужать арсенал используемых расширений: транслиты и опечатки применяем без ограничений, а с синонимами действуем избирательно.
Полнота результатов поиска — вот главная цель современных расширений: быть устойчивым к неточностям в формулировке запроса и терпимым к неумению пользоваться поиском; находить нужное как можно чаще, даже в самых неочевидных случаях.
Очень упрощённо, поиск как процесс состоит из двух основных этапов: фильтрация и ранжирование. Фильтрация отбирает из индекса документы, сколько-нибудь полезные для заданного запроса, ранжирование упорядочивает их по релевантности.
Механизм расширений — ключевой участник этапа фильтрации. Расширения находят все возможные замены, и ранжирование умеет выбрать из них то, что действительно будет полезно пользователю.
Поэтому ключевой параметр качества механизма расширений — полнота словаря возможных замен. Ради неё мы готовы давать даже неграмотные расширения, если они помогают пользователю найти нужное. Например, «warkraft» — неканоническое название (правильно «Warcraft»), но какое-то время назад оно было очень распространено на геймерских форумах — и по некоторым запросам (вроде [варкрафт прохождение]) расширение «варкрафт» → «warkraft» позволяло найти то, что не удавалось найти без него.
Если расширение помогает найти нужное, нам не важна его «правильность», «грамотность» или «каноничность», даже академическая близость по смыслу к оригинальному запросу.

Мы надеемся, что расширения работают на то же благо, что и все остальные компоненты поиска. Собственный вклад расширений в совокупное качество поиска довольно существенный — он составляет несколько процентов. То есть, если очень сильно упрощать, в день несколько миллионов запросов к Яндексу получают качественный ответ исключительно благодаря расширениям. А тем или иным образом помогают в ответе они на 30% всего потока запросов в Яндекс, причём на 15% потока — дают ощутимое улучшение.
Автор: yurkennis
Источник [29]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/yandeks/39204
Ссылки в тексте:
[1] премудростях составления поискового запроса: http://help.yandex.ru/search/?id=1111313
[2] в слове «одноклассники»: http://clubs.ya.ru/company/replies.xml?item_no=18844
[3] Брич-Муллу, Брич-Муллою: http://yandex.ru/yandsearch?text=%D0%B1%D1%80%D0%B8%D1%87%D0%BC%D1%83%D0%BB%D0%B0%20%D1%82%D0%B5%D0%BA%D1%81%D1%82%20%D0%BF%D0%B5%D1%81%D0%BD%D0%B8&lr=213
[4] им. Огарёва: http://www.mrsu.ru/
[5] практическая транскрипция: http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%82%D1%80%D0%B0%D0%BD%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%86%D0%B8%D1%8F
[6] несколько стандартов перевода: http://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B0%D0%BD%D1%81%D0%BB%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B0%D0%BB%D1%84%D0%B0%D0%B2%D0%B8%D1%82%D0%B0_%D0%BB%D0%B0%D1%82%D0%B8%D0%BD%D0%B8%D1%86%D0%B5%D0%B9
[7] алгоритма Левенштейна: http://ru.wikipedia.org/wiki/%D0%E0%F1%F1%F2%EE%FF%ED%E8%E5_%CB%E5%E2%E5%ED%F8%F2%E5%E9%ED%E0
[8] «падонкаффский / олбанский йезыг»: http://ru.wikipedia.org/wiki/%C6%E0%F0%E3%EE%ED_%EF%E0%E4%EE%ED%EA%EE%E2
[9] словообразования: http://ru.wikipedia.org/wiki/Словообразование
[10] парадигму: http://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D1%80%D0%B0%D0%B4%D0%B8%D0%B3%D0%BC%D0%B0_(%D0%BB%D0%B8%D0%BD%D0%B3%D0%B2%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0)
[11] «гиперонимы»: http://ru.wikipedia.org/wiki/%D0%93%D0%B8%D0%BF%D0%B5%D1%80%D0%BE%D0%BD%D0%B8%D0%BC
[12] N-граммах: http://ru.wikipedia.org/wiki/N-%D0%B3%D1%80%D0%B0%D0%BC%D0%BC
[13] сервис машинного перевода: http://translate.yandex.ru
[14] параллельных текстах: http://ru.wikipedia.org/wiki/%C1%E8%F2%E5%EA%F1%F2
[15] перенаправление: http://ru.wikipedia.org/wiki/%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F:%D0%9F%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F
[16] асессоры: http://ru.wikipedia.org/w/index.php?title=%D0%90%D1%81%D0%B5%D1%81%D1%81%D0%BE%D1%80&stable=0#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.BF.D0.BE.D0.B8.D1.81.D0.BA_.D0.B8_SEO
[17] сниппетах: http://ru.wikipedia.org/wiki/%D0%A1%D0%BD%D0%B8%D0%BF%D0%BF%D0%B5%D1%82#.D0.A1.D0.BD.D0.B8.D0.BF.D0.BF.D0.B5.D1.82.D1.8B_.D0.B2_.D0.BF.D0.BE.D0.B8.D1.81.D0.BA.D0.BE.D0.B2.D1.8B.D1.85_.D1.81.D0.B8.D1.81.D1.82.D0.B5.D0.BC.D0.B0.D1.85
[18] любым: http://www.osp.ru/os/2013/02/13034553/
[19] омонимичные: http://ru.wikipedia.org/wiki/%D0%9E%D0%BC%D0%BE%D0%BD%D0%B8%D0%BC%D0%B8%D1%8F
[20] Билайна: http://wordstat.yandex.ru/?cmd=words&page=1&t=%D0%B1%D0%B8%D0%BB%D0%B0%D0%B9%D0%BD&geo=&text_geo=
[21] МТС: http://wordstat.yandex.ru/?cmd=words&page=1&t=%D0%BC%D1%82%D1%81&geo=&text_geo=
[22] pfound: http://romip.ru/romip2009/15_yandex.pdf
[23] Тезаурусные расширения в информационном поиске: http://www.slideshare.net/Tatiana.lando/query-expansion
[24] Query Expansion using Lexical-Semantic Relations: http://www.iro.umontreal.ca/~nie/IFT6255/voorhees-94.pdf
[25] Generating Query Suggestions: http://classes.soe.ucsc.edu/ism293/Spring09/material/papers/lec5/jones-www2006-generating-query-subs.pdf
[26] Context-based Quasi-Synonym Extraction: http://maroo.cs.umass.edu/pub/web/getpdf.php?id=882
[27] такого: http://storage.googleapis.com/books/ngrams/books/datasetsv2.html
[28] Query Reformulation Using Anchor Text: http://ciir-publications.cs.umass.edu/getpdf.php?id=900
[29] Источник: http://habrahabr.ru/post/187404/
Нажмите здесь для печати.