Bag of words

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

В контексте Brain.js, Bag of Words применяется для подготовки текстовых данных перед подачей их в нейронную сеть. Brain.js работает с числовыми массивами, поэтому исходный текст необходимо превратить в числовое представление.


Преобразование текста в Bag of Words

  1. Токенизация текста Текст разбивается на отдельные слова или токены. Например, предложение "Привет мир" превращается в массив:

    ["привет", "мир"]
  2. Создание словаря Словарь содержит все уникальные слова из обучающего корпуса. Каждому слову присваивается индекс. Пример словаря:

    const vocabulary = ["привет", "мир", "как", "дела"];
  3. Векторизация документа Для каждого текста создаётся вектор длиной словаря, где каждый элемент указывает на наличие или частоту соответствующего слова в документе. Существует два основных способа кодирования:

    • Бинарное кодирование — 1, если слово встречается в тексте, 0, если не встречается.
    • Частотное кодирование — количество появлений слова в тексте.

Пример бинарного кодирования для предложения "Привет мир":

const vector = [1, 1, 0, 0]; // "привет" и "мир" есть, "как" и "дела" нет

Использование Bag of Words с Brain.js

Brain.js принимает на вход массивы чисел, что делает BoW идеальным методом для подготовки данных.

Пример: классификация текста по настроению

const brain = require('brain.js');
const net = new brain.NeuralNetwork();

// Словарь всех слов из корпуса
const vocabulary = ["привет", "радость", "грусть", "плохо", "хорошо"];

// Функция преобразования текста в вектор
function textToVector(text) {
  const tokens = text.toLowerCase().split(/\W+/);
  return vocabulary.map(word => tokens.includes(word) ? 1 : 0);
}

// Обучающие данные
const trainingData = [
  { input: textToVector("привет, я рад"), output: { positive: 1 } },
  { input: textToVector("мне грустно"), output: { negative: 1 } },
  { input: textToVector("всё хорошо"), output: { positive: 1 } },
  { input: textToVector("плохо себя чувствую"), output: { negative: 1 } },
];

// Обучение сети
net.train(trainingData, {
  iterations: 2000,
  log: true,
  logPeriod: 100,
  learningRate: 0.3
});

// Тестирование
const testVector = textToVector("я чувствую радость");
const output = net.run(testVector);
console.log(output);

В этом примере каждый текст преобразуется в фиксированный вектор, который затем используется как вход нейронной сети. Подход Bag of Words позволяет сети выявлять закономерности присутствия слов и их комбинаций, что важно для задач классификации.


Особенности и ограничения

  • Простота реализации. BoW легко кодируется и не требует сложной предобработки текста.
  • Высокая размерность. С увеличением словаря размер входного вектора растёт, что может замедлить обучение.
  • Игнорирование порядка слов. В BoW не учитывается последовательность слов, поэтому теряется контекст.
  • Неэффективность при редких словах. Слова, встречающиеся очень редко, могут создавать разреженные векторы, влияя на качество модели.

Для смягчения этих проблем часто применяют:

  • Стоп-слова — удаление часто встречающихся, но малозначимых слов.
  • Stemming/Lemmatization — приведение слов к базовой форме.
  • TF-IDF — взвешивание слов по значимости в тексте.

Интеграция с другими подходами Brain.js

Bag of Words в Brain.js можно комбинировать с:

  • Сетями LSTM (Long Short-Term Memory) для анализа последовательностей.
  • Обучением с подкреплением в задачах генерации текста.
  • Многоклассовой классификацией, где каждый класс представлен отдельным выходом сети.

Использование BoW позволяет создать базовый и понятный pipeline обработки текста, который легко расширять и интегрировать с более сложными методами обработки естественного языка.