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

Здравствуйте, любители НЛП! Большинство поисковых систем в настоящее время являются семантическими, что означает, что они не ограничиваются поиском только точных слов, но также могут рассуждать с синонимами и перифразами. В этой статье мы увидим, как создать небольшую семантическую поисковую систему с помощью SBERT. Наслаждаться! 😄

Что такое семантический поиск?

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

Как работает семантический поиск?

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

Популярной библиотекой для создания вложений из документов является sentence-transformers (она же SBERT, от Sentence BERT), в которой также есть утилиты для семантического поиска. Он предоставляет уже обученные модели для встраивания текста для более чем 100 языков и модели для встраивания изображений.

Давайте сделаем быструю демонстрацию с набором данных 190k+ Medium Articles от Kaggle.

Подготовьте набор данных

После того, как мы настроили наш ключ API Kaggle в нашей среде, мы можем загрузить набор данных с помощью команды kaggle datasets download -d fabiochiusano/medium-articles, а затем распаковать его с помощью unzip medium-articles.zip. Теперь вы должны увидеть файл medium-articles.csv.

Каждая строка в данных — это отдельная статья, опубликованная на Medium. Для каждой статьи у вас есть следующие функции:

  • title [string]: название статьи.
  • text [string]: текстовое содержимое статьи.
  • url [string]: URL-адрес, связанный со статьей.
  • авторы [список строк]: авторы статьи.
  • timestamp [string]: дата и время публикации статьи.
  • теги [список строк]: список тегов, связанных со статьей.

Установите библиотеку преобразователей предложений

Во-первых, давайте установим библиотеку sentence-transformers.

Затем мы импортируем sentence-transformers и pandas, так как нам нужно будет загрузить данные в кадры данных.

Теперь мы можем загрузить набор данных в кадр данных pandas и загрузить модель встраивания all-MiniLM-L6-v2. В наборе данных около 190 тысяч статей.

Далее мы объединяем заголовки и тексты статей, получая corpus, над которыми будет работать наша поисковая система. Затем текстовый корпус передается в модель для встраивания, в результате чего для каждого документа создается 384-мерный вектор. При использовании стандартного графического процессора кодирование 190 тыс. статей должно занять около 10 минут.

Теперь мы готовы встроить запрос и искать похожие векторы! Попробуем с запросом Искусственный интеллект и блокчейн. Функция util.semantic_search() эффективно извлекает top_k записей корпуса с наибольшим косинусным сходством по отношению к встроенному запросу.

Функция выполняется за какие-то десятые доли секунды. Обратите внимание, что извлеченные статьи не обязательно содержат точные слова в поисковом запросе, но их заголовок и текст семантически аналогичны тексту запроса.

Следующие шаги

Возможные следующие шаги:

Спасибо за чтение! Если вы хотите узнать больше о НЛП и науке о данных, не забудьте подписаться на NLPlanet на Medium, LinkedIn, Twitter и присоединиться к нашему новому Discord server!