Что такое Bag of Words?

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

Основная идея

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

Пример

Допустим, у нас есть два документа:

  • Документ 1: "мама мыла раму"

  • Документ 2: "папа читал газету"

Создаём словарь (все уникальные слова во всех документах):
["мама", "мыла", "раму", "папа", "читал", "газету"]

Теперь каждый документ кодируем вектором, длина которого равна числу уникальных слов в словаре.

Слово мама мыла раму папа читал газету
Документ 1 1 1 1 0 0 0
--- --- --- --- --- --- ---
Документ 2 0 0 0 1 1 1
--- --- --- --- --- --- ---

Как это работает технически

В программировании обычно используют CountVectorizer из библиотеки scikit-learn:

from sklearn.feature_extraction.text import CountVectorizer
texts = \["мама мыла раму", "папа читал газету"\]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(texts)
print(vectorizer.get_feature_names_out())
print(X.toarray())

Вывод:

\['газету' 'мама' 'мыла' 'папа' 'раму' 'читал'\]
\[\[0 1 1 0 1 0\]
\[1 0 0 1 0 1\]\]

Варианты заполнения вектора

  1. Binary BoW: вместо количества — просто факт присутствия слова (0 или 1).
    Используется, если частотность не важна.

  2. Count BoW: классический вариант — число вхождений слова в текст.
    Это наиболее распространённый способ.

  3. TF (term frequency): нормализует частоты слов по длине текста.

  4. TF-IDF (см. ниже): модификация BoW, которая учитывает редкость слов в коллекции документов.

Преимущества метода

  • Простота реализации и интерпретации

  • Быстрая обработка даже больших объёмов данных

  • Хорошая совместимость с большинством классических алгоритмов машинного обучения: Naive Bayes, SVM, Logistic Regression

Недостатки метода

  1. Игнорирование порядка слов.
    Фразы "не люблю" и "люблю" будут очень похожи по вектору, если встречаются те же слова.

  2. Большая размерность.
    Для большого корпуса словарь может насчитывать десятки тысяч уникальных слов → высокая размерность векторов.

  3. Разреженность.
    Большинство элементов в векторе равны нулю (слова не встречаются в конкретном документе).

  4. Не учитывает морфологию.
    Слова "читать", "читал", "читаем" считаются разными, если не делать лемматизацию.

  5. Не учитывает синонимы.
    "автомобиль" и "машина" — два разных признака, хотя семантически совпадают.

Как улучшить представление

Для повышения эффективности BoW могут применяться предварительные шаги обработки текста:

  • Лемматизация или стемминг (приводит слова к базовой форме)

  • Удаление стоп-слов (например, "и", "в", "на")

  • **Удаление редких или слишком частых слов
    **

  • Ограничение размера словаря (например, max_features=5000)

  • n-граммы: учитывать не только отдельные слова, но и последовательности (би-граммы, триграммы):

vectorizer = CountVectorizer(ngram_range=(1,2)) # униграммы и биграммы

Использование BoW в задачах

  1. **Классификация текстов (спам/не спам, отзывы)
    **
  2. **Анализ тональности
    **
  3. **Поиск информации
    **
  4. **Кластеризация и тематическое моделирование
    **
  5. **Рекомендательные системы
    **

BoW особенно полезен, когда:

  • Важна простота и скорость

  • Небольшой объём текстов

  • Ограниченные ресурсы для тренировки моделей

TF-IDF — развитие BoW

BoW можно улучшить путём внедрения взвешивания через TF-IDF (term frequency-inverse document frequency), где:

  • TF — частота слова в документе

  • IDF — редкость слова в коллекции документов

TF-IDF помогает снизить вес часто встречающихся слов и увеличить вес уникальных слов.

Пример:

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer()
X = tfidf.fit_transform(texts)

Сравнение с другими методами

Метод Учитывает порядок слов Учитывает контекст Разреженность Размерность
BoW высокая высокая
--- --- --- --- ---
TF-IDF частично высокая высокая
--- --- --- --- ---
Word2Vec низкая низкая
--- --- --- --- ---
BERT средняя средняя
--- --- --- --- ---

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