TF-IDF в Python: векторизация текста для эффективной аналитики
Для кого эта статья:
- Специалисты в области анализа данных и машинного обучения
- Разработчики, желающие улучшить навыки работы с текстовыми данными
Студенты и обучающиеся, интересующиеся практическим применением анализа текста с помощью Python
Освоение TF-IDF при работе с текстовыми данными — это как получить ключи от спортивного автомобиля, когда раньше ты ездил на старенькой "Ладе". Эта статистическая мера позволяет превратить неструктурированный текст в понятные для машинного обучения числовые векторы, вытаскивая наиболее значимые слова из документов. Переход от простого подсчета слов к взвешенной оценке их важности делает текстовую аналитику точнее, а модели — эффективнее. Погрузимся в мир TF-IDF с Python и sklearn, чтобы вы могли применить этот подход к своим задачам уже сегодня! 🚀
Хотите не просто читать о TF-IDF, а применять его в реальных проектах? Научитесь использовать векторизацию текста, создавать поисковые системы и разрабатывать рекомендательные алгоритмы на Обучении Python-разработке от Skypro. Курс построен на практических примерах — от базовых инструментов до продвинутого анализа текста. После обучения вы сможете без труда превращать неструктурированные данные в золотые инсайты для бизнеса!
Что такое TF-IDF и где это применяется
TF-IDF (Term Frequency-Inverse Document Frequency) — статистическая мера, используемая для определения важности слова в документе, являющемся частью коллекции (корпуса) документов. Она состоит из двух компонентов:
- TF (Term Frequency) — частота слова в документе, показывает, насколько часто слово встречается в конкретном тексте
- IDF (Inverse Document Frequency) — обратная частота документа, понижающий вес для слов, которые встречаются во многих документах коллекции
Формула для расчета TF-IDF:
TF-IDF(t, d, D) = TF(t, d) × IDF(t, D)
Где:
t— термин (слово)d— документD— коллекция документов
TF-IDF помогает выделить значимые слова, отсеивая общеупотребительные термины. Если слово часто встречается в одном документе, но редко в остальных — оно получит высокий вес TF-IDF, указывая на его важность для данного текста. 📊
Дмитрий Сергеев, Lead Data Scientist
Однажды мы столкнулись с задачей автоматической категоризации обращений клиентов в техподдержку. Ежедневно приходило более 10 000 тикетов, и три специалиста вручную сортировали их по 20 категориям, что занимало до 40% рабочего времени.
Первое, что мы попробовали — простой подсчет слов (Bag of Words), но результаты были неутешительными: точность классификации едва достигала 65%. Система не могла корректно отличить важные тематические термины от общеупотребительных слов.
Переход на TF-IDF полностью преобразил ситуацию. Термины вроде "баланс", "списание", "подписка" в контексте финансовых вопросов получили высокие веса, а общие слова вроде "здравствуйте", "пожалуйста" практически обнулились. Точность классификации выросла до 89%, а после тонкой настройки достигла 93%.
Самое впечатляющее, что реализация заняла всего 15 строк кода на Python с использованием sklearn. ROI проекта составил более 700% за первый год за счет сокращения времени обработки и перераспределения человеческих ресурсов.
Области применения TF-IDF:
| Область | Применение | Пример использования |
|---|---|---|
| Поисковые системы | Ранжирование результатов поиска | Определение релевантности документов поисковому запросу |
| Классификация текстов | Создание признаков для алгоритмов ML | Категоризация новостей, спам-фильтрация |
| Рекомендательные системы | Векторное представление контента | Поиск похожих статей или товаров |
| Извлечение ключевых слов | Выделение важных терминов | Автоматическое тегирование текста |
| Тематическое моделирование | Предобработка перед кластеризацей | Определение скрытых тем в коллекции документов |

Настройка среды Python и установка sklearn для TF-IDF
Прежде чем погрузиться в мир TF-IDF с Python и sklearn, необходимо настроить рабочую среду. Процесс установки прост, но требует внимания к версиям используемых библиотек для обеспечения совместимости. 🛠️
Базовые требования для работы с TF-IDF в Python:
- Python 3.6+ (рекомендуется Python 3.8+)
- scikit-learn (sklearn) — библиотека для машинного обучения
- numpy — библиотека для численных вычислений
- pandas — библиотека для работы с данными (опционально)
- matplotlib/seaborn — библиотеки для визуализации (опционально)
Для установки всех необходимых пакетов воспользуйтесь следующими командами:
# Создание виртуальной среды (рекомендуется)
python -m venv tf_idf_env
# Активация виртуальной среды
# – для Windows:
tf_idf_env\Scripts\activate
# – для macOS/Linux:
source tf_idf_env/bin/activate
# Установка необходимых библиотек
pip install scikit-learn numpy pandas matplotlib seaborn
Проверьте корректность установки, запустив Python и импортировав нужные библиотеки:
import numpy as np
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
# Проверка версии sklearn
import sklearn
print(f"scikit-learn version: {sklearn.__version__}")
Если вы работаете в Jupyter Notebook или Google Colab (что крайне рекомендуется для интерактивного анализа), можете установить библиотеки прямо в ячейке с помощью магической команды:
!pip install scikit-learn numpy pandas matplotlib seaborn
| Среда разработки | Преимущества | Недостатки | Рекомендации |
|---|---|---|---|
| Jupyter Notebook | Интерактивность, визуализация, документирование | Локальная установка, управление зависимостями | Идеально для анализа и обучения |
| Google Colab | Облачная среда, GPU/TPU, совместная работа | Ограниченное время сессии, непостоянное хранилище | Для быстрого старта без настройки |
| PyCharm/VS Code | Профессиональная IDE, отладка, интеграция Git | Менее наглядно для исследовательского анализа | Для создания полноценных приложений |
| Spyder | Похож на RStudio, ориентирован на научные вычисления | Меньше возможностей, чем у PyCharm | Для специалистов, переходящих с R |
Важный момент при работе с TF-IDF — это подготовка текстовых данных. Перед векторизацией тексты обычно проходят предобработку:
- Приведение к нижнему регистру
- Удаление знаков препинания
- Удаление стоп-слов
- Стемминг или лемматизация
- Удаление цифр и специальных символов (при необходимости)
Для этих задач часто используются дополнительные библиотеки:
# Установка библиотек для предобработки текста
pip install nltk spacy
Теперь ваша среда полностью готова для работы с TF-IDF в Python с использованием sklearn, и можно переходить к практическим примерам! 🚀
Основные функции TfidfVectorizer в sklearn
Библиотека scikit-learn предлагает мощный инструмент для работы с TF-IDF — класс TfidfVectorizer. Эта реализация объединяет процесс токенизации текста и вычисления весов TF-IDF, что делает её чрезвычайно удобной в применении. 🧩
Базовое использование TfidfVectorizer выглядит так:
from sklearn.feature_extraction.text import TfidfVectorizer
# Создание экземпляра векторайзера
vectorizer = TfidfVectorizer()
# Корпус документов для примера
corpus = [
"Это первый документ.",
"Это второй пример документа.",
"А это третий документ.",
"Это еще один пример."
]
# Обучение векторайзера и преобразование текстов
X = vectorizer.fit_transform(corpus)
После выполнения этого кода переменная X содержит разреженную матрицу, где строки соответствуют документам из корпуса, а столбцы — уникальным словам (токенам). Значения в ячейках — это веса TF-IDF для каждого слова в каждом документе.
TfidfVectorizer имеет множество параметров, которые позволяют тонко настраивать процесс векторизации. Вот ключевые параметры:
| Параметр | Описание | Значение по умолчанию | Рекомендации по настройке |
|---|---|---|---|
| min_df | Минимальная частота документа для учёта токена | 1 | Увеличьте для фильтрации редких слов (например, 5 или 0.01) |
| max_df | Максимальная частота документа для учёта токена | 1.0 | Уменьшите для фильтрации общих слов (например, 0.95 или 0.9) |
| stop_words | Список стоп-слов для удаления | None | 'english' для встроенного списка или передайте собственный список |
| ngram_range | Диапазон n-грамм для извлечения | (1, 1) | (1, 2) для включения униграмм и биграмм |
| use_idf | Включение/выключение IDF | True | False для использования только TF (без взвешивания) |
| smooth_idf | Сглаживание IDF (добавление единицы к числителю и знаменателю) | True | Рекомендуется оставить True для избежания деления на ноль |
| sublinear_tf | Применение логарифмического масштабирования к TF | False | Установите True для снижения влияния высокочастотных слов |
| lowercase | Преобразование к нижнему регистру | True | False если регистр важен для анализа |
| analyzer | Тип анализа: 'word', 'char' или функция | 'word' | 'char' для работы с символами вместо слов |
| max_features | Максимальное число признаков | None | Установите конкретное число (например, 10000) для ограничения размерности |
Важные методы TfidfVectorizer:
fit(raw_documents)— обучает векторайзер на корпусе документовtransform(raw_documents)— преобразует документы в матрицу TF-IDFfit_transform(raw_documents)— комбинация fit и transform в одной операцииget_feature_names_out()— возвращает список всех токенов (особенностей)
Пример получения словаря признаков и преобразования матрицы в pandas DataFrame:
import pandas as pd
# Получение списка всех токенов
feature_names = vectorizer.get_feature_names_out()
# Преобразование разреженной матрицы в плотную
dense_matrix = X.toarray()
# Создание DataFrame для лучшей визуализации
df_tfidf = pd.DataFrame(dense_matrix, columns=feature_names)
print(df_tfidf)
Для визуализации наиболее важных слов для каждого документа:
import numpy as np
# Для каждого документа находим слова с самыми высокими весами TF-IDF
for i, doc in enumerate(corpus):
# Получаем индексы слов, отсортированных по убыванию важности
feature_index = X[i, :].nonzero()[1]
tfidf_scores = zip(feature_index, [X[i, x] for x in feature_index])
# Сортируем слова по весу TF-IDF
sorted_words = sorted(tfidf_scores, key=lambda x: x[1], reverse=True)
print(f"Документ {i+1}: {doc}")
# Выводим топ-3 слова (или меньше, если слов меньше)
top_n = min(3, len(sorted_words))
for idx, score in sorted_words[:top_n]:
print(f" – {feature_names[idx]}: {score:.4f}")
Вот так просто можно использовать TfidfVectorizer из sklearn для превращения текстовых данных в числовые векторы, пригодные для дальнейшего анализа и машинного обучения! 🚀
Практическая реализация TF-IDF на Python
Перейдем от теории к практике и разберем полный рабочий пример использования TF-IDF с Python и sklearn на реальных данных. Для иллюстрации я буду использовать набор новостных текстов, на которых продемонстрирую полный процесс — от загрузки данных до анализа результатов. 🧪
Алексей Петров, NLP-инженер
Я работал с проектом, где нам требовалось автоматизировать категоризацию вопросов пользователей для системы ЧаВо на сайте интернет-магазина. За день поступало около 200-300 новых вопросов, и менеджеры тратили по 3-4 часа, чтобы распределить их по 12 категориям вручную.
Изначально я пытался использовать современные трансформеры на базе BERT, потратив неделю на обучение и настройку модели. Результаты были хорошими (F1-score 0.92), но модель работала медленно и требовала существенных вычислительных ресурсов.
Для сравнения я решил попробовать классический подход с TF-IDF и линейным SVM. Потратив всего 2 часа на имплементацию, я получил F1-score 0.89 – лишь немного хуже трансформера, но модель работала в 30 раз быстрее и могла быть запущена даже на слабом сервере.
Самым удивительным для меня было то, что после анализа матрицы ошибок и добавления биграмм в TF-IDF векторизацию (просто изменив параметр ngram_range на (1, 2)), точность выросла до 0.91 – практически сравнявшись с BERT, но при этом сохранив все преимущества в скорости и простоте.
Этот случай научил меня не спешить с применением сложных решений, когда простые подходы могут быть не менее эффективными.
Начнем с загрузки и подготовки данных:
import numpy as np
import pandas as pd
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.svm import LinearSVC
from sklearn.metrics import classification_report
# Загружаем данные из датасета 20 Newsgroups
categories = ['alt.atheism', 'comp.graphics', 'sci.med', 'soc.religion.christian']
twenty_train = fetch_20newsgroups(subset='train', categories=categories, shuffle=True, random_state=42)
# Разделяем данные на тренировочные и тестовые
X_train, X_test, y_train, y_test = train_test_split(twenty_train.data, twenty_train.target, test_size=0.3, random_state=42)
# Проверяем размеры наших данных
print(f"Тренировочных документов: {len(X_train)}")
print(f"Тестовых документов: {len(X_test)}")
print(f"Категории: {twenty_train.target_names}")
Теперь реализуем TF-IDF векторизацию с настройкой параметров:
# Создаем и настраиваем векторайзер TF-IDF
tfidf_vectorizer = TfidfVectorizer(
min_df=5, # Игнорируем термы, встречающиеся менее чем в 5 документах
max_df=0.8, # Игнорируем термы, встречающиеся более чем в 80% документов
sublinear_tf=True, # Применяем логарифмическое масштабирование (1 + log(tf))
use_idf=True, # Используем IDF
ngram_range=(1, 2), # Учитываем униграммы и биграммы
stop_words='english' # Убираем английские стоп-слова
)
# Обучаем векторайзер на тренировочных данных и трансформируем их
X_train_tfidf = tfidf_vectorizer.fit_transform(X_train)
X_test_tfidf = tfidf_vectorizer.transform(X_test)
# Проверяем размеры полученных матриц
print(f"Размер тренировочной TF-IDF матрицы: {X_train_tfidf.shape}")
print(f"Размер тестовой TF-IDF матрицы: {X_test_tfidf.shape}")
Теперь используем полученные TF-IDF векторы для обучения модели классификации:
# Создаем и обучаем классификатор
classifier = LinearSVC(random_state=42)
classifier.fit(X_train_tfidf, y_train)
# Делаем предсказания
y_pred = classifier.predict(X_test_tfidf)
# Оцениваем результаты
print(classification_report(y_test, y_pred, target_names=twenty_train.target_names))
Для анализа и интерпретации результатов, полезно узнать, какие слова имеют наибольший вес для каждой категории:
# Функция для получения наиболее важных слов для каждой категории
def get_top_features(vectorizer, clf, class_labels, n=20):
feature_names = vectorizer.get_feature_names_out()
# Для каждого класса выводим топ-n важных слов
top_features = {}
for i, class_label in enumerate(class_labels):
# Получаем веса слов для текущего класса
top_indices = np.argsort(clf.coef_[i])[-n:]
top_features[class_label] = [(feature_names[j], clf.coef_[i][j])
for j in top_indices]
return top_features
# Получаем топ-10 важных слов для каждой категории
top_features = get_top_features(tfidf_vectorizer, classifier, twenty_train.target_names, n=10)
# Выводим результаты
for category, features in top_features.items():
print(f"\nТоп-10 слов для категории '{category}':")
for feature, weight in reversed(features):
print(f" {feature}: {weight:.4f}")
Для дополнительного анализа можно визуализировать результаты:
import matplotlib.pyplot as plt
import seaborn as sns
# Создаем DataFrame для визуализации
viz_data = []
for category, features in top_features.items():
for term, weight in reversed(features):
viz_data.append({
'Category': category,
'Term': term,
'Weight': weight
})
viz_df = pd.DataFrame(viz_data)
# Визуализация
plt.figure(figsize=(12, 10))
g = sns.barplot(x='Weight', y='Term', hue='Category', data=viz_df)
plt.title('Top TF-IDF Terms by Category')
plt.tight_layout()
plt.show()
Важным шагом является также анализ ошибок классификации. Можно найти документы, которые были неправильно классифицированы, и проанализировать их содержимое:
# Находим индексы неправильно классифицированных документов
misclassified_indices = np.where(y_test != y_pred)[0]
# Выводим несколько примеров ошибок
for idx in misclassified_indices[:5]: # Выводим первые 5 ошибок
doc = X_test[idx]
true_label = twenty_train.target_names[y_test[idx]]
pred_label = twenty_train.target_names[y_pred[idx]]
print(f"\nНеправильно классифицированный документ #{idx}")
print(f"Истинная категория: {true_label}")
print(f"Предсказанная категория: {pred_label}")
# Выводим фрагмент документа для анализа
print("\nФрагмент документа:")
print(" ".join(doc.split()[:50]), "...") # Первые 50 слов
Завершающий шаг — сохранение модели и векторайзера для использования в будущем:
import joblib
# Сохраняем обученную модель и векторайзер
joblib.dump(classifier, 'tfidf_classifier.pkl')
joblib.dump(tfidf_vectorizer, 'tfidf_vectorizer.pkl')
print("Модель и векторайзер успешно сохранены!")
# Пример загрузки и использования модели
loaded_vectorizer = joblib.load('tfidf_vectorizer.pkl')
loaded_classifier = joblib.load('tfidf_classifier.pkl')
# Тестирование на новых данных
new_docs = [
"I need help with my computer graphics card",
"What is the best treatment for flu?"
]
# Преобразуем новые документы в TF-IDF векторы
new_docs_tfidf = loaded_vectorizer.transform(new_docs)
# Делаем предсказания
predictions = loaded_classifier.predict(new_docs_tfidf)
# Выводим результаты
for doc, pred in zip(new_docs, predictions):
print(f"Документ: {doc}")
print(f"Предсказанная категория: {twenty_train.target_names[pred]}\n")
Этот полный пример демонстрирует весь процесс работы с TF-IDF при решении реальной задачи классификации текста. Из этого примера видно, что sklearn делает работу с TF-IDF в Python простой и эффективной, позволяя сосредоточиться на анализе и интерпретации результатов. 📈
Анализ текстовых данных с помощью TF-IDF в sklearn
После освоения базовых техник использования TF-IDF с Python и sklearn, рассмотрим продвинутые методы анализа текстовых данных, которые помогут извлечь максимальную ценность из вашего текстового корпуса. 🔎
В этом разделе мы сфокусируемся на:
- Поиске похожих документов
- Кластеризации документов
- Извлечении ключевых слов
- Построении поисковых систем
- Визуализации текстовых корпусов
Начнем с поиска похожих документов на основе косинусного сходства:
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
import pandas as pd
# Загрузим небольшой набор документов для демонстрации
documents = [
"Машинное обучение – это подраздел искусственного интеллекта",
"Нейронные сети используются для решения задач машинного обучения",
"Python – популярный язык программирования для анализа данных",
"TensorFlow и PyTorch – библиотеки для глубокого обучения",
"Обработка естественного языка помогает компьютерам понимать тексты",
"Классификация текста – одна из задач обработки естественного языка",
"Регрессия – это метод прогнозирования числовых значений",
"Кластеризация группирует похожие объекты вместе"
]
# Создаем TF-IDF векторы
vectorizer = TfidfVectorizer(stop_words='english')
tfidf_matrix = vectorizer.fit_transform(documents)
# Вычисляем косинусное сходство между всеми документами
cosine_similarities = cosine_similarity(tfidf_matrix, tfidf_matrix)
# Создаем DataFrame для удобного отображения сходства
similarity_df = pd.DataFrame(cosine_similarities)
similarity_df.index = [f"Док {i+1}" for i in range(len(documents))]
similarity_df.columns = [f"Док {i+1}" for i in range(len(documents))]
Функция для поиска наиболее похожих документов:
def find_similar_documents(doc_index, cosine_sim, n=3):
# Получаем индексы похожих документов, отсортированных по сходству
similar_indices = np.argsort(cosine_sim[doc_index])[::-1]
# Исключаем сам документ
similar_indices = similar_indices[similar_indices != doc_index]
# Выбираем топ-n похожих документов
return similar_indices[:n]
# Пример использования: найдем 2 документа, наиболее похожих на документ #1
doc_index = 0
similar_indices = find_similar_documents(doc_index, cosine_similarities, n=2)
print(f"Документ #{doc_index+1}: {documents[doc_index]}")
print("\nПохожие документы:")
for i, idx in enumerate(similar_indices):
print(f"{i+1}. Документ #{idx+1} (сходство: {cosine_similarities[doc_index][idx]:.4f})")
print(f" {documents[idx]}")
Далее рассмотрим кластеризацию документов с помощью K-means:
from sklearn.cluster import KMeans
# Определяем оптимальное количество кластеров с помощью метода "локтя"
inertias = []
max_clusters = 8
for k in range(1, min(max_clusters+1, len(documents)+1)):
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(tfidf_matrix)
inertias.append(kmeans.inertia_)
# В реальном проекте здесь был бы код для построения графика метода "локтя"
# для определения оптимального числа кластеров
# Используем K-means для кластеризации документов
num_clusters = 3 # Допустим, мы выбрали 3 кластера
kmeans = KMeans(n_clusters=num_clusters, random_state=42)
clusters = kmeans.fit_predict(tfidf_matrix)
# Выводим документы по кластерам
for cluster_id in range(num_clusters):
print(f"\nКластер {cluster_id+1}:")
for doc_idx, cluster in enumerate(clusters):
if cluster == cluster_id:
print(f" – {documents[doc_idx]}")
Теперь перейдем к извлечению ключевых слов для каждого кластера:
def get_cluster_keywords(vectorizer, kmeans, documents, clusters, top_n=5):
# Получаем TF-IDF матрицу
tfidf_matrix = vectorizer.transform(documents)
# Определяем ключевые слова для каждого кластера
cluster_keywords = {}
feature_names = vectorizer.get_feature_names_out()
for cluster_id in range(kmeans.n_clusters):
# Индексы документов, принадлежащих текущему кластеру
doc_indices = [i for i, c in enumerate(clusters) if c == cluster_id]
if not doc_indices: # Пропускаем пустые кластеры
continue
# Средние TF-IDF значения по всем документам кластера
cluster_tfidf = np.zeros_like(tfidf_matrix[0].toarray()[0])
for idx in doc_indices:
cluster_tfidf += tfidf_matrix[idx].toarray()[0]
cluster_tfidf /= len(doc_indices)
# Находим топ-N слов с наивысшими TF-IDF значениями
top_indices = cluster_tfidf.argsort()[::-1][:top_n]
top_terms = [(feature_names[i], cluster_tfidf[i]) for i in top_indices]
cluster_keywords[cluster_id] = top_terms
return cluster_keywords
# Получаем ключевые слова для каждого кластера
cluster_keywords = get_cluster_keywords(vectorizer, kmeans, documents, clusters, top_n=5)
# Выводим ключевые слова по кластерам
for cluster_id, keywords in cluster_keywords.items():
print(f"\nКлючевые слова для кластера {cluster_id+1}:")
for term, score in keywords:
print(f" – {term}: {score:.4f}")
Построение простой поисковой системы с использованием TF-IDF:
def search_documents(query, documents, vectorizer=None):
if vectorizer is None:
# Если векторайзер не передан, создаем новый
vectorizer = TfidfVectorizer(stop_words='english')
doc_vectors = vectorizer.fit_transform(documents)
else:
# Используем предоставленный векторайзер
doc_vectors = vectorizer.transform(documents)
# Преобразуем запрос в TF-IDF вектор
query_vector = vectorizer.transform([query])
# Вычисляем косинусное сходство между запросом и всеми документами
similarities = cosine_similarity(query_vector, doc_vectors).flatten()
# Сортируем документы по убыванию релевантности
sorted_indices = similarities.argsort()[::-1]
results = []
for idx in sorted_indices:
if similarities[idx] > 0: # Выводим только релевантные документы
results.append({
'document': documents[idx],
'relevance': similarities[idx],
'index': idx
})
return results
# Пример использования поиска
search_query = "Python для машинного обучения"
search_results = search_documents(search_query, documents, vectorizer)
print(f"Результаты поиска по запросу: '{search_query}'\n")
for i, result in enumerate(search_results[:3]): # Выводим топ-3 результата
print(f"{i+1}. Релевантность: {result['relevance']:.4f}")
print(f" Документ #{result['index']+1}: {result['document']}")
Наконец, визуализация текстовых данных с помощью t-SNE для уменьшения размерности:
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
import matplotlib.cm as cm
# Уменьшаем размерность данных с помощью t-SNE
tsne = TSNE(n_components=2, random_state=42, perplexity=2)
reduced_data = tsne.fit_transform(tfidf_matrix.toarray())
# Создаем scatter plot с цветами, соответствующими кластерам
plt.figure(figsize=(10, 8))
colors = cm.rainbow(np.linspace(0, 1, num_clusters))
for i, (x, y) in enumerate(reduced_data):
plt.scatter(x, y, color=colors[clusters[i]], s=100)
plt.annotate(f"Док {i+1}", (x, y), fontsize=9, alpha=0.7)
plt.title('t-SNE визуализация документов, окрашенных по кластерам')
plt.xlabel('t-SNE 1')
plt.ylabel('t-SNE 2')
plt.tight_layout()
# В реальном коде здесь был бы вызов plt.show()
Использование TF-IDF для анализа эмоциональной окраски текста:
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
# Пример текстов с эмоциональной окраской
sentiment_texts = [
"Это отличный продукт, я очень доволен покупкой!",
"Ужасное качество, полное разочарование.",
"Товар хороший, но доставка оставляет желать лучшего.",
"Превосходный сервис и быстрая доставка, рекомендую!",
"Не работает совершенно, выброшенные деньги."
]
sentiment_labels = ["позитивный", "негативный", "нейтральный", "позитивный", "негативный"]
# Создаем DataFrame для анализа
sentiment_df = pd.DataFrame({
'текст': sentiment_texts,
'эмоция': sentiment_labels
})
# Для каждой эмоции определяем ключевые слова с помощью TF-IDF
for sentiment in set(sentiment_labels):
# Выбираем тексты с текущей эмоцией
texts = sentiment_df[sentiment_df['эмоция'] == sentiment]['текст'].tolist()
if not texts:
continue
# Создаем TF-IDF векторайзер
sentiment_vectorizer = TfidfVectorizer(
min_df=1, max_df=0.9, stop_words=None, ngram_range=(1, 2)
)
# Получаем TF-IDF матрицу
sentiment_matrix = sentiment_vectorizer.fit_transform(texts)
# Вычисляем средние веса TF-IDF для всех слов
feature_names = sentiment_vectorizer.get_feature_names_out()
avg_weights = sentiment_matrix.mean(axis=0).A1
# Сортируем слова по весам и выбираем топ-5
top_indices = avg_weights.argsort()[::-1][:5]
top_terms = [(feature_names[i], avg_weights[i]) for i in top_indices]
print(f"\nКлючевые слова для '{sentiment}' текстов:")
for term, weight in top_terms:
if weight > 0: # Выводим только слова с ненулевыми весами
print(f" – {term}: {weight:.4f}")
TF-IDF в сочетании с инструментарием Python и sklearn открывает широкие возможности для анализа текстовых данных. От поиска документов и выделения ключевых тем до кластеризации и построения поисковых систем — этот подход позволяет решать множество практических задач обработки текста эффективно и с минимальными затратами ресурсов. 🚀
Овладение TF-IDF с Python и sklearn — мощная инвестиция в ваш аналитический арсенал. Эта простая, но эффективная техника позволяет решать широкий спектр задач обработки текста без необходимости в сложных нейронных сетях и огромных вычислительных ресурсах. Помните: даже в эпоху трансформеров и больших языковых моделей TF-IDF остается надежным фундаментом текстовой аналитики, обеспечивая баланс между производительностью и интерпретируемостью. Экспериментируйте с параметрами, комбинируйте с другими методами и не забывайте: иногда простые решения оказываются наиболее эффективными.
Читайте также
- Обратное распространение ошибки в нейросетях: математика и реализация
- TensorFlow и PyTorch: 10 лучших курсов для начинающих специалистов
- Кластеризация в машинном обучении: поиск скрытых структур в данных
- Методы классификации в машинном обучении: от основ до продвинутых
- ТОП-15 инструментов ML: от Pandas до TensorFlow – обзор библиотек
- Машинное обучение в приложениях: трансформация разработки и UX
- Машинное обучение: как компьютеры учатся без программирования
- Обучение с учителем: как машины учатся на примерах данных
- Обучение без учителя: мощные методы анализа немаркированных данных
- Молниеносное обучение моделей: от сырых данных к ML-решениям