Как кластеризовать текст с использованием TensorFlow

Вопрос или проблема

Извините за любые неточности из-за начальной стадии в этой области.

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

На данный момент я много читал и экспериментировал с несколькими Colabs, но ни один из них не указывает на технику кластеризации, когда дело доходит до текста (только классификация).

Суть в том, что я не имею ни малейшего представления о том, как можно классифицировать текст, и я думал, что рекурсивный процесс, используемый TensorFlow, предложит лучший подход и результаты, чем то, что я обычно получаю, используя K-Means.

Я сам составил Colab, но сейчас это настоящий беспорядок из примеров, поэтому лучше не делиться им на этом этапе.

Вкратце, я токенизировал ключевые слова, создал словарь, преобразовал свой текст в плотную матрицу и затем начал использовать модели. Однако когда дело доходит до использования функции fit, я сталкиваюсь с серией ошибок, самой последней из которых является “ValueError: Нет градиентов для любой переменной”.

Я был бы признателен за поддержку и советы по материалам для чтения, если такие имеются. Выпуск TensorFlow 2 делает вещи еще более сложными, так как примеров стало еще меньше, и попытки адаптировать примеры для TF1 не всегда работают.

Спасибо

ОБНОВЛЕНИЕ:

Я очистил проект, основываясь на другом примере, взятом здесь. Ясно, что оригинальный пример работал, а мой – нет.

В моей версии я пытаюсь обучить модель, чтобы она научилась трем различным классам. Мои вопросы на данный момент:

  • Как я могу создать подходящие наборы меток, когда плотный выход больше 1?

    Горячее кодирование, похоже, не является вариантом, так как форма метки не выводится из размера массива, как я изначально думал, а из самих значений.

  • Как я могу предсказать новое невиданное ключевое слово/текст?

    Здесь мне нужно постоянно обучать модель, чтобы “увидеть” новые ключевые слова. Я бы этого ожидал, но как?

  • Как я могу распечатать/экспортировать выход моих предсказаний?

Я не вижу много преимуществ в использовании TensorFlow в этом случае. TensorFlow (и PyTorch) – отличные инструменты, если вам нужно вычислить градиенты функции потерь и использовать их в оптимизаторе. Кластеризация не предоставляет такого обучения, которое позволило бы обучить RNN или Transformer, которые дадут вам разумное представление.

В вашем случае я бы попытался:

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

  • представить текст с помощью BERT

А затем использовать алгоритм кластеризации на ваш выбор. Вы действительно можете реализовать k-средние или иерархическую кластеризацию в TensorFlow.

Вы можете делать это в TensorFlow или нет, на мой взгляд.

  1. Один из способов – использовать предобученные встраивания или какую-то предобученную модель, такую как BERT, чтобы сгенерировать представление y

  2. Вы также можете сделать это с моделью TensorFlow. Например, вы можете подать каждый кусочек текста (обработанный как последовательность токенов) в автокодировщик, взять сжатое представление ваших данных и затем применить некоторые техники кластеризации, такие как k-средние. Вы можете использовать как сверточные, так и RNN-слои для Кодировщика и Декодировщика. Модель TensorFlow может работать как с предобученными, так и с обученными с нуля встраиваниями. Вы можете создать свои собственные, поставив слой Embedding() на входе вашей нейронной сети.

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

Оцените материал
Добавить комментарий

Капча загружается...