Статья Практическое применение SBERT для поиска семантически близких предложений

devqp

Специалист
В современной обработке естественного языка (NLP) для сравнения текстовых данных широко применяются нейросетевые модели. Рассмотрим практическую реализацию семантического поиска с использованием русскоязычной модели sberbank-ai/sbert_large_nlu_ru.

Принцип работы:
1. Модель преобразует текст в эмбеддинги — числовые представления в многомерном пространстве (матрица 128 векторов по 768 значений каждый).
2. Семантическое сходство определяется через косинус угла между векторами эмбеддингов. Значение близкое к 1 указывает на высокую смысловую близость предложений.

Реализация на Python:
Установите зависимости и загрузите модель:
Код:
pip install sentence_transformers
from sentence_transformers import SentenceTransformer, util

ce_rerank = SentenceTransformer('sberbank-ai/sbert_large_nlu_ru')

Функция для ранжирования предложений по сходству с запросом:
Код:
def rerank(question, passages, include_rank: int = 10):
    d = {}
    return_list = []
    
    # Генерация эмбеддингов
    query_embedding = ce_rerank.encode(question)
    passage_embedding = ce_rerank.encode(passages)
    
    # Расчет косинусной схожести
    a_list = util.cos_sim(query_embedding, passage_embedding).tolist()[0]
    
    # Сопоставление предложений с оценкой сходства
    for n in range(len(passages)):
        d[passages[n]] = a_list[n]
    
    # Сортировка по убыванию
    sorted_tuple = sorted(d.items(), reverse=True, key=lambda x: x[1])
    
    # Формирование топ-N результатов
    counter = 0
    for n in sorted_tuple:
        if counter < include_rank:
            counter += 1
            return_list.append(n[0])
    return return_list

Пример использования:
Код:
question = "почему птицы не летают?"
passages = ["Нелетающие птицы — птицы, утратившие способность к полёту...", 
           "Способность к полёту теряли многие группы птиц..."]

result = rerank(question, passages)

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