---
title: Векторизация текста и эмбеддинги
seo:
  description: >-
    Тема «Векторизация текста и эмбеддинги» для собеседования Data Scientist.
    Написать TF-IDF функцию. Рассказать про модификацию TF-IDF под названием
    BM25 как работает?
  title: Векторизация текста и эмбеддинги — Data Scientist
---

[Все темы Data Scientist](/prep/data-scientist)

Подтемы:

- [TF-IDF](#q-14bee738d69b811d8be4c931bddb7292)
- [Метод векторизации](#q-14bee738d69b816f8bb1f861b5e60fd9)
- [Эмбеддинги](#q-14bee738d69b8193ac05eabe973633af)
- [История обработки данных](#q-14bee738d69b81c78c16f1ec79c0ea31)

## <strong>Написать</strong> <code>TF&#45;IDF</code> <strong>функцию.</strong> [#q-14bee738d69b811d8be4c931bddb7292]

<strong>Решение&#58;</strong>

```python
import math

def tfidf(term, document, corpus):
    # TF (Term Frequency) - частота термина в документе
    tf = document.count(term) / len(document)

    # IDF (Inverse Document Frequency) - обратная частота документа с термином
    num_documents_with_term = sum(1 for doc in corpus if term in doc)
    idf = math.log(len(corpus) / (1 + num_documents_with_term))

    return tf * idf

# Пример использования:
corpus = [
    "This is the first document.",
    "This document is the second document.",
    "And this is the third one.",
    "Is this the first document?",
]

documents = [doc.lower().split() for doc in corpus]

term = "document"
for i, doc in enumerate(documents):
    print(f"TF-IDF for term '{term}' in document {i+1}: {tfidf(term, doc, documents)}")
```

:::note[Ссылки для изучения]

1. [TF-IDF: формулы, варианты IDF и расчёт на Python](https://www.scikit-learn.ru/stable/modules/feature_extraction.html)
   :::

---

## <strong>Рассказать про модификацию</strong> <code>TF&#45;IDF</code> <strong>под названием</strong> <code>BM25</code> <strong>как работает?</strong> [#q-14bee738d69b81a2bbefe7475c8a9c29]

<code>BM25 &#40;Best Matching 25&#41;</code> - это улучшенная версия
<code>TF&#45;IDF</code>, разработанная для оценки релевантности документов в
поисковых системах. Вот как это работает&#58;

1. <strong>Оценка частотности термина</strong> <code>&#40;TF&#41;</code>&#58; В
   отличие от обычного <code>TF&#45;IDF</code>, <code>BM25</code> использует
   модель оценки частотности термина, которая более чувствительна к различиям в
   частоте терминов. Она определяется как&#58;

$$
TF(q, d) = \frac{f(q, d) \cdot (k_1 + 1)}{f(q, d) + k_1 \cdot \left(1 - b + b \cdot \frac{|d|}{avgdl}\right)}
$$

где&#58;

- <InlineMath tex={"f(q, d)"} /> - частота термина <InlineMath tex={"q"} /> в
  документе <InlineMath tex={"d"} />.

- <InlineMath tex={"|d|"} /> - длина документа <InlineMath tex={"d"} />.

- <InlineMath tex={"avgdl"} /> - средняя длина документа в корпусе.

- <InlineMath tex={"k_1"} /> и <InlineMath tex={"b"} /> - настраиваемые
  параметры.

1. <strong>Оценка обратной частотности документа</strong>
   <code>&#40;IDF&#41;</code>&#58; <code>IDF</code> в <code>BM25</code>
   оценивает важность термина в контексте всего корпуса документов, как и в
   TF-IDF.

1. <strong>Расчет релевантности</strong>&#58; Релевантность документа для
   запроса вычисляется как сумма <code>IDF</code>-взвешенных значений
   <code>TF</code> для всех терминов запроса&#58;

$$
\text{BM25}(q, d) = \sum_{q_i \in q} \text{IDF}(q_i) \cdot \text{TF}(q_i, d)
$$

<code>BM25</code> позволяет лучше учитывать частоту терминов и длину документов
в оценке их релевантности, что делает его эффективным методом для поиска и
ранжирования документов.

:::note[Ссылки для изучения]

1. [BM25: насыщение частоты, IDF и нормирование длины документа](https://habr.com/ru/articles/860830/)
   :::

---

## Плюсы/минусы <code>TF&#45;IDF</code>, <code>Bag of words</code>. [#q-14bee738d69b81b29ef9d268ccd0e000]

<code>TF&#45;IDF</code>&#58;

Плюсы&#58;

1. Учитывает важность слова в контексте всей коллекции документов.

1. Позволяет выделить наиболее информативные слова, отфильтровывая часто встречающиеся общие слова.

1. Хорошо работает с длинными текстами и большими коллекциями документов.

Минусы&#58;

1. Не учитывает порядок слов в тексте и их взаимосвязь.

1. Может иметь проблемы с редкими словами, которые могут получить завышенные веса из-за низкой обратной частоты встречаемости.

<code>Bag of Words</code>&#58;

Плюсы&#58;

1. Простота и понятность концепции.

1. Может быть эффективен для коротких текстов и простых задач.

1. Хорошо работает с часто встречающимися словами.

Минусы&#58;

1. Не учитывает порядок слов и их семантическую структуру.

1. Может приводить к разреженным матрицам при большом словаре или коллекции документов.

1. Не учитывает важность слов в контексте всей коллекции.

:::note[Ссылки для изучения]

1. [Bag of Words и TF-IDF: частоты, разреженность и n-граммы](https://www.scikit-learn.ru/stable/modules/feature_extraction.html)
   :::

---

## <strong>Основные методы векторизации текстовых данных.</strong> [#q-14bee738d69b816f8bb1f861b5e60fd9]

Основные методы векторизации текстовых данных&#58;

1. Мешок слов <code>&#40;Bag of Words&#41;</code>&#58; Представляет текст как набор изолированных слов без учета порядка или структуры предложения. Каждое уникальное слово в тексте становится признаком, а его частота встречаемости в документе — значением этого признака.

1. TF-IDF <code>&#40;Term Frequency&#45;Inverse Document Frequency&#41;</code>&#58; Учитывает не только частоту встречаемости слова в документе (TF), но и обратную частоту его встречаемости во всех документах коллекции (IDF). Это позволяет выделить наиболее информативные слова, учитывая их важность в контексте всей коллекции документов.

1. <code>Word Embeddings</code>&#58; Представляют слова в виде векторов
   непрерывного пространства, где семантически близкие слова имеют близкие
   векторные представления. Примеры включают Word2Vec, GloVe и FastText.

1. <code>Doc2Vec</code>&#58; Расширение Word2Vec, которое представляет не только
   отдельные слова, но и целые документы в виде векторов, сохраняя их
   семантическое содержание.

1. <code>N&#45;граммы</code>&#58; Включают в себя комбинации из нескольких
   последовательных слов или символов. Например, биграммы (2-граммы) содержат
   последовательности из двух слов, триграммы (3-граммы) — из трех и т.д.

:::note[Ссылки для изучения]

1. [Краткий обзор техник векторизации текста](https://habr.com/ru/articles/778048/)
2. [Эмбеддинги. Pine Forest AI: ИИ-агенты для бизнеса, с 0:13](https://www.youtube.com/watch?v=las5CZGS3Tc&t=13s)

:::

---

## <strong>Что такое</strong> <code>Word2vec</code><strong>?</strong> [#q-14bee738d69b8193ac05eabe973633af]

Word2Vec - это метод для создания векторных представлений слов на основе контекста, в котором они встречаются в тексте. Этот метод обычно используется в обработке естественного языка и машинном обучении. Он позволяет представить слова в виде векторов в многомерном пространстве таким образом, что близкие слова в этом пространстве имеют семантическую схожесть. Векторы слов можно использовать для различных задач, таких как поиск схожих слов, классификация текста и многие другие.

:::note[Ссылки для изучения]

1. [Эмбеддинги для начинающих](https://habr.com/ru/companies/otus/articles/787116/)
2. [Word2Vec: CBOW и Skip-gram. Pine Forest AI, с 1:48](https://www.youtube.com/watch?v=las5CZGS3Tc&t=108s)

:::

---

## <strong>Чем модели эмбеддингов отличают от самих</strong> <code>LLM</code><strong>?</strong> [#q-14bee738d69b81158f2fdac0a624d94e]

Модели эмбеддингов, такие как <code>Word2Vec</code> или <code>GloVe</code>, создают векторы для слов, представляя их в непрерывном пространстве. <code>LLM</code> (Large Language Models), такие как <code>BERT</code> или <code>GPT</code>, используют эмбеддинги в качестве одного из слоёв, но дополнительно обучаются на больших корпусах текста для выполнения более сложных задач, таких как генерация текста или ответ на вопросы.

:::note[Ссылки для изучения]

1. [Word2Vec: статические векторы и контекстная задача обучения](https://contest.yandex.ru/tracks/ml/deep-learning-architectures/neural-networks-for-sequences#word2vec)
1. [Языковая модель: вероятность текста, mask и next-token](https://contest.yandex.ru/tracks/ml/generative-models/language-models#chto-takoe-yazykovye-modeli)
   :::

---

## <strong>Нужны ли другие эмбеддинги кроме</strong> <code>CLS</code> <strong>токена для классификации?</strong> [#q-14bee738d69b8180995ecd99d6fb2130]

<code>CLS</code> токен обычно используется в моделях вроде <code>BERT</code> для
получения финальной репрезентации текста для задач классификации. Однако для
некоторых задач могут использоваться другие эмбеддинги, например, агрегированные
или средние значения по всем токенам.

:::note[Ссылки для изучения]

1. [Представление текста для классификатора: CLS, pooler и mean pooling](https://habr.com/ru/articles/797657/)
   :::

---

## Как развивались методы представления текста&#58; от Bag of Words и TF-IDF до контекстных эмбеддингов и трансформеров? [#q-14bee738d69b81c78c16f1ec79c0ea31]

История предобработки текста в машинном обучении началась с классических методов, таких как мешок слов <code>&#40;bag of words&#41;</code>, которые преобразовывали текст в векторы фиксированной длины, учитывая только частоту встречаемости слов. Затем стали использоваться методы стемминга и лемматизации для приведения слов к их основной форме и уменьшения размерности пространства признаков.

Далее были разработаны методы <code>TF&#45;IDF &#40;term frequency &#45; inverse document frequency&#41;</code>, позволяющие оценить важность слова в документе относительно всего корпуса текстов. Этот подход помогает выделить ключевые слова и игнорировать часто встречающиеся общеупотребительные слова.

С развитием нейронных сетей появились эмбеддинги слов, такие как <code>Word2Vec</code>, <code>GloVe</code> и <code>FastText</code>, которые преобразуют слова в векторные представления, учитывая их семантический контекст.

Позднее были разработаны контекстуальные эмбеддинги, такие как <code>ELMo</code> и <code>BERT</code>, которые учитывают контекст предложения при генерации эмбеддингов. Эти модели обеспечивают более высокую точность в задачах обработки естественного языка за счет учета смысловой связи между словами в предложении.

Трансформеры лежат в основе многих моделей обработки и генерации текста, включая семейства GPT и T5. Их входом обычно служат токены, а представления обучаются вместе с моделью. Лучший метод зависит от задачи, данных и ограничений; статус SOTA нужно проверять на конкретном актуальном бенчмарке.

:::note[Ссылки для изучения]

1. [Классические представления текста: Bag of Words и TF-IDF](https://www.scikit-learn.ru/stable/modules/feature_extraction.html)
1. [Статические эмбеддинги Word2Vec](https://contest.yandex.ru/tracks/ml/deep-learning-architectures/neural-networks-for-sequences#word2vec)
1. [Transformer и контекстные представления BERT/GPT](https://education.yandex.ru/handbook/ml/article/transformery)
1. [Эмбеддинги. Pine Forest AI: ИИ-агенты для бизнеса, с 0:13](https://www.youtube.com/watch?v=las5CZGS3Tc&t=13s)

:::
