Семантическая близость текстов – это мера того, насколько два отрывка текста похожи по смыслу, даже если они сформулированы разными словами. Традиционные подходы (например, сравнение общих слов или n-грамм) часто не улавливают тонкие нюансы значения и контекстной связи между предложениями. С появлением моделей на основе трансформеров (BERT, RoBERTa, GPT и др.) стало возможным вычислять семантическое сходство значительно точнее, учитывая контекст слов в предложении. В этой статье мы рассмотрим, как специализированные модели вроде Sentence-BERT (SBERT) и другие мультиязычные трансформеры позволяют измерять семантическую близость между текстами, как это работает и как реализовать такую оценку на Python.
Что означает семантическая близость текстов?
Под семантической (смысловой) близостью понимается не буквальное совпадение текста, а сходство значения высказываний. Например, фразы «Мне нравится смотреть фильмы» и «Обожаю киносеансы» сформулированы по-разному, но передают схожий смысл – поэтому их семантическая близость высокая. В отличие от этого, предложения «Кошка сидит на ковре» и «Программист пишет код» имеют совершенно разные темы, и их семантическая близость практически нулевая.
Современные методы оценки смыслового сходства, как правило, опираются на представление предложений в виде векторных эмбеддингов (dense embeddings). Сначала каждое предложение преобразуется моделью в фиксированный вектор чисел, представляющий его «смысл» в многомерном пространстве. Затем степень сходства оценивается с помощью метрик вроде косинусного сходства или евклидовой дистанции между этими векторами. Косинусное сходство широко используется: оно возвращает значение от -1 до 1 (или 0 до 1, если работать с ненормированными/нецентрированными данными), где 1 означает идентичный смысл, а 0 – отсутствие сходства. Таким образом, задача сводится к получению качественных эмбеддингов предложений, в которых семантически близкие тексты имеют близкие векторы.
Sentence-BERT: трансформеры для оценки смысла предложений
BERT (Bidirectional Encoder Representations from Transformers) произвёл революцию в NLP, показывая отличные результаты в понимании контекста слов. Однако изначально стандартный BERT предлагался для задач вроде классификации или вопросов-ответов и выдаёт эмбеддинги в основном на уровне токенов (отдельных слов или частей слов). Несмотря на наличие специального токена [CLS] для всего предложения, его выход без дополнительной настройки не особенно хорошо отражает общий смысл предложения. Кроме того, базовый BERT сравнивает два предложения через кросс-энкодер – то есть обрабатывает оба текста совместно через все слои модели для непосредственного предсказания сходства или отношения. Такой подход, хотя и точный, крайне неэффективен, если надо сравнить многие пары: для каждой пары запускать полный BERT слишком медленно на больших коллекциях текстов.
Sentence-BERT (SBERT) – решение, предложенное в 2019 году Нильсом Реймерсом и Ирене Гуревич, которое адаптирует BERT специально под задачи семантического сходства и поиска по смыслу. В SBERT используются сиамские нейросети на основе BERT: две копии одной и той же модели BERT генерируют эмбеддинги для каждого предложения отдельно, а затем эти эмбеддинги сравниваются (например, косинусно). Во время обучения SBERT оптимизируется так, чтобы расстояние между эмбеддингами отражало семантическую близость – для этого вводят специальные функции потерь (например, triplet-loss или MNR-loss), и модель fine-tune-тся на парах предложений с известной степенью сходства (например, в задачах Natural Language Inference или Semantic Textual Similarity). Таким образом, SBERT учится располагать похожие по смыслу предложения ближе друг к другу в векторном пространстве. В архитектуре SBERT часто добавляется слой пулинга над выходами BERT, чтобы получить единый вектор фиксированного размера для всего предложения – например, модель all-MiniLM-L6-v2 генерирует 384-мерный вектор, усредняя (mean-pooling) скрытые состояния токенов, и такой вектор хорошо отражает общее значение фразы.
Преимущества SBERT: после обучения мы можем заранее вычислить эмбеддинги для всех интересующих нас текстов и быстро сравнивать их друг с другом, вместо прогонки через BERT каждую пару. Это «би-энкодер» подход, который радикально ускоряет поиск похожих текстов по сравнению с кросс-энкодером. По сообщениям авторов, SBERT практически не уступает обычному BERT (который работает как кросс-энкодер) по точности на задачах оценки сходства, зато позволяет выполнять поиск на порядки быстрее. Благодаря этому SBERT стал популярным решением для семантического поиска, сравнения документов, кластеризации предложений и т.д., где требуется сравнить большое количество текстовых фрагментов.
Мультиязычные модели для семантической близости
Многие первоначальные реализации SBERT и подобных моделей были обучены в основном на англоязычных данных. Однако существуют версии и аналоги, способные работать с множеством языков, что особенно важно для многоязычных приложений. Мультиязычные трансформеры для эмбеддинга предложений обучены так, чтобы тексты разных языков с одним значением имели близкие векторные представления. Иначе говоря, такая модель проектирует предложения из разных языков в общий семантический векторный пространство. Например, английское предложение «Hello, how are you?» и его испанский перевод «Hola, ¿cómo estás?» лягут близко друг к другу в этом пространстве. Это позволяет напрямую сравнивать или искать схожие по смыслу тексты на разных языках, не прибегая к переводу и не обучая отдельную модель под каждый язык, что упрощает разработку многоязычных систем.
Примеры мультиязычных моделей:
- DistilUSE (Distilled Multilingual Universal Sentence Encoder) – серия моделей, полученных путем обучения (knowledge distillation) от универсального трансформера для нескольких языков. Модель distiluse-base-multilingual-cased-v1 поддерживает ~15 языков (английский, русский, китайский, немецкий, французский и др.) и была получена посредством distillation из Multilingual Universal Sentence Encoder. Версия v2 расширяет поддержку до 50+ языков (в том числе большинство европейских и распространенных азиатских языков).
- Multilingual MiniLM – облегченная многозычная модель из библиотеки SentenceTransformers. Например, модель paraphrase-multilingual-MiniLM-L12-v2 охватывает более 50 языков. Она является многозычным вариантом английской модели paraphrase-MiniLM-L12-v2 и обучена на параллельных текстах (переводах) на множестве языков. Такие модели эффективно сжимают знания больших мультиязычных трансформеров (как mBERT или XLM-R) в более компактную форму с сохранением способности понимать разные языки.
- LaBSE (Language-agnostic BERT Sentence Embedding) – модель от Google, обученная специально для получения языково-независимых эмбеддингов. LaBSE поддерживает 109 языков, используя пару энкодеров (dual-encoder) и контрастивный подход на параллельных фразах (переводах). Она отлично подходит для задач поиска переводных пар (bitext mining) – т.е. нахождения эквивалентных предложений на разных языках. Однако, согласно оценкам, LaBSE менее эффективна для сравнения предложений, которые не являются переводами друг друга. Для общего сравнения смыслового сходства неродственных фраз зачастую лучше показывают себя модели типа Multilingual MiniLM или DistilUSE.
Важно: хотя мультиязычные модели и стремятся унифицировать представление разных языков, их точность может различаться на разных языках. Качество эмбеддингов обычно высоко для языков, присутствовавших в обучающих данных, и чуть хуже для редких языков или тех, что сильно отличаются по структуре. Разработчикам стоит проверять результаты на целевом языке и при необходимости дообучать (fine-tune) модель на специализированных или одноязычных данных своей предметной области.
Реализация оценки сходства на Python
Рассмотрим практическую сторону: как вычислить семантическую близость текстов с помощью Sentence-BERT (или аналогичной модели) на языке Python. Для этого удобно воспользоваться библиотекой SentenceTransformers – она предоставляет простой интерфейс для загрузки предобученных моделей и получения эмбеддингов. Ниже представлен общий алгоритм и пример кода:
Установка библиотеки: установите пакет sentence-transformers (например, командой pip install sentence-transformers). Он включает готовые модели и утилиты для работы с ними.
Загрузка предобученной модели: выберите модель под ваши задачи. Для многоязычного сценария подойдет, например, модель “paraphrase-multilingual-MiniLM-L12-v2”, которая поддерживает 50+ языков и дает качественные универсальные эмбеддинги. Загрузка модели выполняется так:
from sentence_transformers import SentenceTransformer, util
model = SentenceTransformer(‘paraphrase-multilingual-MiniLM-L12-v2’)
Подготовка текстов: определите, какие тексты вы сравниваете. Например, target_text – это ваш текст (фрагмент или описание, для которого ищем похожие), а other_texts – список текстов для сравнения (например, описания топ-10 приложений из магазина по заданному запросу). Убедитесь, что они в нужном языке (или разных языках, если используете мультиязычную модель).
Получение эмбеддингов: передайте список текстов в модель для получения их векторных представлений:
target_text = “Описание вашего приложения …”
other_texts = [ “Описание приложения A …”, “Описание приложения B …”, … ]
# Кодирование (получение эмбеддингов):
embeddings = model.encode([target_text] + other_texts)
# embeddings[0] соответствует target_text, embeddings[1:] — списку описаний приложений
Под капотом модель токенизирует тексты, пропускает через нейронную сеть и применяет pooling, возвращая для каждого предложения вектор фиксированной размерности (например, 384-мерный для MiniLM модели).
Расчет сходства: для полученных эмбеддингов вычисляем косинусные сходства. Библиотека предоставляет функцию util.cos_sim для расчета косинусного сходства между двумя наборами эмбеддингов:
import torch
# Вычислим косинусное сходство между целевым описанием и каждым из топ-10 описаний:
cosine_scores = util.cos_sim(embeddings[0], embeddings[1:])[0] # ten scores
# Найдем самое похожее описание:
most_similar_idx = torch.argmax(cosine_scores).item()
print(“Наиболее похожий текст:”, other_texts[most_similar_idx],
“с коэффициентом”, float(cosine_scores[most_similar_idx]))
Функция cos_sim вернёт тензор коэффициентов сходства. В нашем примере cosine_scores будет содержать 10 чисел – по одному для каждого сравнения «ваш текст» vs «описания приложений». Эти значения могут быть, например, 0.78, 0.65, 0.90 и т.д. (чем ближе к 1.0, тем выше семантическое сходство). Выбирая максимальное значение, мы определяем, какое приложение имеет описание, наиболее близкое по смыслу к нашему тексту.
Интерпретация результатов: полученные коэффициенты сходства позволяют судить о том, насколько ваш текст концептуально пересекается с каждым из существующих описаний. Если одно из топ-10 описаний дало очень высокое сходство (скажем, >0.8), значит эти два текста почти эквивалентны по содержанию. Более низкие значения (например, 0.5–0.6) указывают на умеренное тематическое пересечение, а близкие к 0 – на отсутствие схожести в теме и идеях.
Пример: сравнение описания с описаниями приложений из топ-10
Предположим, вы разработали новое приложение и составили его описание. Вы хотите сравнить его с описаниями топ-10 популярных приложений по определенному поисковому запросу (в выбранном магазине приложений) – например, чтобы понять, используете ли вы похожие ключевые темы, или чтобы найти самые близкие аналоги вашего приложения.
Шаги решения: вы собираете тексты описаний этих 10 приложений и применяете описанный выше метод:
- Кодируете своё описание и описания конкурентов с помощью мультиязычного SBERT-моделя.
- Вычисляете косинусные сходства между вашим описанием и каждым из конкурентов.
- Сортируете результаты по убыванию сходства.
После этого вы получите ранжированный список: какие приложения наиболее схожи по смыслу с вашим. Например, вы можете обнаружить, что 3 из 10 описаний имеют высокий коэффициент >0.8 с вашим – вероятно, эти приложения относятся к той же категории и предлагают схожий функционал. Описания с низким сходством, напротив, могут относиться к иным категориях, даже если по поисковому запросу они появляются рядом (возможно, из-за широты запроса). Такой анализ может быть полезен для маркетинговых выводов: высокое сходство означает сильную конкуренцию в данном сегменте, а существенные отличия – возможность выделиться, либо признак того, что описание требует доработки, чтобы лучше отражать ожидаемые пользователями ключевые слова.
Важно подчеркнуть, что язык описаний при этом не принципиален – если, скажем, часть конкурентов имеет описания на английском, а ваше на русском, мультиязычная модель всё равно сможет сравнить их напрямую. Например, описание на русском «игра-головоломка с элементами дополненной реальности» может быть сравнимо с английским “augmented reality puzzle game”, и если речь про схожий функционал, модель выдаст высокий скор сходства, поскольку улавливает общий смысл вне зависимости от языка.
Возможности и ограничения подхода
Преимущества современных моделей для семантического сходства:
- Глубокое понимание контекста: в отличие от простых метрик, трансформеры учитывают контекст слов. Они способны понять, что «автомобиль» и «машина» – близкие понятия, даже без общих букв, и различить смысл одного и того же слова в разном окружении. Это существенно повышает качество оценки сходства текстов, особенно сложных по структуре или длине.
- Эффективность на больших данных: модели типа SBERT позволяют предварительно преобразовать тысячи и миллионы текстов в векторы и выполнять похожие на поиск операции очень быстро за счёт алгоритмов ближайших соседей в векторном пространстве. Это открывает возможность семантического поиска в масштабных корпусах (например, поиск документов по смыслу запроса) в реальном времени. Би-энкодерная архитектура гарантирует масштабируемость – добавление нового текста требует только единичного прохождения модели, без перерасчёта всех пар.
- Мультиязычность: существование универсальных моделей для множества языков упрощает создание многоязычных приложений. Один и тот же механизм работает для текста на русском, английском, китайском и т.д., помещая их в общее пространство признаков. Это очень полезно, например, для многоязычного поиска (когда запрос на одном языке нужно сопоставить с документами на другом языке) и для сравнения контента между разными локалями без перевода.
- Адаптивность: предобученные модели можно дообучить (fine-tune) под конкретную задачу или домен. Если у вас есть набор пар предложений с оценкой сходства или указанием эквивалентности/противоположности, вы можете обучить модель точнее отражать нужное вам понятие «близости». Например, для юридических текстов или медицинских описаний специализированное дообучение улучшит чувствительность модели к профессиональным нюансам.
Ограничения и возможные проблемы:
- Нюансы смысла: Метрики, основанные на косинусном сходстве эмбеддингов, в основном отражают тематическую близость. Они могут не уловить логические различия. Например, предложение «Мне нравится холодная погода» и «Мне не нравится холодная погода» различаются только частицей «не», поэтому модель эмбеддингов, вероятно, расположит их близко (ведь почти все слова совпадают) и даст высокий коэффициент схожести, хотя по смыслу эти высказывания противоположны. Таким образом, отрицания, сарказм, тонкие смысловые противоречия могут быть неразличимы для модели, обученной только на общую семантику. В таких случаях требуется либо специально обученная модель на распознавание тональностей/отношений (например, модель NLI для распознавания противоречий), либо комбинирование подходов.
- Ограничения длины: трансформеры имеют ограниченную длину входа (обычно порядка 512 токенов для BERT-основанных моделей). Если тексты очень длинные (например, длинные статьи или описания длиной в несколько тысяч символов), их нужно либо усекать до максимально допустимой длины, либо разбивать и агрегировать эмбеддинги. Усекание может приводить к потере части смысла, поэтому приходится учитывать это ограничение при работе с большими текстами.
- Разные языки и домены: хотя мультиязычные модели универсальны, их качество может быть неоднородным. Семантическая близость, рассчитанная моделью, наиболее надежна для языков и стилей, на которых модель обучалась. Для редких языков, жаргона, диалектов или узкоспециальных текстов (например, код, формулы, поэзия) модель может давать менее адекватные результаты. Например, модель, обученная в основном на новостях и веб-форумах, может не сразу «понять» юридические тексты или старинную лексику. Требуется проверка и, при необходимости, дообучение под нужный стиль/язык, как отмечалось выше.
- Интерпретация метрики: сам по себе коэффициент косинусного сходства – безотносительное число. “Высокий” или “низкий” – понятия относительные и зависят от контекста применения. В разных задачах порог похожести придётся подбирать экспериментально. Кроме того, иногда семантическая близость не равнозначна релевантности. Например, текст может быть очень похож по словам/темам, но в конкретной задаче не быть полезным (слишком общим или наоборот, избыточно подробным). Поэтому результаты эмбеддингов зачастую интегрируют в более широкий контекст: например, при поиске объединяют семантическое сходство с классическими методами (BM25, ключевые слова) или применяют вторую стадию rerank-моделей (кросс-энкодеров) для точной оценки топ-результатов.
- Ресурсы и производительность: Хотя использование би-энкодеров значительно ускоряет сравнение, сами трансформерные модели достаточно тяжелые. Получение эмбеддинга BERT-модели требует немалых вычислений, особенно без GPU. Для больших массивов данных может потребоваться кластер или специализированные сервисы (векторные БД вроде Milvus/FAISS) для эффективного поиска по вектору. Кроме того, хранение эмбеддингов для миллионов текстов – тоже задача, требующая оптимизации (однако существуют методы сжатия, квантования эмбеддингов, позволяющие уменьшить размер и ускорить сравнение с минимальной потерей качества).
Модели семейства Sentence-BERT и их мультиязычные варианты стали важным инструментом для понимания и сравнения текстов на уровне смысла. Они позволяют автоматизировать то, что ранее требовало сложного лингвистического анализа: находить сходство между фразами, даже если они сформулированы по-разному и даже на разных языках. Реализовав вычисление семантической близости через эмбеддинги и косинусное расстояние, можно решать прикладные задачи – от рекомендаций и кластеризации документов до анализа конкурентов на рынке приложений – более интеллектуально и точно. Тем не менее, важно помнить о границах применения этих моделей и при необходимости сочетать их с другими методами, чтобы учесть тонкости смысла и контекста, выходящие за рамки «обычного» семантического сходства.