Зачем нужны эмбеддинги?

от автора

Работая с прикладными задачами для больших языковых моделей (LLM), постепенно понимаешь, что большинство задач сводятся к двум основным целям:

  1. Структурирование неструктурированных данных: преобразование массивов текстов в структурированный формат, по которому можно будет проводить поиск.

  2. Преобразование пользовательских запросов: превращение неструктурированных запросов пользователя в структурированный формат, чтобы можно было искать в подготовленных данных.

Некоторые документы (например, таблицы) хорошо подходят для структурирования. Но есть и такие, как художественные тексты, которые сложно поддаются этой задаче. В таких случаях на помощь приходят эмбеддинги — векторные представления слов или даже целых предложений. В векторном пространстве чем ближе друг к другу находятся концепции, тем больше они похожи..

Что такое эмбеддинги?

Эмбеддинги позволяют представить слова или тексты в виде векторов в многомерном пространстве. Например, в недавнем исследовании мы использовали 368-мерное пространство, хотя могут применяться пространства с разным количеством измерений. Преимущество эмбеддингов в том, что они помогают находить схожие слова, даже если есть небольшие отличия в написании (например, орфографические ошибки или разные формы слова).

Преимущества и недостатки эмбеддингов

Плюсы эмбеддингов:

  • Учет синонимов и похожих понятий. Эмбеддинги позволяют находить не только точные совпадения, но и синонимы. Например, если в резюме указано, что человек знает TypeScript, то, вероятно, он также знаком с JavaScript, так как одно является подмножеством другого. В векторном пространстве такие понятия будут находиться рядом.

  • Корректное определение близости. Даже если слово написано немного иначе, можно использовать такие методы, как косинусное сходство или евклидову норму, чтобы определить их схожесть.

Минусы эмбеддингов:

  • Требовательность к ресурсам. Создание векторов — ресурсоемкий процесс, который требует значительных вычислительных мощностей и времени.

  • Большой объем данных. Векторные представления занимают много места (от 300 КБ до нескольких мегабайт на одно представление), что значительно увеличивает размер базы данных и время обработки больших массивов информации.

Другие методы поиска

Помимо векторных методов существуют и альтернативные подходы для определения похожести текстов:

  1. Расстояние Левенштейна — определяет количество изменений, необходимых для превращения одной строки в другую. Хорошо подходит для поиска схожих строк с небольшими отличиями, например, если допущена опечатка.

  2. Метод Soundex — превращает слова в код, основанный на звуках, что позволяет находить созвучные слова. Однако, Soundex плохо работает с кириллицей. Чтобы обойти это ограничение, можно использовать транслитерацию: перевести слово в латиницу, а затем применять Soundex.

  3. Алгоритм Daitch-Mokotoff — более продвинутый метод, который поддерживает кириллицу и также кодирует слова на основе их звучания.

Результаты исследования

Для одного из клиентов мы провели исследование, чтобы показать, как эмбеддинги помогают улучшить точность поиска. Мы сравнили несколько методов, таких как Soundex, Daitch-Mokotoff, и векторное представление.

Таблица сравнения разных методов сходства, отсортированная по эвклидову расстоянию

Таблица сравнения разных методов сходства, отсортированная по эвклидову расстоянию
  • word_a — исходное слово (обычно на русском)

  • word_b — слово для сравнения (обычно на английском)

  • transliterated_a — транслитерация word_a в латиницу

  • direct_similarity — прямое сравнение word_a и word_b (триграммы)

  • trans_similarity — сравнение транслитерированной версии с word_b

  • soundex_a — код Soundex для word_a

  • soundex_b — код Soundex для word_b

  • soundex_match — совпадение кодов Soundex (true/false)

  • soundex_trans_a — код Soundex для транслитерированной версии

  • soundex_trans_match — совпадение Soundex транслитерации с word_b (true/false)

  • dm_a — код Daitch‑Mokotoff для word_a

  • dm_b — код Daitch‑Mokotoff для word_b

  • dm_match — совпадение кодов Daitch‑Mokotoff (true/false)

  • dmt_match — совпадение Daitch‑Mokotoff с учетом транслитерации (true/false)

  • vector_cosine_sim — косинусное сходство векторов (1 = идентичны, 0 = различны) ()

  • vector_l2_sim — евклидово сходство векторов (1 = идентичны, 0 = различны)

  • trans_vector_cosine_sim — косинусное сходство после транслитерации

  • trans_vector_l2_sim — евклидово сходство после транслитерации

Для нормирования векторных матрик сходств использовались следующие формулы:

Нормализация метрик сходства

Для удобства сравнения различных методов мы нормировали метрики векторного сходства так, чтобы они находились в диапазоне от 0 до 1. Это позволяет проводить унифицированное сравнение с классическими алгоритмами, где 0 указывает на полное отсутствие сходства между строками, а 1 — на их полное совпадение. Для методов, использующих фонетическое кодирование (Soundex и Daitch‑Mokotoff), мы указываем результат как True или False, что показывает, есть ли полное совпадение между кодами.

Ниже приведены формулы и описание каждого метода:

1. Косинусное сходство (Cosine Similarity)

Для вычисления эмбеддингов, мы использовали модельall-MiniLM-L6-v2 из библиотеки sentence‑transformers. Это легкая и быстрая модель с размерностью эмбеддингов 384 (~3072 байт ополнительно к каждой переменной хранения).

Косинусное сходство измеряет угол между двумя векторами A и B и показывает, насколько они ориентированы в одном направлении. Чтобы нормировать это сходство в диапазоне от 0 до 1, применяется следующая формула:

\text{cosine_similarity}(A, B) = \frac{A \cdot B}{\|A\| \|B\|}\text{normalized_cosine_similarity}(A, B) = \frac{\text{cosine_similarity}(A, B) + 1}{2}

  • 0 — векторы противоположны (максимально разные).

  • 1 — векторы идентичны.

2. Евклидово сходство (Euclidean Similarity)

Евклидово расстояние измеряет физическое расстояние между двумя точками (векторами) в пространстве. Чтобы преобразовать это расстояние в значение сходства от 0 до 1, мы используем следующую формулу:

\text{euclidean_distance}(A, B) = \sqrt{\sum{i=1}^n (A_i - B_i)^2}\text{euclidean_similarity}(A, B) = \frac{1}{1 + \text{euclidean_distance}(A, B)}

  • 0 — векторы максимально удалены (разные строки).

  • 1 — векторы идентичны.

3. Расстояние Левенштейна (Levenshtein Distance)

Расстояние Левенштейна измеряет количество изменений (вставок, удалений, замен), необходимых для превращения одной строки в другую. Чтобы нормировать его в диапазоне от 0 до 1, используем следующую формулу:

\text{levenshtein_similarity}(A, B) = 1 - \frac{\text{levenshtein_distance}(A, B)}{\max(\text{len}(A), \text{len}(B))}

  • 0 — строки полностью разные (максимальное количество изменений).

  • 1 — строки идентичны (без изменений).

4. Метод Soundex

Soundex — это метод фонетического кодирования, который превращает текст в код, основанный на звуках. В таблице результат Soundex представлен как True или False, что показывает, совпадают ли фонетические коды двух строк:

 \text{soundex_match}(A, B) = \begin{cases} \text{True}, & \text{если Soundex_код(A) = Soundex_код(B)} \\ \text{False}, & \text{в противном случае} \end{cases}

  • True — строки фонетически совпадают.

  • False — строки фонетически разные.

5. Метод Дайча-Мокотоффа (Daitch-Mokotoff)

Daitch-Mokotoff — метод фонетического кодирования, который, в отличие от Soundex, поддерживает кириллицу и лучше подходит для многоязычных данных. В таблице также используются значения True и False для отображения совпадения кодов.

 \text{daitch_mokotoff_match}(A, B) = \begin{cases} \text{True}, & \text{если код Дайча-Мокотоффа(A) = код Дайча-Мокотоффа(B)} \\ \text{False}, & \text{в противном случае} \end{cases}

  • True — строки фонетически совпадают.

  • False — строки фонетически разные.

Эти методы и их нормализация позволяют сравнивать различные алгоритмы для определения сходства на единой шкале от 0 до 1 (или с использованием логических значений True и False для методов фонетического кодирования). Теперь, независимо от метода, мы можем единообразно трактовать результаты: 0 и False означают полное отсутствие сходства, а 1 и True указывают на полное совпадение.

Выводы

Сравнение разных графиков сходста

Сравнение разных графиков сходста

1. Сравнение различных методов: прямое сравнение, транслитерация, Soundex и Daitch-Mokotoff

Таблица демонстрирует, что для русского и английского слов, особенно если они написаны с небольшими вариациями, такие методы, как Soundex и Daitch‑Mokotoff, работают по‑разному. Например, для пар «Питон» и «Python» метод Soundex не выдает совпадение (они кодируются как P350 и J126), зато совпадение обнаруживается при транслитерации (код Soundex для транслитерированного слова «Piton» — P350, как и для «Python»). Это показывает, что использование транслитерации может значительно улучшить качество поиска в условиях многоязычности.

2. Сравнение с использованием векторных методов

Векторные методы, такие как косинусное и евклидово сходство, показывают более высокие значения сходства для некоторых пар слов, даже если другие методы (например, Soundex или прямое совпадение) не выдают точных результатов. Это видно в парах «Type Script» и «Java Script», «Ява‑скрипт» и «Java Script». Векторные методы помогают находить семантически схожие слова, которые трудно сравнить на основе прямого текстового сходства или фонетического кода. Это подтверждает, что векторные методы лучше подходят для поиска синонимов и смысловой близости, а не только точного совпадения.

3. Нюансы косинусного и евклидова сходства

Как видно из таблицы, значения косинусного и евклидова сходства различаются на шестом знаке после запятой. Например, пара «JS» и «Java Script» имеет косинусное сходство 0.7767 и евклидово сходство 0.9786. Хотя значения близки, они дают разную «глубину» сходства: косинусное сходство может более чувствительно отражать различия между векторами, тогда как евклидово сходство сглаживает их. Для задач, где важна тонкость различий между понятиями, косинусное сходство может быть полезнее, а евклидовое сходство больше подходит для общего поиска близких значений.

4. Важность транслитерации для многоязычных текстов

В примере с «тайп скрипт» и «type script» метод Daitch‑Mokotoff не выдает совпадение (коды 307 459 и 507 045), но при транслитерации оба слова приводятся к одному коду (T126), что указывает на их фонетическую близость. Это особенно актуально для поиска в многоязычных базах данных, где есть русские и английские варианты терминов, например, технические термины. Использование транслитерации и Soundex (или аналогичных методов) в комбинации может значительно повысить точность и полноту поиска в таких случаях.

5. Soundex и Daitch-Mokotoff — разные подходы к фонетическому поиску

Хотя оба метода (Soundex и Daitch‑Mokotoff) направлены на кодирование фонетического звучания, они дают разные результаты. Например, для «Ява‑скрипт» и «Java Script» метод Soundex показывает разные коды (Y126 и J126), в то время как метод Daitch‑Mokotoff более последователен в своей классификации для кириллических и латинских символов. Это показывает, что выбор метода зависит от цели: Soundex хорош для простых англоязычных данных, а Daitch‑Mokotoff — более универсальный инструмент, особенно полезный для многоязычных текстов.

6. Практическое применение для поисковых систем и базы данных навыков

Эта таблица показывает, как можно использовать сразу несколько методов для повышения качества поиска по базе данных. Например, для резюме и профессиональных навыков можно использовать векторные методы, чтобы находить не только точные совпадения, но и близкие понятия (например, «TypeScript» и «JavaScript»). Это особенно полезно для подбора специалистов, когда требуется не только точное совпадение с навыком, но и учет смежных навыков, которые могут быть полезны. Таким образом, комбинирование методов — от простого сравнения и фонетического анализа до сложных векторных методов — позволяет строить более гибкие и точные поисковые системы.

Заключение

Данное небольшое исследование наглядно иллюстрирует важность выбора и комбинирования различных методов для точного поиска и анализа данных в зависимости от конкретной задачи. Каждый метод имеет свои сильные и слабые стороны, и понимание их особенностей позволяет настроить поиск под нужды пользователя.

Для задач, где важно найти строки с небольшими ошибками или опечатками, такие как пропущенные символы или случайные пробелы, хорошо подходят более дешевые методы, например, триграммное сходство или расстояние Левенштейна. Эти методы обеспечивают быстрый и достаточно точный поиск без учета смысловой близости.

Если встречаются иностранные имена, названия или просто фонетически схожие слова, например, «Питон» и «Python», имеет смысл использовать фонетические методы, такие как Soundex или Daitch‑Mokotoff. Они хорошо работают для поиска слов с похожим звучанием, особенно если текст содержит имена, фамилии или иные термины, которые могут быть написаны по‑разному.

Транслитерация может стать полезным инструментом в многоязычных базах данных, где нужно искать термины, записанные на разных языках, но имеющие схожее звучание. Комбинирование транслитерации с другими методами, например, фонетическим или векторным сравнением, может повысить точность поиска.

Для задач, где важен смысловой поиск или поиск синонимов, лучше всего работают векторные методы. Они позволяют находить слова и выражения, близкие по значению, даже если они написаны по‑разному или на разных языках. Векторные методы также полезны, если нужно учитывать семантическую близость терминов.

Итак, выбор метода зависит от конкретной задачи. Если требуется простой поиск по схожим строкам, эффективнее использовать методы, не требующие больших вычислительных ресурсов. Если важна смысловая близость, то векторные методы, несмотря на их ресурсоемкость, обеспечат более качественный результат.


ссылка на оригинал статьи https://habr.com/ru/articles/855550/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *