Статьи

Поиск по названию: когда релевантность только глубокая

Как пользователи считают, что статьи, книги и сообщения в блоге имеют отношение к тому, что они ищут? Как насчет вас? Если вы ищете статью о «Сократе», что может иметь отношение к вам?

Большая часть работы по поисковой релевантности с Solr или Elasticsearch направлена ​​на то, чтобы действительно углубиться в письменную прозу — тип, который встречается в основном тексте статей и книг. Чтобы определить, является ли документ релевантным, мы изучаем сложные модели скоринга, скрытое семантическое индексирование , обработку на естественном языке и другие методы, которые могут извлечь значение и метаданные из письменной прозы.

Это мощные методы. Но знаете ли вы, что часто действительно имеет значение? Часто это простые вещи. Иногда это просто так, например, упоминается ли наш поисковый термин «Сократ» в заголовке статьи. Заголовки много говорят о курируемом, опубликованном контенте.

Названия:

  • очень вдумчиво написано авторами,
  • наиболее краткое описание издания «о себе»,
  • написано намеренно, чтобы поймать целевую аудиторию, и
  • апеллировать к нашему крайне низкому уровню внимания

Таким образом, очень хороший поиск по названию очень помогает в релевантности поиска.

Большой! Проблема решена. Выполните поиск в поле «title», и мы закончили, верно?

Не совсем.

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

Частота термина не имеет значения, но соответствие фразы

Какая статья о Сократе более актуальна?

Socrates on Socrates

против

Socrates, a brief biography

Они оба, вероятно, примерно одинаковы. Обе статьи о Сократе. Сравните вашу интуицию об этих названиях с вашей интуицией в этих фрагментах основного текста.

Plato was pretty cool. Plato liked to party a lot. Sometimes with Socrates.

против

Socrates was kind of grumpy. Socrates didn’t like Plato

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

Мера того, как часто термин (то есть Сократ) упоминается в документе, известен как «частота термина» или TF для краткости. Термин частота является фундаментальной частью большинства алгоритмов ранжирования по релевантности. Поисковые системы Lucene, такие как Solr и Elasticsearch, используют термин «частота» в своей формуле оценки по умолчанию.

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

В случае поиска по названию, в моих опытах по настройке релевантности aboutness не коррелировал с частотой термина. Вместо этого достаточно просто упомянуть термин в названии, чтобы убедить нас в том, что заголовок, скорее всего, соответствует тому, что мы ищем. Заголовки не продолжаются многословно по предмету, подобному написанной прозе, они кратки и точны. Когда термин упоминается более одного раза, например, наша статья «Сократ о Сократе», это мимолетное процветание, не имеющее смысла для оценки результатов. Упоминание Сократа дважды не убеждает нас, что эта статья больше о «Сократе», чем статья под простым названием «Сократ».

Фраза соответствия

Сопоставление фраз, получение запроса из нескольких слов пользователя («Сократ на Сократе») и попытка найти именно эту фразу в названии, имеет огромное значение. Мы хотим поддержать пользователей, которые ищут точные названия или части названий.

Для поддержки этой формы запросов в поисковом индексе должна быть включена функция, известная как термины «позиции». Это говорит поисковой системе, такой как Solr или Elasticsearch, где отдельные термины в поле («Сократ на Сократе») связаны друг с другом. Вы можете представить, что они кодируются как Сократ {0,2} на {1} — обозначение «Сократ» встречается в позициях 0 и 2, а «вкл» — в положении 1. (посмотрите, как это на самом деле выглядит здесь ).

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

Фраза соответствия без термина частот

Как мы отмечали в нашем последнем разделе, наш идеальный поиск по названию отключает термины частоты при оценке, но использует сопоставление фраз. К сожалению, ни Solr, ни Elasticsearch не имеют возможности активировать позиции при отключении частот термина. Параметры Elasticsearch описаны здесь , они позволяют настроить поле с:

  • Freqs (номера документов и частоты терминов),
  • позиции (номера документов, термины частоты и позиции)

Точно так же в схеме Солра вы можете

  • omitPositions
  • omitTermFreqsAndPositions

Нам нужен «omitTermFreqs» при сохранении позиций. Похоже, что это не особенность, и действительно, как отметил мой коллега Питер Диксон-Мозес, похоже, что он связан с тем, как организован базовый индексный API Lucene .

Решения?

Часто цитируемое решение — написать собственный плагин Lucene Similarity . Класс сходства Lucene определяет правила того, как точно рассчитывается TF или другая статистика ранжирования из данных, хранящихся в индексе. Вы по-прежнему включали бы частоты терминов при индексации своих полей, но когда дело дошло до их использования, вы бы взломали вычисление и вместо этого вернули 1.0. Вы можете написать действительно простой Java-код и вернуть все, что вы хотите для этой статистики.

public class NoTfSimilarity extends DefaultSimilarity {

    public float tf(float freq) {
        return 1.0f;
    }
}

(затем аналогичным образом включите это сходство для вашего поля в Solr или Elasticsearch )

Не всем нравятся плагины Java. Я стараюсь избегать их, если у меня нет явной необходимости, которую я не могу решить с помощью внешнего API. Поэтому другое решение, которое я использую, — просто определить два поля:

  • notf_title (поле заголовка, сконфигурированное с отключенными терминами частот и позиций)
  • фраза_титла (поле заголовка с включенными частотами / позициями для сопоставления фразы)

Обработчик Solis для edismax позволяет мне указать поля для обычного сопоставления / оценки однократных запросов и другие поля для простого сопоставления фраз. С Solr я мог бы сделать:

q=”Socrates on Socrates”
qf=notf_title
pf=phrase_title

Query DSL от Elasticsearch позволяет мне явно заявить

{
    "query": {
        "match_phrase": {
            "phrase_title": ”Socrates on Socrates”
        }
        “match”: {
             “notf_title”: : ”Socrates on Socrates”
        }
    }
}

Работая с DSL запросов Solr или Elasticsearch и применяя соответствующие усиления и веса к обоим запросам, мы можем настроить, какое влияние мы хотим получить от частот терминов по сравнению с фразами.

Далее: Знай свой пантеон — ИДФ, нормы и сохранение ключевых слов с названиями

Знай свой пантеон — ИДФ, нормы и сохранение ключевых слов с названиями

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

Поиск: Кем был Платон? Результаты: — Кем был Фалес? — Кто такой Сократ? — Кем был Аристотель? -… (50 результатов позже) — Кто такой Даг Тернбулл? — Платон: Биография

Что пошло не так? Почему результат Платона так низок в наших результатах поиска?

Можно подумать, что «Платон» довольно специфичен. Однако для нашего поля заголовка выясняется, что поиск «Платон» менее значим в рейтинге релевантности, чем поиск «Кто». Это происходит из-за того, что называется частотой обратных документов (IDF), и из-за того, что это имеет тенденцию работать странным образом с полями заголовка.

Что такое частота обратных документов? В то время как частота терминов говорит нам о том, как часто термин встречается в определенном документе, другая статистика, «Обратная частота документа» (IDF), говорит нам о том, как редко термин встречается во всех документах.

IDF имеет значение, потому что он помогает нам измерить, насколько относительно важен поисковый термин в документе по сравнению с другими соответствующими документами в корпусе. Например, если Сократ упоминается в двух документах, у нас есть представление, что в одной из этих статей содержится примерно 50% доступных упоминаний о Сократе. Если мы представим больше статей Сократа — скажем, еще два документа, вдруг наш оригинальный документ представляет меньшую долю всех Сократов — 1/4 или 25% из них. Внезапно наш оригинальный документ не оценивается так высоко.

Что еще более важно для нас, когда наш запрос содержит несколько поисковых терминов «Кем был Платон», относительная IDF (опять же, редкость чтения) каждого термина играет свою роль. В нашем гипотетическом поле «тело» Платон очень редко встречается в письменной прозе по сравнению с «кто», поэтому совпадения на «Платоне» доминируют в рейтинге. Английская проза имеет тенденцию следовать некоторым общим статистическим моделям. Однако с нашим полем заголовка оказывается, что «Платон» является очень распространенным (тысячи статей, написанных о Платоне), а «Кто» чрезвычайно редок (очень мало статей с «Кто» в заголовке). Опять же, мы не видим нормального образца английской прозы в нашем поле заголовка — основополагающая интуиция за этой статистикой не совсем поддерживается. Другими словами, заголовки являются статистическим выбросом, и нам необходимо пересмотреть некоторые предположения.

Как мы это исправим? Построй Пантеон.

Является ли IDF бесполезным для полей заголовка? Нет, не совсем, но это требует от нас тщательно составить список терминов, которые, вероятно, будут написаны в нашем домене, чтобы создать значимый IDF. Что я имею в виду под этим? Хорошо в контексте философии, собственно имена, такие как «Платон» и «Аристотель», очевидно, в нем. Важно также привлечь немного более неясных философов, таких как «Эразм Дарвин». Мы также включили бы другие важные темы, такие как «эпистемология» — все важные философские жаргоны, темы и другие существительные, о которых статьи будут написаны в нашем корпусе.

Я называю этот список понятий нашим «Пантеоном». Список тем в нашем домене, профессионально куратором которых являются эксперты домена. На самом деле создание такого списка может занять много времени — но для многих областей большая часть работы сделана для вас. Например, в медицине, есть словарь MeSH, который пытается охватить все, что может быть написано в медицине. Для других доменов может быть возможно создать такой список самостоятельно или использовать методы НЛП.

Мы можем использовать наш пантеон вместе с KeepWordsFilter, чтобы создать еще одно поле поиска для использования в нашем поиске. Мы можем создать список «держать слова», который содержит термины в нашем пантеоне. Только термины в нашем списке попадают в поисковый индекс. Мы можем назвать это поле pantheon_title. Например, когда анализируется следующий заголовок, чтобы войти в индекс:

  • Кто такой Сократ

мы удалим все термины, кроме тех, что в нашем пантеоне:

  • Сократ

Точно так же название

  • Сократ и Платон о метафизике

Можно свести к этим трем членам нашего пантеона:

  • Сократ Платон Метафизика

Теперь IDF можно использовать в этом новом поле, чтобы помочь нам. Теперь IDF рассказывает нам о том, как часто пишут темы в нашем списке ценных терминов. Сократ будет очень распространенным термином в нашем новом поле заголовка, во многих полях pantheon_title упоминается «Сократ». Однако Эразма Дарвина не так уж и много. Поисковая система может использовать IDF, чтобы узнать, какими редкими (и, следовательно, насколько высоко оцененными) должны быть названия, соответствующие Erasmus Darwin.

Кроме того, мы отфильтровали ненужные слова. Если я буду искать «Кто такой Сократ», мы получим что-то ближе к желаемому поведению, так как будем искать область, в которой вычеркнуты все слова, имеющие мало общего с философией. Для произвольных текстовых «нежелательных» слов (так называемых стоп-слов), как правило, можно оставить, так как они настолько распространены, что оказывают незначительное влияние на оценку. Однако здесь мы должны удалить их именно потому, что поисковой системе не хватает данных, чтобы понять, что они являются ненужными в IDF.

С этим новым полем мы можем положиться на него в нашем решении поиска названия. Отдавая ему предпочтение по сравнению с простыми текстовыми заголовками. Для Solr это означало бы калибровку весов, чтобы придать больший акцент pantheon_title, полагаясь только на notf_title как последнее средство:

qf=pantheon_title^100 notf_title
pf=title

С Elasticsearch мы могли бы использовать multimatch запроса DSL для соответствующего повышения:

{
    "query": {
        "match_phrase": {
            "phrase_title": ”Socrates on Socrates”
        }
        “multi_match”: {
            “query” : ”Socrates on Socrates”
           “fields”:  [“notf_title”, ”pantheon_title^100”]
        }
    }
}

Применяются обычные предостережения о выборе правильного усиления дисмакса.

Получить не более конкретный, чем запрос

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

Поиск: Сократ Результаты: 1. Какова связь Сократа и Платона, когда дело доходит до различий во взглядах на гипердомальную метафизику? 2.… 50. Сократ Био

Обычно по моему опыту, когда пользователи ищут «Сократ», они хотят получить общий результат — биографию или общую статью, которая охватывает поисковый запрос. Только когда пользователи станут более конкретными, они захотят погрузиться в более конкретные темы. При прочих равных условиях вы не хотите быть более конкретным, чем запрос пользователя.

Это поведение связано с тем, что в поисковых системах на основе Lucene известно как «нормы». Нормы смещения результатов поиска для более коротких фрагментов текста. Это можно рассматривать как уклон в сторону плотности. Рассмотрим эти две прозы о Сократе

Socrates was a philosopher. Everybody loves Socrates.

против

Socrates partied all the time. He partied with Plato.
He also partied with ...
...
Socrates was the coolest philosopher ever.

Эти два фрагмента прозы содержат два упоминания нашего поискового термина «Сократ». Поисковые системы склонны смещать результаты поиска к документам, где больший процент текста содержит поисковый запрос. Другими словами, результаты поиска смещения к более коротким полям. В нашем примере первый фрагмент будет оценен более высоко, чем второй.

С нашим полем заголовка и, что более важно, с полем pantheon_title, мы можем использовать нормы для соответствующего эффекта. Если наш поисковый термин просто «Сократ», на первом месте стоят более короткие версии pantheon_title, которые просто содержат «Сократ». Дополнительные важные понятия в нашем поле pantheon_title приводят к тому, что документ несколько наказывается в рейтинге релевантности. Мы можем увидеть это, если разберем наши названия:

title: Каковы отношения между Сократом и Платоном, когда дело доходит до различий во взглядах на гипердомальную метафизику? pantheon_title: Сократ, Платон, гипердомальная метафизика

название: Сократ Био pantheon_title: Сократ

С учетом норм мы сместимся в сторону более короткого соответствующего поля pantheon_title. Мы получим точно такой же конкретный запрос, как и пользовательский, не больше и не меньше. Мы получаем более разумный рейтинг:

  1. Сократ на Сократ
  2. Сократ Био
  3. Каковы отношения между Сократом и Платоном, когда дело доходит до различий во взглядах на гипердомальную метафизику?

Только пользователь, добавив «Платон» и / или «гипердомальную метафизику» к своему поисковому запросу, сможет подтянуть более конкретный заголовок в наших результатах поиска.

К счастью для нас, Solr и Elasticsearch включают нормы по умолчанию. Тем не менее, это часто цитируемая оптимизация для отключения норм. Поэтому, если вы оказались в затруднительном положении, когда результаты вашего заголовка гораздо более конкретны, чем вы хотели бы, обязательно включите настройку в своем поле. Для Solr это настройка omit_norms . Elasticsearch предоставляет этот параметр через API сопоставлений .

Это только строительные блоки

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

Работать со своим пантеоном может быть сложно — рассмотрим пантеон, полный многозначных фраз. Будет ли поисковая система рассматривать их так же, как отдельные термины? Как насчет вложенных понятий, таких как эти два:

  • гипердомальная метафизика
  • метафизика

Как к ним относятся? Нужно ли нам больше, чем просто KeepWordsFilter, чтобы захватить их? Должны ли мы разрабатывать полевые нормы для рассмотрения этих избыточных концепций, а не наказывать за связанные концепции? Как насчет синонимов между этими понятиями? Как эти факторы будут учитываться в нормах, ЦАХАЛе и частоте терминов?

Вот еще одна загадка: если вместо словаря у нас есть онтология — набор связанных понятий — можем ли мы использовать понятие, что несколько понятий связаны между собой? Можем ли мы использовать тот факт, что у нас нет ничего о «гипердомальной метафизике», чтобы показать результаты по родительскому понятию «метафизики»?

И это только одна важная часть хорошего решения релевантности. Как насчет этой прозы в тексте? Как насчет наслоения других положительных сигналов релевантности, таких как отслеживание и использование метрик использования пользователей?

Короче говоря, актуальность — это тяжелая работа! Но в OpenSource Connections нам это нравится! Свяжитесь с нами, если вы хотите, чтобы этот уровень детализации применялся к вашему поиску. И проверьте Quepid , наш тестер регрессии релевантности и его младшую сестру Splainer, если вам нужна помощь с настройкой поиска!