Как обучить простой классификатор текста?

Обучение простого классификатора текста включает несколько ключевых этапов: сбор данных, предварительная обработка текста, преобразование текста в числовое представление, выбор и обучение модели, а также её оценку. Ниже описан полный пайплайн построения текстового классификатора с пояснением всех шагов и возможной реализацией на Python с использованием scikit-learn.

1. Сбор и разметка данных

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

  • Спам/не спам

  • Положительный/отрицательный отзыв

  • Тематическая классификация (спорт, политика, технологии и т.д.)

Пример данных:

texts = \[
"Купите дешёвые часы прямо сейчас", # спам
"Здравствуйте, пришлите, пожалуйста, отчёт", # не спам
"Скидки на смартфоны только сегодня", # спам
"Ваш заказ был успешно доставлен", # не спам
\]
labels = \["spam", "ham", "spam", "ham"\]

2. Предварительная обработка текста

Подготовка текста включает:

  • Приведение к нижнему регистру

  • Удаление пунктуации

  • Удаление стоп-слов

  • Токенизация

  • (Опционально) лемматизация или стемминг

import re
import nltk
from nltk.corpus import stopwords
nltk.download('stopwords')
stop_words = set(stopwords.words("russian"))
def preprocess(text):
text = text.lower()
text = re.sub(r"\[^а-яa-z\\s\]", "", text)
tokens = text.split()
tokens = \[w for w in tokens if w not in stop_words\]
return " ".join(tokens)
texts_cleaned = \[preprocess(t) for t in texts\]

3. Векторизация текста

Текст нельзя напрямую подать в модель — его нужно перевести в числовой формат. Простые методы:

  • **Bag of Words
    **
  • **TF-IDF
    **
  • (опционально) **n-граммы
    **
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(ngram_range=(1, 2))
X = vectorizer.fit_transform(texts_cleaned)

На этом этапе каждый текст становится вектором фиксированной длины — числовым представлением частот слов/фраз.

4. Разделение на обучающую и тестовую выборки

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

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=0.25, random_state=42)

5. Обучение модели

Для простой классификации хорошо подходят алгоритмы:

  • Наивный байесовский классификатор (MultinomialNB)

  • Логистическая регрессия

  • SVM (подходит для больших и разреженных векторов)

from sklearn.naive_bayes import MultinomialNB
model = MultinomialNB()
model.fit(X_train, y_train)

6. Оценка качества

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

from sklearn.metrics import accuracy_score, classification_report
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))

Метрики:

  • accuracy — доля правильных ответов

  • precision — точность по классам

  • recall — полнота

  • F1-score — гармоническое среднее между precision и recall

7. Предсказание новых текстов

Чтобы использовать модель на новых данных:

new_text = "Успей купить телевизор со скидкой"
new_text_cleaned = preprocess(new_text)
new_vector = vectorizer.transform(\[new_text_cleaned\])
prediction = model.predict(new_vector)
print("Класс:", prediction\[0\])

8. Кросс-валидация (опционально)

Для более надёжной оценки можно использовать кросс-валидацию:

from sklearn.model_selection import cross_val_score
import numpy as np
scores = cross_val_score(model, X, labels, cv=5, scoring='accuracy')
print("Средняя точность:", np.mean(scores))

9. Поддержка нескольких классов

Если задача многоклассовая (например, темы новостей: спорт, политика, технологии), алгоритмы MultinomialNB и LogisticRegression легко масштабируются — scikit-learn поддерживает многоклассовую классификацию по умолчанию (через one-vs-rest или softmax).

10. Улучшения и расширения

  • Лемматизация: позволяет объединять формы слова (например, "пошёл" и "идти").

  • Балансировка классов: при несбалансированных данных используйте class_weight="balanced" или SMOTE.

  • Регуляризация и настройка гиперпараметров: GridSearchCV для подбора параметров.

  • Слово- и документа-ориентированные эмбеддинги: Word2Vec, FastText, BERT — для более сложных моделей.

  • Pipeline: объединение всех шагов в единый пайплайн.

from sklearn.pipeline import Pipeline
pipe = Pipeline(\[
("tfidf", TfidfVectorizer(ngram_range=(1, 2))),
("clf", MultinomialNB())
\])
pipe.fit(texts_cleaned, labels)
print(pipe.predict(\["Супер предложение на ноутбуки"\]))

Возможные библиотеки

  • scikit-learn — базовые модели и векторизация

  • NLTK, spaCy, pymorphy2 — для обработки текста

  • TextBlob, DeepPavlov — готовые NLP-инструменты

  • transformers (HuggingFace) — современные модели для сложных задач

Таким образом, даже простая модель, обученная на чистом тексте с применением TF-IDF и наивного байеса, может показывать достойные результаты в реальных задачах классификации текста, особенно при достаточном объёме и качестве данных.