Как обучить простой классификатор текста?
Обучение простого классификатора текста включает несколько ключевых этапов: сбор данных, предварительная обработка текста, преобразование текста в числовое представление, выбор и обучение модели, а также её оценку. Ниже описан полный пайплайн построения текстового классификатора с пояснением всех шагов и возможной реализацией на 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 и наивного байеса, может показывать достойные результаты в реальных задачах классификации текста, особенно при достаточном объёме и качестве данных.