Sobes.tech
Back to questions
Middle
11

Как BERT улавливает семантическую схожесть между разными по написанию, но одинаковыми по смыслу предложениями?

Companies where asked
ЦифровыеПривычки

Answer from AI

sobes.tech AI

Что хотят услышать интервьюеры:

BERT понимает семантическую схожесть не по совпадению слов, а по контекстным эмбеддингам токенов. Он учитывает окружение каждого слова в предложении, поэтому близкие по смыслу фразы могут получать похожие векторные представления даже при разной формулировке. Для сравнения предложений обычно используют pooled-эмбеддинг, [CLS]-вектор или отдельные sentence-embedding модели на базе BERT.

Определение:

BERT — это трансформерная языковая модель, которая строит представление каждого токена с учетом всего предложения целиком. Благодаря двунаправленному контексту одно и то же слово в разных фразах получает разные векторы, а разные фразы с одинаковым смыслом могут оказаться близко в embedding-пространстве. Семантическая схожесть в этом случае определяется не буквальным совпадением текста, а близостью этих контекстных представлений.

Пример использования:

Например, фразы «Как пройти в центр?» и «Подскажите дорогу до центра» написаны по-разному, но смысл у них один. BERT преобразует каждую фразу в вектор, и затем по косинусной близости этих векторов можно понять, что предложения семантически похожи.

from transformers import AutoTokenizer, AutoModel
import torch
import torch.nn.functional as F

model_name = "bert-base-multilingual-cased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)

sentences = [
    "Как пройти в центр?",
    "Подскажите дорогу до центра"
]

inputs = tokenizer(sentences, padding=True, truncation=True, return_tensors="pt")

with torch.no_grad():
    outputs = model(**inputs)

# Берем [CLS]-вектор как простое представление предложения
sentence_embeddings = outputs.last_hidden_state[:, 0, :]

cos_sim = F.cosine_similarity(sentence_embeddings[0], sentence_embeddings[1], dim=0)
print(cos_sim.item())

Пояснение кода:

В этом примере код нужен, потому что речь идет о практическом способе сравнения предложений.

  1. Загружается токенизатор и модель BERT.
  2. Два предложения преобразуются в токены и подаются в модель.
  3. На выходе модель возвращает скрытые состояния для всех токенов.
  4. Берется вектор первого токена [CLS] как компактное представление предложения.
  5. Косинусная близость между двумя векторами показывает степень семантической схожести: чем выше значение, тем ближе смысл.

Ключевые моменты:

  • BERT сравнивает не строки, а контекстные векторные представления.
  • Один и тот же токен в разных предложениях может иметь разные эмбеддинги из-за контекста.
  • Для оценки схожести предложений обычно используют [CLS]-вектор или sentence embeddings.
  • Простая близость [CLS]-векторов — рабочий базовый подход, но для качественного semantic search часто используют модели, специально обученные на сравнение предложений.
  • BERT лучше улавливает парафразы и смысловые совпадения, чем модели, основанные только на bag-of-words или TF-IDF.