Анализ и классификация текста на Python: техники обработки данных
Для кого эта статья:
- Студенты и начинающие специалисты в области анализа данных и машинного обучения
- Профессионалы, работающие в сфере обработки естественного языка (NLP)
Разработчики, желающие освоить инструменты Python для анализа текстовых данных
Текстовая аналитика — золотая жила в эпоху информационного взрыва. Ежедневно мы генерируем петабайты неструктурированного текста: комментарии, отзывы, статьи, документы. Python с его экосистемой библиотек для анализа и классификации текста превратился в универсальный инструмент для извлечения ценных инсайтов из этого хаоса данных. В этой статье я проведу вас через всю цепочку обработки текста — от предварительной очистки до создания продвинутых классификаторов, способных автоматически определять тональность отзывов, тематику документов и даже авторство текста. 🐍📊
Погрузитесь в мир анализа и классификации текста с курсом Обучение Python-разработке от Skypro. Здесь вы не просто изучите синтаксис, а освоите практические инструменты для работы с текстовыми данными — от базовой предобработки до построения интеллектуальных моделей классификации с использованием передовых библиотек. Курс построен вокруг реальных задач, с которыми сталкиваются компании при анализе отзывов, запросов и документации.
Основы анализа и классификации текста на Python
Анализ и классификация текста на Python представляет собой процесс превращения неструктурированных текстовых данных в структурированную информацию, пригодную для машинного обучения и принятия решений. Этот процесс лежит в основе множества приложений — от фильтрации спама до анализа тональности социальных сетей и автоматической категоризации новостей.
Основополагающий принцип работы с текстом на Python заключается в том, что компьютер "не понимает" текст в том виде, в котором его воспринимают люди. Для машины текст необходимо преобразовать в численные представления. Существует несколько ключевых этапов в конвейере обработки текста:
- Сбор данных: получение текстовой информации из различных источников — веб-сайтов, документов, API;
- Предобработка: очистка, нормализация, токенизация и другие методы подготовки текста;
- Извлечение признаков: преобразование текста в числовые векторы;
- Создание модели: обучение алгоритма на размеченных данных;
- Оценка и оптимизация: проверка точности модели и улучшение её параметров;
- Развёртывание: интеграция модели в рабочие процессы.
Задачи классификации текста можно разделить на несколько основных категорий:
| Тип классификации | Описание | Примеры применения |
|---|---|---|
| Бинарная | Отнесение текста к одному из двух классов | Фильтрация спама, определение релевантности |
| Многоклассовая | Категоризация текста в одну из нескольких категорий | Классификация новостей, определение тематики |
| Мульти-лейбл | Присвоение тексту нескольких категорий одновременно | Тегирование статей, классификация документов |
| Иерархическая | Классификация с учетом иерархии категорий | Организация научных статей, категоризация продуктов |
Вот простой пример классификации отзывов на положительные и отрицательные с использованием Python:
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
# Загрузка данных
data = pd.DataFrame({
'text': ['Отличный продукт, очень доволен', 'Ужасное качество, не рекомендую',
'Лучшая покупка в этом году', 'Полное разочарование, зря потратил деньги'],
'label': ['положительный', 'отрицательный', 'положительный', 'отрицательный']
})
# Разделение на тренировочную и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(
data['text'], data['label'], test_size=0.25, random_state=42)
# Векторизация текста
vectorizer = CountVectorizer()
X_train_vec = vectorizer.fit_transform(X_train)
X_test_vec = vectorizer.transform(X_test)
# Обучение модели
clf = MultinomialNB()
clf.fit(X_train_vec, y_train)
# Предсказание
new_review = ['Хороший товар, буду заказывать ещё']
new_review_vec = vectorizer.transform(new_review)
prediction = clf.predict(new_review_vec)
print(f"Предсказанный класс: {prediction[0]}")
Этот код демонстрирует ключевые шаги: подготовку данных, векторизацию текста, обучение модели и использование её для предсказания тональности нового отзыва. Хотя пример упрощён, он иллюстрирует фундаментальный процесс анализа и классификации текста на Python, который можно масштабировать на реальные задачи.
Алексей Петров, руководитель отдела NLP-разработки
Однажды наша команда столкнулась с задачей автоматической классификации тысяч клиентских обращений, поступавших ежедневно. Раньше пять операторов вручную сортировали эти запросы по 15 категориям, тратя на это около 60% своего рабочего времени.
Мы решили автоматизировать этот процесс с помощью Python. Первый прототип был создан всего за неделю — мы использовали базовый подход с CountVectorizer и RandomForestClassifier. Даже эта простая модель показала точность 78%, что уже позволило частично разгрузить операторов.
Но настоящий прорыв произошел, когда мы перешли к более сложным техникам: применили TF-IDF для векторизации, добавили лемматизацию с помощью PyMorphy2 и настроили ансамбль из нескольких классификаторов. Точность поднялась до 91%.
Самым неожиданным результатом оказалось то, что модель выявила две категории обращений, которые операторы систематически путали между собой. Это привело к пересмотру самой системы классификации. Итог — операторы теперь тратят на сортировку всего 15% времени, занимаясь только сложными случаями, где уверенность модели ниже 85%.

Ключевые библиотеки Python для работы с текстовыми данными
Анализ и классификация текста на Python невозможны без использования специализированных библиотек. Правильный выбор инструментов существенно влияет на эффективность разработки и качество конечного результата. Рассмотрим наиболее востребованные библиотеки и их особенности.
Предобработка текста и извлечение признаков в Python
Предобработка текста — критический этап в анализе и классификации текста на Python. От качества этого процесса напрямую зависит эффективность работы модели. Предобработка включает серию преобразований, направленных на очистку текста и приведение его к стандартизированному виду.
Основные этапы предобработки текста:
- Очистка текста: удаление HTML-тегов, специальных символов, чисел;
- Нормализация регистра: приведение всего текста к нижнему регистру;
- Токенизация: разбиение текста на отдельные слова или фразы;
- Удаление стоп-слов: исключение часто встречающихся, но малоинформативных слов;
- Стемминг/лемматизация: приведение слов к их корню или начальной форме;
- Обработка орфографических ошибок: исправление опечаток и неправильного написания.
Вот пример комплексной предобработки текста с использованием библиотеки NLTK:
import re
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from nltk.stem import WordNetLemmatizer
# Загрузка необходимых ресурсов
nltk.download('punkt')
nltk.download('stopwords')
nltk.download('wordnet')
def preprocess_text(text):
# Удаление HTML-тегов
text = re.sub(r'<.*?>', '', text)
# Приведение к нижнему регистру
text = text.lower()
# Удаление чисел и пунктуации
text = re.sub(r'[^\w\s]', '', text)
text = re.sub(r'\d+', '', text)
# Токенизация
tokens = word_tokenize(text)
# Удаление стоп-слов
stop_words = set(stopwords.words('russian'))
filtered_tokens = [word for word in tokens if word not in stop_words]
# Лемматизация
lemmatizer = WordNetLemmatizer()
lemmatized_tokens = [lemmatizer.lemmatize(word) for word in filtered_tokens]
# Соединение токенов обратно в текст
processed_text = ' '.join(lemmatized_tokens)
return processed_text
# Пример использования
raw_text = "HTML-текст с разными СИМВОЛАМИ, цифрами 12345 и лишними словами."
processed_text = preprocess_text(raw_text)
print(processed_text)
После предобработки необходимо преобразовать текст в числовое представление — векторы признаков, с которыми могут работать алгоритмы машинного обучения. Существует несколько подходов к векторизации текста:
| Метод | Описание | Преимущества | Недостатки |
|---|---|---|---|
| Мешок слов (Bag of Words) | Подсчёт частоты встречаемости каждого слова | Простота, интерпретируемость | Игнорирование порядка слов, разреженные матрицы |
| TF-IDF | Учёт важности слов в документе относительно корпуса | Улучшенная репрезентация значимости слов | Не учитывает семантику и контекст |
| Word2Vec | Представление слов в семантическом пространстве | Учёт семантических связей между словами | Требует большого корпуса для обучения |
| BERT Embeddings | Контекстно-зависимые векторные представления | Учёт контекста, в котором используется слово | Высокие вычислительные требования |
Пример использования TF-IDF для векторизации текста:
from sklearn.feature_extraction.text import TfidfVectorizer
# Создание векторизатора
tfidf_vectorizer = TfidfVectorizer(max_features=1000,
stop_words='english')
# Примеры документов
documents = [
"Python is a great programming language for text analysis",
"Text classification requires preprocessing and feature extraction",
"Machine learning algorithms can classify text effectively"
]
# Преобразование текстов в TF-IDF векторы
tfidf_matrix = tfidf_vectorizer.fit_transform(documents)
# Получение имен признаков (слов)
feature_names = tfidf_vectorizer.get_feature_names_out()
# Вывод TF-IDF значений для первого документа
first_doc_vector = tfidf_matrix[0]
df = pd.DataFrame({'term': feature_names,
'tfidf': first_doc_vector.toarray()[0]})
df = df.sort_values('tfidf', ascending=False).head(5)
print(df)
Для более сложных задач часто используются предобученные модели для получения семантически богатых векторных представлений. Например, с помощью библиотеки transformers можно получить контекстные эмбеддинги из модели BERT:
from transformers import BertTokenizer, BertModel
import torch
# Загрузка предобученной модели и токенизатора
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
# Текст для векторизации
text = "Python позволяет эффективно анализировать текстовые данные."
# Токенизация и получение входов для модели
inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True)
# Получение векторных представлений
with torch.no_grad():
outputs = model(**inputs)
# Использование [CLS] токена как представления всего предложения
sentence_embedding = outputs.last_hidden_state[:, 0, :]
print(f"Размерность векторного представления: {sentence_embedding.shape}")
Выбор метода извлечения признаков зависит от конкретной задачи, доступных вычислительных ресурсов и требований к точности модели. Для простых задач классификации часто достаточно TF-IDF векторизации, в то время как для сложных семантических задач предпочтительны современные контекстные эмбеддинги на основе трансформеров.
Алгоритмы и модели для классификации текста на Python
Выбор алгоритма для анализа и классификации текста на Python критически важен для успеха проекта. Различные алгоритмы машинного обучения обладают уникальными характеристиками и подходят для разных типов задач. Рассмотрим основные классы алгоритмов и их применимость в контексте текстовой классификации.
Классические алгоритмы машинного обучения
- Наивный байесовский классификатор — основан на теореме Байеса и предположении о независимости признаков. Несмотря на "наивное" допущение, работает удивительно хорошо для текстовой классификации, особенно при небольших объёмах данных;
- Метод опорных векторов (SVM) — ищет гиперплоскость, наилучшим образом разделяющую классы. Эффективен для текстовой классификации, особенно в задачах с чётким разграничением категорий;
- Решающие деревья и случайные леса — ансамблевые методы, способные моделировать нелинейные зависимости. Хорошо работают с разреженными данными, характерными для текстовых задач;
- Логистическая регрессия — простой, но эффективный алгоритм для бинарной и многоклассовой классификации. Хорошо интерпретируется, что важно в некоторых бизнес-задачах.
Пример использования нескольких классических алгоритмов для сравнения их эффективности:
from sklearn.naive_bayes import MultinomialNB
from sklearn.svm import LinearSVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import Pipeline
from sklearn.model_selection import cross_val_score
import numpy as np
# Подготовка данных
texts = ["Отличный продукт, рекомендую", "Ужасное качество, не покупайте",
"Превосходит ожидания, очень доволен", "Полное разочарование, выброшенные деньги",
"Хорошее соотношение цены и качества", "Не соответствует описанию, верну"]
labels = [1, 0, 1, 0, 1, 0] # 1 – положительный, 0 – отрицательный
# Создание и оценка различных моделей
classifiers = [
("Naive Bayes", MultinomialNB()),
("SVM", LinearSVC()),
("Random Forest", RandomForestClassifier()),
("Logistic Regression", LogisticRegression(max_iter=1000))
]
for name, classifier in classifiers:
# Создание пайплайна: векторизация + классификатор
pipeline = Pipeline([
('tfidf', TfidfVectorizer()),
('clf', classifier)
])
# Оценка с помощью кросс-валидации
scores = cross_val_score(pipeline, texts, labels, cv=3)
print(f"{name}: Средняя точность = {np.mean(scores):.4f}, Стандартное отклонение = {np.std(scores):.4f}")
Глубокое обучение для текстовой классификации
Нейронные сети произвели революцию в анализе и классификации текста на Python, позволяя моделировать сложные зависимости и учитывать контекст слов:
- Рекуррентные нейронные сети (RNN) и их варианты (LSTM, GRU) — специализированы для последовательных данных, способны учитывать порядок слов;
- Сверточные нейронные сети (CNN) — изначально разработанные для изображений, но успешно применяемые к тексту для захвата локальных паттернов;
- Трансформеры (BERT, GPT, T5) — современная архитектура, использующая механизм внимания для моделирования зависимостей между всеми словами в тексте;
- Комбинированные модели — часто совмещают разные архитектуры для достижения лучших результатов.
Пример реализации простой LSTM-модели для классификации текста с TensorFlow:
import tensorflow as tf
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, LSTM, Dense, Dropout
# Пример данных
texts = [
"Этот продукт превзошел все мои ожидания",
"Разочарован качеством, не рекомендую",
"Отличное соотношение цены и качества",
"Совершенно бесполезная вещь, зря потратил деньги",
"Доволен покупкой, буду заказывать еще"
]
labels = [1, 0, 1, 0, 1] # 1 – положительный, 0 – отрицательный
# Токенизация текста
max_words = 1000 # Максимальное количество слов в словаре
max_len = 20 # Максимальная длина последовательности
tokenizer = Tokenizer(num_words=max_words)
tokenizer.fit_on_texts(texts)
sequences = tokenizer.texts_to_sequences(texts)
word_index = tokenizer.word_index
print(f'Найдено уникальных слов: {len(word_index)}')
# Padding последовательностей
data = pad_sequences(sequences, maxlen=max_len)
# Создание модели
model = Sequential()
model.add(Embedding(max_words, 128, input_length=max_len))
model.add(LSTM(64, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
# Компиляция модели
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
# Обучение модели (в реальных задачах нужно больше данных)
model.fit(data, labels, epochs=10, batch_size=2, validation_split=0.2)
# Предсказание для нового текста
new_text = ["Хороший товар, соответствует описанию"]
new_seq = tokenizer.texts_to_sequences(new_text)
new_padded = pad_sequences(new_seq, maxlen=max_len)
prediction = model.predict(new_padded)
print(f"Предсказанная вероятность положительного класса: {prediction[0][0]:.4f}")
Для многих практических задач можно использовать предобученные модели, что существенно сокращает время и ресурсы на обучение:
from transformers import AutoModelForSequenceClassification, AutoTokenizer
import torch
# Загрузка предобученной модели для анализа тональности
model_name = "blanchefort/rubert-base-cased-sentiment"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)
# Пример текста для анализа
text = "Отличный сервис, всем рекомендую!"
# Токенизация
inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True)
# Получение предсказаний
with torch.no_grad():
outputs = model(**inputs)
predictions = torch.nn.functional.softmax(outputs.logits, dim=-1)
# Интерпретация результатов
label_names = ["Негативный", "Нейтральный", "Позитивный"]
for i, pred in enumerate(predictions[0]):
print(f"{label_names[i]}: {pred.item():.4f}")
Выбор между классическими алгоритмами и нейронными сетями зависит от сложности задачи, объема данных и вычислительных ресурсов. Для небольших наборов данных и простых задач классификации часто достаточно классических алгоритмов, в то время как для сложных семантических задач или больших объёмов данных предпочтительны нейронные сети, особенно трансформеры.
Максим Сергеев, NLP-инженер
Работая над проектом автоматизации поддержки клиентов, мы столкнулись с классической проблемой классификации обращений. Задача казалась тривиальной: распределить запросы по 8 категориям. Мы начали с классического подхода: TF-IDF + логистическая регрессия.
Первая модель показала точность около 76%, что было неплохо, но недостаточно для промышленного использования. Интересно, что когда мы добавили биграммы и триграммы в нашу TF-IDF модель, точность подскочила до 82%. Это был первый ключевой момент — понимание, что в русском языке контекст и словосочетания несут больше информации, чем отдельные слова.
Затем мы попробовали BERT, конкретно ruBERT. После тонкой настройки точность достигла впечатляющих 91%. Однако была проблема — модель работала слишком медленно для производственной среды, где требовалась обработка сотен запросов в секунду.
Решение пришло неожиданно. Мы создали ансамбль из "быстрой" модели (TF-IDF + логистическая регрессия) и "точной" (ruBERT). Быстрая модель обрабатывала 80% запросов, где её уверенность превышала пороговое значение, а оставшиеся сложные случаи передавались BERT-модели.
Это гибридное решение обеспечило и скорость, и точность. Но главное, что я понял: не всегда нужно использовать самые продвинутые модели для всех данных — иногда "умная" комбинация простых и сложных подходов дает оптимальный результат.
Практические кейсы анализа и классификации текста на Python
Анализ и классификация текста на Python находят применение в разнообразных сферах бизнеса и науки. Рассмотрим несколько практических кейсов с примерами кода, демонстрирующими реализацию различных текстовых задач.
Кейс 1: Анализ тональности отзывов клиентов
Анализ тональности позволяет автоматически определять эмоциональную окраску текста — положительную, отрицательную или нейтральную. Это полезно для мониторинга удовлетворенности клиентов и репутации бренда.
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import classification_report
# Загрузка данных (пример)
df = pd.DataFrame({
'review': [
'Отличный продукт, очень доволен покупкой',
'Товар хороший, но доставка подвела',
'Ужасное качество, не рекомендую',
'Нормальный продукт, соответствует цене',
'Восхитительно, превзошло все ожидания',
'Разочарован, не буду больше покупать',
'Обычный товар, ничего особенного',
'Приемлемое качество за эти деньги'
],
'sentiment': ['positive', 'neutral', 'negative', 'neutral',
'positive', 'negative', 'neutral', 'neutral']
})
# Разделение данных
X_train, X_test, y_train, y_test = train_test_split(
df['review'], df['sentiment'], test_size=0.25, random_state=42)
# Векторизация с использованием TF-IDF
vectorizer = TfidfVectorizer(ngram_range=(1, 2)) # используем униграммы и биграммы
X_train_vect = vectorizer.fit_transform(X_train)
X_test_vect = vectorizer.transform(X_test)
# Обучение модели градиентного бустинга
model = GradientBoostingClassifier(n_estimators=100, random_state=42)
model.fit(X_train_vect, y_train)
# Оценка модели
y_pred = model.predict(X_test_vect)
print(classification_report(y_test, y_pred))
# Пример анализа новых отзывов
new_reviews = [
'Качественный товар, буду заказывать еще',
'Не понравилось, много дефектов'
]
new_reviews_vect = vectorizer.transform(new_reviews)
predictions = model.predict(new_reviews_vect)
for review, sentiment in zip(new_reviews, predictions):
print(f'Текст: "{review}"\nТональность: {sentiment}\n')
Кейс 2: Классификация новостных статей по категориям
Автоматическая категоризация новостей позволяет организовать информационные потоки и помогает читателям находить контент, соответствующий их интересам.
import pandas as pd
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import LinearSVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, f1_score
# Пример набора данных новостей
df = pd.DataFrame({
'text': [
'Новый закон о налогах вступит в силу с января следующего года',
'Сборная России по футболу проиграла в матче с Бразилией',
'Ученые обнаружили новый вид рыб в Тихом океане',
'Президент подписал указ о социальных выплатах',
'Завершился чемпионат мира по хоккею',
'Экспедиция в Антарктиду обнаружила следы древних микроорганизмов'
],
'category': ['политика', 'спорт', 'наука', 'политика', 'спорт', 'наука']
})
# Разделение данных
X_train, X_test, y_train, y_test = train_test_split(
df['text'], df['category'], test_size=0.2, random_state=42)
# Векторизация
vectorizer = TfidfVectorizer(max_features=1000, min_df=2)
X_train_tfidf = vectorizer.fit_transform(X_train)
X_test_tfidf = vectorizer.transform(X_test)
# Создание и обучение модели
clf = OneVsRestClassifier(LinearSVC(random_state=42))
clf.fit(X_train_tfidf, y_train)
# Оценка модели
y_pred = clf.predict(X_test_tfidf)
print(f'Точность: {accuracy_score(y_test, y_pred):.2f}')
print(f'F1-мера: {f1_score(y_test, y_pred, average="weighted"):.2f}')
# Классификация новой статьи
new_article = ['В Госдуме обсудили проект бюджета на следующий год']
new_article_tfidf = vectorizer.transform(new_article)
predicted_category = clf.predict(new_article_tfidf)
print(f'Предсказанная категория для статьи: {predicted_category[0]}')
Кейс 3: Обнаружение спама в электронной почте
Фильтрация спама — классическая задача бинарной классификации текста, имеющая огромное практическое значение для защиты пользователей от нежелательных и потенциально вредоносных сообщений.
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns
# Пример набора данных электронных писем
df = pd.DataFrame({
'email': [
'Поздравляем! Вы выиграли миллион долларов, перейдите по ссылке',
'Уважаемый клиент, ваша учетная запись была заблокирована',
'Привет, как насчет ужина в пятницу?',
'Уведомление: ваш заказ №12345 отправлен',
'Получите бесплатный кредит прямо сейчас! Только сегодня!',
'Напоминание о встрече завтра в 15:00',
'Увеличьте размер своего капитала на 300% за неделю!',
'Документы к сегодняшнему совещанию во вложении'
],
'is_spam': [1, 1, 0, 0, 1, 0, 1, 0] # 1 – спам, 0 – не спам
})
# Разделение данных
X_train, X_test, y_train, y_test = train_test_split(
df['email'], df['is_spam'], test_size=0.25, random_state=42)
# Векторизация с использованием Bag of Words
vectorizer = CountVectorizer(stop_words='english')
X_train_counts = vectorizer.fit_transform(X_train)
X_test_counts = vectorizer.transform(X_test)
# Обучение Наивного Байеса
model = MultinomialNB()
model.fit(X_train_counts, y_train)
# Оценка модели
y_pred = model.predict(X_test_counts)
print(f'Точность: {accuracy_score(y_test, y_pred):.2f}')
print(f'Точность (Precision): {precision_score(y_test, y_pred):.2f}')
print(f'Полнота (Recall): {recall_score(y_test, y_pred):.2f}')
print(f'F1-мера: {f1_score(y_test, y_pred):.2f}')
# Визуализация матрицы ошибок
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
xticklabels=['Не спам', 'Спам'], yticklabels=['Не спам', 'Спам'])
plt.xlabel('Предсказанные значения')
plt.ylabel('Истинные значения')
plt.title('Матрица ошибок')
plt.show()
# Классификация новых писем
new_emails = [
'Срочно! Ваша кредитная карта заблокирована',
'Пожалуйста, проверьте отчет, который я отправил утром'
]
new_emails_counts = vectorizer.transform(new_emails)
predictions = model.predict(new_emails_counts)
probas = model.predict_proba(new_emails_counts)
for email, pred, proba in zip(new_emails, predictions, probas):
spam_probability = proba[1] # Вероятность класса "спам"
print(f'Письмо: "{email}"\nКлассификация: {"Спам" if pred == 1 else "Не спам"}')
print(f'Вероятность спама: {spam_probability:.2f}\n')
Кейс 4: Многоязычная классификация с использованием трансформеров
С появлением многоязычных моделей трансформеров стало возможным создавать классификаторы, способные работать с текстами на разных языках, что особенно полезно для международных компаний.
from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments
import torch
import numpy as np
from datasets import Dataset
import evaluate
# Загрузка предобученной многоязычной модели
model_name = "xlm-roberta-base"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)
# Пример многоязычного набора данных для классификации тональности
texts = [
"This product is amazing, I love it!", # английский
"Ce produit est terrible, je ne le recommande pas.", # французский
"Dieses Produkt ist wunderbar, ich bin sehr zufrieden.", # немецкий
"Questo prodotto è pessimo, non lo consiglierei.", # итальянский
"Este producto es fantástico, muy recomendable.", # испанский
"Этот продукт превосходен, очень рекомендую." # русский
]
labels = [1, 0, 1, 0, 1, 1] # 1 – положительный, 0 – отрицательный
# Токенизация данных
def tokenize_function(examples):
return tokenizer(examples["text"], padding="max_length", truncation=True)
# Создание датасета
train_dataset = Dataset.from_dict({"text": texts, "label": labels})
tokenized_datasets = train_dataset.map(tokenize_function, batched=True)
# Настройка обучения
training_args = TrainingArguments(
output_dir="./results",
num_train_epochs=3,
per_device_train_batch_size=4,
per_device_eval_batch_size=4,
warmup_steps=500,
weight_decay=0.01,
logging_dir="./logs",
)
# Создание тренера
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_datasets,
)
# Обучение модели
trainer.train()
# Функция для предсказания
def predict_sentiment(text):
inputs = tokenizer(text, padding=True, truncation=True, return_tensors="pt")
outputs = model(**inputs)
probabilities = torch.nn.functional.softmax(outputs.logits, dim=-1)
sentiment = "положительный" if probabilities[0][1] > 0.5 else "отрицательный"
confidence = probabilities[0][1].item() if sentiment == "положительный" else probabilities[0][0].item()
return sentiment, confidence
# Тестирование на новых многоязычных примерах
new_texts = [
"I really dislike this service.", # английский
"Wirklich gutes Preis-Leistungs-Verhältnis.", # немецкий
"Ужасное качество, больше не буду покупать." # русский
]
for text in new_texts:
sentiment, confidence = predict_sentiment(text)
print(f"Текст: '{text}'")
print(f"Тональность: {sentiment}")
print(f"Уверенность: {confidence:.2f}\n")
Эти практические примеры демонстрируют разнообразие применений анализа и классификации текста на Python. От простых задач бинарной классификации до сложных многоязычных моделей — современные методы и библиотеки позволяют эффективно решать широкий спектр задач обработки естественного языка. Ключом к успеху является правильный выбор инструментов и алгоритмов, соответствующих конкретным требованиям и ограничениям проекта. 🚀
Анализ и классификация текста на Python открывают огромные возможности для извлечения ценности из неструктурированных данных. Мы рассмотрели полный цикл от предобработки текста до построения сложных моделей классификации, исследовали традиционные и современные подходы на базе глубокого обучения. Главный вывод: не существует универсального решения — выбор инструментов всегда должен определяться спецификой задачи, доступными данными и требованиями к производительности. Освоение этих техник превращает необработанный текст в структурированные знания, что критически важно в мире, где объемы текстовой информации растут в геометрической прогрессии.
Читайте также
- Топ-15 книг по бизнес-анализу: от основ до продвинутых техник
- Дорожная карта аналитика данных: от новичка до эксперта
- Как правильно анализировать метрики продаж: руководство для бизнеса
- Формулы в Power Query
- Инструменты обработки больших данных: сравнение и выбор решений
- 15 лучших датасетов для кластерного анализа: от теории к практике
- Аналитик данных: обязанности, навыки и карьерный рост в 2024
- 15 мощных формул Excel для глубокого анализа данных: от основ к инсайтам
- Ключевые навыки и компетенции аналитика данных
- Выбор инструментов анализа данных: функционал, цены и сравнение