Используйте библиотеку преобразователей предложений, чтобы за считанные минуты реализовать систему семантического поиска.
Здравствуйте, любители НЛП! Большинство поисковых систем в настоящее время являются семантическими, что означает, что они не ограничиваются поиском только точных слов, но также могут рассуждать с синонимами и перифразами. В этой статье мы увидим, как создать небольшую семантическую поисковую систему с помощью 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
записей корпуса с наибольшим косинусным сходством по отношению к встроенному запросу.
Функция выполняется за какие-то десятые доли секунды. Обратите внимание, что извлеченные статьи не обязательно содержат точные слова в поисковом запросе, но их заголовок и текст семантически аналогичны тексту запроса.
Следующие шаги
Возможные следующие шаги:
- Прочтите шпаргалку по преобразователям предложений.
- Читайте про 11 популярных моделей встраивания.
- Узнайте, как вычислить семантическое сходство предложений с помощью SBERT.
Спасибо за чтение! Если вы хотите узнать больше о НЛП и науке о данных, не забудьте подписаться на NLPlanet на Medium, LinkedIn, Twitter и присоединиться к нашему новому Discord server!