Статья Сравнение смысловой близости текстов с помощью SBERT: практическое руководство

devqp

Специалист
Рассмотрим применение нейронных сетей для сравнения смысловой близости предложений с использованием русскоязычной модели SBERT от Сбербанка. Модель преобразует текст в числовые представления (эмбеддинги) и вычисляет косинусное сходство между векторами для оценки семантической похожести.

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

Практическая реализация:
1. Установите библиотеку и загрузите модель:
Код:
pip install sentence_transformers
from sentence_transformers import SentenceTransformer, util
model = SentenceTransformer('sberbank-ai/sbert_large_nlu_ru')

2. Функция для ранжирования предложений по сходству с запросом:
Код:
def find_similar_sentences(question, passages, top_n=10):
    query_embed = model.encode(question)
    passage_embeds = model.encode(passages)
    
    similarities = util.cos_sim(query_embed, passage_embeds).tolist()[0]
    scored_passages = list(zip(passages, similarities))
    
    sorted_passages = sorted(scored_passages, key=lambda x: x[1], reverse=True)
    return [text for text, _ in sorted_passages[:top_n]]

3. Пример использования:
Код:
query = "почему птицы не летают?"
sentences = [
    "Нелетающие птицы — птицы, утратившие способность к полёту в процессе эволюции.",
    "У нелетающих птиц крылья редуцированы или малы относительно массы тела.",
    "Полёт — основной способ передвижения большинства птиц."
]

result = find_similar_sentences(query, sentences)
print(result)

Готовый пример доступен в Google Colab. Для работы требуется знание Python и установленные зависимости.