Вариант использования поиска информации в изображениях и тексте

Здравствуйте, добро пожаловать в мой второй пост в блоге. В этом посте я хочу написать то, чем я поделился, когда меня пригласили в качестве приглашенного лектора в Университет Индонезии на курс Advanced Information Retrieval. Я поделился несколькими идеями реализации информационного поиска, которые можно использовать в реальном мире.

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

Так что приятного чтения моего поста :).

Введение

Поиск информации (IR) — это процесс извлечения соответствующих ресурсов из коллекции самих ресурсов. Одной из популярных и широко используемых реализаций информационного поиска является поисковая система, такая как Google, Bing и DuckDuckGo. Они получают запрос от пользователя и возвращают соответствующие документы в соответствии с самим запросом.

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

Я поделюсь некоторыми основными инструментами и алгоритмом реализации поиска информации с помощью NLP и Image. Это «Автоматическое извлечение заказов» и «Поиск изображений для веб-сайта изображений». Я также предоставлю информацию о полезности каждого примера.

Автоматическое извлечение заказов

Автоматическое извлечение заказов – это сервис для автоматического извлечения и анализа входящих сообщений о заказах. Например, продавец одежды развертывает этот сервис в приложении для обмена сообщениями (мы можем назвать его chatbot) и автоматически извлекает необходимую продавцу информацию. Затем извлеченная информация используется для обработки транзакции. Посмотрите ниже пример:

[BUYER]: 
Hi, here is my order:

Name: **Si Meong** <NAME>
Address: **Meow Meow Street** <ADDRESS>

Order:
**1** <Product Quantity> **T-Shirt Meow** <Product Name>

Thank you!

Regards,

Customer

** — извлеченная информация, а < > — тег извлеченной информации

Почему эта реализация важна?

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

Как и что сделать, чтобы это реализовать?

Один из обычных простых и распространенных методов автоматизации — использование шаблона. Например:

Name: <NAME>
Address: <ADDRESS>
Order:
<Product Quantity> <Product Name>

Его можно легко реализовать с помощью метода регулярных выражений (Regex). К сожалению, есть некоторые недостатки в его использовании:

  1. Жесткий, пользователь должен разместить свое сообщение в соответствии с шаблоном. Из-за опечатки или любой дополнительной информации служба не сможет извлечь информацию.
  2. Опечатка в названии продукта сделает продукт необнаруженным и не сможет быть извлечена.

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

Конечная реализация

Обычно служба развертывается за серверной службой, как показано ниже:

Здесь мы сосредоточимся только на службе ИИ и вернем извлеченную информацию.

Для сервисов ИИ это выглядит так:

Ниже приведен пример входа в сервис.

[BUYER]: 
Hi, here is my order:

Name: **Si Meong** <NAME>
Address: **Meow Meow Street** <ADDRESS>

Order:
**1** <Product Quantity> **T-Shirt Meow** <Product Name>
**4** <Product Quantity> **Shoet Moew** <Product Name>
Thank you!

Regards,

Customer

Мы предполагаем, что Shoet Moew нет в списке товаров, а похожими являются Shirt Moew и Short Moew.

Переданная информация (в формате JSON)

{
  "name": "Si Meong",
  "address": "Meow Meow Street",
  "order": [
    {
      "qty": 1,
      "product_name": "t_shirt_meow"
    }
  ],
  "suggest": [
    {
      "query": "Shoet Moew",
      "qty": 4,
      "suggest": ["shirt_moew", "short_moew"]
    }
  ]
}

Во-первых, мы углубимся в детали NER.

Распознавание именованных объектов (NER)

Описание NER можно увидеть ниже.

«Распознавание именованных сущностей (NER) — это задача пометки сущностей в тексте их соответствующим типом». — paperswithcode.com

Выходные данные NER извлекли объект, который нам нужен. например:

  1. Имя
  2. Адрес
  3. Банк
  4. Примечание
  5. наименование товара
  6. Количество продукта
  7. Номер телефона

В приведенном выше примере мы извлекаем только имя, адрес, количество продукта и имя.

Учебный NER: данные

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

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

Вы можете написать код для создания синтеза данных, использовать библиотеку синтеза данных или использовать контекстно-свободную грамматику (CFG) для их создания. Если вы используете CFG, вы можете использовать пакет nltk в Python. Он имеет инструмент CFG.

Обучение NER: Модель

Нам нужна модель, которая может обобщить извлечение сущностей на основе предоставленных данных. В настоящее время популярным подходом в машинном обучении является использование модели глубокого обучения. В НЛП популярны предварительно обученные модели, такие как BERT или ROBERTA. Что нам нужно сделать, так это снова обучить предварительно обученную модель данным (мы называем это fine-tune)..

Для индонезийских данных вы можете использовать модель IndoBERT или IndoNLU и обучить их своим данным. Это позволит получить модель отличного качества. Вы можете найти их на Huggingface и настроить модель под свои данные.

Поиск информации: elasticsearch

Одним из популярных методов поиска информации в тексте является elasticsearch. Это средство поиска информации, созданное на основе Apache Lucene и оптимизированное для выполнения задач поиска.

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

В этой задаче у нас проблема с опечаткой. Таким образом, точное совпадение не подходит. К счастью, в эластичном поиске есть fuzzy query, которые могут решить проблему опечаток. Он будет использовать алгоритм расстояния Левенштейна для расширения термина в запросе. Более подробно вы можете прочитать на этой странице википедии.

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

Резюме автоматического извлечения заказов

Мы используем модель NER для извлечения сущностей из сообщения. Затем используйте инструмент IR (elasticsearch), чтобы сопоставить продукт со списком товаров продавца.

Вот пример ответа чат-бота на основе приведенного выше ввода:

[RESPONSE]:

Here is your biodata:
Name: Si Meong
Address: Meow Meow Street

Order:
1 x T shirt Meow = IDR 2.000.000
"Shoet Moew" is not found, did you mean "Shirt Moew", "Short Moew"?

Поиск изображений

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

Почему эта реализация важна?

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

Как и что сделать, чтобы это реализовать?

Нам нужно реализовать систему IR, которая может извлекать изображения, используя изображение в качестве запроса. Для этого мы можем использовать знания Computer Vision. Нам нужно представить изображение во что-то, что можно использовать в качестве входных данных для оценки сходства. В системе IR есть термин Модель векторного пространства, в котором вы представляете документы (в данном случае изображения) в виде векторов весов. Итак, нам нужно что-то для представления изображения в векторе.

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

Вот конвейер службы ИИ:

Мы углубимся в детали для каждого из них

Модель извлечения

Как я сказал выше, мы используем модель для представления изображения в виде вектора. Существует множество предварительно обученных моделей компьютерного зрения, таких как VGG-net, Resnet, Eff-net и VIT. Мы можем использовать один из них без повторной тонкой настройки и вывести вектор. Вот пример:

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

Извлечение изображений в действии

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

Вы извлекаете вектор из запроса вашего изображения. Вы также делаете это со своими изображениями в базе данных.

Наконец, оцените сходство между изображениями с каждым из изображений в вашей базе данных.

Чтобы оценить сходство, мы можем использовать хороший открытый исходный код. Называется фейс.

Поиск схожести: faiss

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

Эффективность Файсса: разбиение на ячейки Вороного и квантование

Эти две функции доступны на Faiss для эффективной работы. Первый — это возможность разделять или кластеризовать ваши векторы в вашей проиндексированной базе данных в ячейки Вороного. Он группирует ваши данные в k кластеров. Когда вы делаете запрос, вы сравниваете векторы со всеми центроидами (центрами) точек кластеров. Затем вы берете n кластеров и выполняете полный поиск данных в n кластерах. Пользователь выбирает n и k. См. ниже иллюстрацию клеток Вороного.

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

Приведенные выше картинки и пояснения взяты из этого блога (спасибо за потрясающую иллюстрацию). Не стесняйтесь посетить его для более подробной информации.

Заключение

Я написал 2 реализации, используя поиск информации по тексту и изображениям. Здесь можно использовать популярные инструменты, такие как elasticsearch и faiss. Есть изящные трюки, которые эти инструменты должны сделать для эффективного поиска. Мы можем использовать их для развертывания IR-системы в производстве.

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

Не стесняйтесь комментировать или спрашивать меня об этом посте ниже.

Примечание

Этот пост перепостован из моего блога: https://haryoa.github.io/posts/example-ir-systems/. Не стесняйтесь посетить его!