Что такое 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\]\]
Варианты заполнения вектора
-
Binary BoW: вместо количества — просто факт присутствия слова (0 или 1).
Используется, если частотность не важна. -
Count BoW: классический вариант — число вхождений слова в текст.
Это наиболее распространённый способ. -
TF (term frequency): нормализует частоты слов по длине текста.
-
TF-IDF (см. ниже): модификация BoW, которая учитывает редкость слов в коллекции документов.
Преимущества метода
-
Простота реализации и интерпретации
-
Быстрая обработка даже больших объёмов данных
-
Хорошая совместимость с большинством классических алгоритмов машинного обучения: Naive Bayes, SVM, Logistic Regression
Недостатки метода
-
Игнорирование порядка слов.
Фразы "не люблю" и "люблю" будут очень похожи по вектору, если встречаются те же слова. -
Большая размерность.
Для большого корпуса словарь может насчитывать десятки тысяч уникальных слов → высокая размерность векторов. -
Разреженность.
Большинство элементов в векторе равны нулю (слова не встречаются в конкретном документе). -
Не учитывает морфологию.
Слова "читать", "читал", "читаем" считаются разными, если не делать лемматизацию. -
Не учитывает синонимы.
"автомобиль" и "машина" — два разных признака, хотя семантически совпадают.
Как улучшить представление
Для повышения эффективности BoW могут применяться предварительные шаги обработки текста:
-
Лемматизация или стемминг (приводит слова к базовой форме)
-
Удаление стоп-слов (например, "и", "в", "на")
-
**Удаление редких или слишком частых слов
** -
Ограничение размера словаря (например, max_features=5000)
-
n-граммы: учитывать не только отдельные слова, но и последовательности (би-граммы, триграммы):
vectorizer = CountVectorizer(ngram_range=(1,2)) # униграммы и биграммы
Использование BoW в задачах
- **Классификация текстов (спам/не спам, отзывы)
** - **Анализ тональности
** - **Поиск информации
** - **Кластеризация и тематическое моделирование
** - **Рекомендательные системы
**
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 по-прежнему используется в задачах, где не требуется глубокое понимание языка, но необходима быстрая и эффективная обработка. Он также служит хорошей базой для обучения начинающих работе с текстами.