Нечеткий поиск для исправления ошибок и опечаток

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

Это упражнение по расширению запросов, которое создает совпадение по терминам, имеющим аналогичную композицию. При указании нечеткого поиска поиск поисковая система создает граф (на основе детерминированной конечной теории автоматона) аналогичных выражений для всех всех терминов в запросе. Например, если запрос содержит три термина "university of washington", граф создается для каждого термина в запросе search=university~ of~ washington~ (в нечетком поиске нет стоп-слов, поэтому "of" получает граф).

Граф может состоять из набора до 50 расширений (или перестановок) каждого термина, записывая как правильные, так и неправильные варианты в процессе. Затем подсистема возвращает наиболее актуальные соответствия в ответе.

Для термина, например "университет", граф может иметь "unversty, universty, university, universe, inverse". Все документы, соответствующие тем, которые отображаются в графе, включаются в результаты. В отличие от других запросов, которые анализируют текст для обработки различных форм одного и того же слова ("мыши" и "мышь"), сравнения в нечетких запросах берутся без изменений, без какого-либо лингвистического анализа текста. Слова "Универсал" и "Инверсия", которые семантически различаются, будут соответствовать друг другу, так как синтаксические расхождения невелики.

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

В службе "Поиск по искусственному интеллекту Azure":

  • Нечеткий запрос применяется ко всем терминам. Фразы не поддерживаются напрямую, но можно указать нечеткое совпадение для каждого термина многокомпонентной фразы с помощью и конструкций. Например, search=dr~ AND cleanin~. Это выражение запроса находит совпадения в "сухой очистке".

  • Расстояние изменение по умолчанию равно 2. Значение ~0 обозначает отсутствие расширения (только точный термин считается совпадением), но можно указать ~1 для одной степени различия или одного изменения.

  • Нечеткий запрос может расширить срок до 50 перемутов. Это ограничение не настраивается, но вы можете эффективно уменьшить количество расширений, уменьшая расстояние редактирования до 1.

  • Результаты состоят из документов, содержащих соответствующее совпадения (до 50).

Во время обработки запросов нечеткие запросы не проходят лексический анализ. Входные данные запроса добавляются непосредственно в дерево запросов и разворачиваются для создания графа терминов. Единственным выполненным преобразованием является нижний регистр.

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

Примечание.

Так как нечеткий поиск работает медленно, может быть целесообразнее рассмотреть такие альтернативы, как индексирование n-грамм, и наборы коротких последовательностей символов (два и три знака в последовательности символов для маркеров биграмм и триграмм). В зависимости от языка и области запроса, n-граммы могут работать производительнее. Компромисс заключается в том, что n-граммное индексирование занимает много места в хранилище и формирует намного более крупные индексы.

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

Строковые поля, которые атрибутируются как "доступные для поиска", являются кандидатами на нечеткий поиск.

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

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

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

Ниже приведен пример запроса, который вызывает нечеткий поиск. Он включает четыре термина, два из которых являются пропущенными:

POST https://[service name].search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2023-11-01
{
    "search": "seatle~ waterfront~ view~ hotle~",
    "queryType": "full",
    "searchMode": "any",
    "searchFields": "HotelName, Description",
    "select": "HotelName, Description, Address/City,",
    "count": "true"
}
  1. Задайте для типа запроса полный синтаксис Lucene (queryType=full).

  2. Укажите строку запроса, за которой следует каждый термин, оператор тильды (~) в конце каждого целого термина (search=<string>~). Граф расширения создается для каждого термина в входных данных запроса.

    Включите дополнительный параметр, число от 0 до 2 (по умолчанию), если требуется указать дистанцию изменения (~1). Например, "blue~" или "blue~1" вернет результаты с "blue", "blues" и "glue".

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

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

Если результаты неоднозначны, подсветка совпадений может помочь определить соответствие в результате.

Примечание.

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

Пример 1. Нечеткий поиск с точным термином

Предположим, что в поле "Description" в документе поиска существует следующая строка: "Test queries with special characters, plus strings for MSFT, SQL and Java."

Начните с нечеткого поиска по слову "special" и добавьте подсветку при совпадении в поле "Description":

search=special~&highlight=Description

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

"@search.highlights": {
    "Description": [
        "Test queries with <em>special</em> characters, plus strings for MSFT, SQL and Java."
    ]
}

Повторите запрос, прописав "специальный", выполнив несколько букв ("pe"):

search=scial~&highlight=Description

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

"@search.highlights": {
    "Description": [
        "Test queries with <em>special</em> characters, plus strings for MSFT, SQL and Java."
    ]
}

Попробуйте еще один запрос, дальнейшее изменение термина поиска путем вывода одного последнего символа в общей сложности трех удалений (от "специальные" до "scal"):

search=scal~&highlight=Description

Обратите внимание, что возвращается тот же результат, но теперь вместо "special" нечеткое соответствие имеет значение "SQL".

"@search.score": 0.4232868,
"@search.highlights": {
    "Description": [
        "Mix of special characters, plus strings for MSFT, <em>SQL</em>, 2019, Linux, Java."
    ]
}

В этом развернутом примере видно, что подсветка совпадений может привести к неоднозначным результатам. Во всех случаях возвращается один и тот же документ. Если вы использовали идентификаторы документов для проверки совпадений, вы могли упустить смену из "special" в "SQL".

См. также