Вопрос или проблема
Извините за любые неточности из-за начальной стадии в этой области.
Я пытаюсь научиться, как вернуть набор данных с тремя классами для кластеризации с помощью TensorFlow.
На данный момент я много читал и экспериментировал с несколькими Colabs, но ни один из них не указывает на технику кластеризации, когда дело доходит до текста (только классификация).
Суть в том, что я не имею ни малейшего представления о том, как можно классифицировать текст, и я думал, что рекурсивный процесс, используемый TensorFlow, предложит лучший подход и результаты, чем то, что я обычно получаю, используя K-Means.
Я сам составил Colab, но сейчас это настоящий беспорядок из примеров, поэтому лучше не делиться им на этом этапе.
Вкратце, я токенизировал ключевые слова, создал словарь, преобразовал свой текст в плотную матрицу и затем начал использовать модели. Однако когда дело доходит до использования функции fit, я сталкиваюсь с серией ошибок, самой последней из которых является “ValueError: Нет градиентов для любой переменной”.
Я был бы признателен за поддержку и советы по материалам для чтения, если такие имеются. Выпуск TensorFlow 2 делает вещи еще более сложными, так как примеров стало еще меньше, и попытки адаптировать примеры для TF1 не всегда работают.
Спасибо
ОБНОВЛЕНИЕ:
Я очистил проект, основываясь на другом примере, взятом здесь. Ясно, что оригинальный пример работал, а мой – нет.
В моей версии я пытаюсь обучить модель, чтобы она научилась трем различным классам. Мои вопросы на данный момент:
-
Как я могу создать подходящие наборы меток, когда плотный выход больше 1?
Горячее кодирование, похоже, не является вариантом, так как форма метки не выводится из размера массива, как я изначально думал, а из самих значений.
-
Как я могу предсказать новое невиданное ключевое слово/текст?
Здесь мне нужно постоянно обучать модель, чтобы “увидеть” новые ключевые слова. Я бы этого ожидал, но как?
-
Как я могу распечатать/экспортировать выход моих предсказаний?
Я не вижу много преимуществ в использовании TensorFlow в этом случае. TensorFlow (и PyTorch) – отличные инструменты, если вам нужно вычислить градиенты функции потерь и использовать их в оптимизаторе. Кластеризация не предоставляет такого обучения, которое позволило бы обучить RNN или Transformer, которые дадут вам разумное представление.
В вашем случае я бы попытался:
-
представить среднее встраивание слов для содержательных слов
-
представить текст с помощью BERT
А затем использовать алгоритм кластеризации на ваш выбор. Вы действительно можете реализовать k-средние или иерархическую кластеризацию в TensorFlow.
Вы можете делать это в TensorFlow или нет, на мой взгляд.
-
Один из способов – использовать предобученные встраивания или какую-то предобученную модель, такую как BERT, чтобы сгенерировать представление y
-
Вы также можете сделать это с моделью TensorFlow. Например, вы можете подать каждый кусочек текста (обработанный как последовательность токенов) в автокодировщик, взять сжатое представление ваших данных и затем применить некоторые техники кластеризации, такие как k-средние. Вы можете использовать как сверточные, так и RNN-слои для Кодировщика и Декодировщика. Модель TensorFlow может работать как с предобученными, так и с обученными с нуля встраиваниями. Вы можете создать свои собственные, поставив слой
Embedding()
на входе вашей нейронной сети. -
Очень быстрым и эффективным вариантом является обучение модели doc2vec. Библиотека gensim предлагает встроенные функции для этого.
PS: Я думаю, что TensorFlow 2.x значительно упрощает ситуацию по сравнению с 1.x, который вовсе не был простым и очень многословным. Почти любой пример Keras, который вы можете найти, можно без труда портировать на TF2.
Ответ или решение
Для кластеризации текстовых данных с использованием TensorFlow важно понимать несколько ключевых аспектов. В этой статье я подробно изложу шаги, которые помогут вам организовать данные, создать модель и произвести кластеризацию.
1. Подготовка данных
Для начала вам нужно подготовить свои текстовые данные. Это включает в себя следующие этапы:
1.1. Токенизация
Использование токенизатора – один из первых шагов. Токенизация разбивает текст на отдельные слова или токены:
import tensorflow as tf
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
texts = ["Ваш текст для кластеризации", "Другой текст для анализа"]
tokenizer = Tokenizer()
tokenizer.fit_on_texts(texts)
sequences = tokenizer.texts_to_sequences(texts)
padded_sequences = pad_sequences(sequences, padding='post')
1.2. Векторизация
Можно использовать предобученные векторные представления слов, такие как Word2Vec или GloVe. Однако для более современных решений вы можете использовать BERT. Пример использования BERT для получения векторного представления текста:
from transformers import BertTokenizer, BertModel
import torch
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
# Преобразование текста в тензоры
inputs = tokenizer(texts, return_tensors='pt', padding=True)
outputs = model(**inputs)
# Получаем средние векторы по всем токенам
vecs = torch.mean(outputs.last_hidden_state, dim=1)
2. Кластеризация
После того как вы получили векторы, можно приступить к этапу кластеризации. TensorFlow не предоставляет встроенных функций для классической кластеризации, но вы можете использовать алгоритм K-средних, который легко интегрируется с вашими данными.
from sklearn.cluster import KMeans
num_clusters = 3 # количество классов
kmeans = KMeans(n_clusters=num_clusters)
kmeans.fit(vecs.detach().numpy())
3. Оценка и применение модели
Теперь, когда модель создана и данные кластеризованы, нужно понять, как предсказать новые тексты и визуализировать результаты.
3.1. Предсказание новых данных
Для предсказания новых данных нужно выполнить те же предварительные шаги: токенизацию и векторизацию, как это было сделано ранее. Затем использовать модель для предсказания класса:
new_text = ["Текст для классификации"]
new_inputs = tokenizer(new_text, return_tensors='pt', padding=True)
new_outputs = model(**new_inputs)
new_vec = torch.mean(new_outputs.last_hidden_state, dim=1)
prediction = kmeans.predict(new_vec.detach().numpy())
3.2. Экспорт результатов
Вы можете экспортировать результаты предсказания с использованием стандартных средств Python. Например, через pandas
:
import pandas as pd
results = pd.DataFrame({
'text': new_text,
'predicted_cluster': prediction
})
results.to_csv('clusters.csv', index=False)
4. Рекомендуемые ресурсы
- Документация TensorFlow и Keras: Убедитесь, что вы ознакомлены с актуальными примерами и функциями.
- Книги по машинному обучению: Рекомендуется читать про применение предобученных моделей и различные подходы к кластеризации текстов.
- Курсы по работе с BERT: Понимание принципов работы BERT позволит вам лучше использовать эту модель для векторизации текстов.
Заключение
Кластеризация текстовых данных с помощью TensorFlow требует хорошо организованного подхода к предварительной обработке, созданию векторных представлений и применению методов кластеризации. С осыщением задач, связанных с обработкой текстов, таких как токенизация и получение векторов, вы сможете добиться успешных результатов. Не забывайте следить за новыми методами и инструментами в этой области, так как она быстро развивается.