Страница 10 из 12
```python
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, LSTM, Dense
from sklearn.model_selection import train_test_split
# Создадим синтетический датасет для иллюстрации
texts = ["Сегодня хорошая погода.", "Завтра будет солнечно.", "Лето – лучшее время года.", "Дождь идет весь день."]
labels = [1, 1, 2, 0] # 0 – дождь, 1 – солнце, 2 – лето
# Токенизация и векторизация текстов (в данном случае, просто индексирование)
tokenizer = tf.keras.layers.TextVectorization()
tokenizer.adapt(texts)
# Создание модели LSTM
model = Sequential()
model.add(tokenizer)
model.add(Embedding(input_dim=len(tokenizer.get_vocabulary()), output_dim=16, input_length=6))
model.add(LSTM(16))
model.add(Dense(3, activation="softmax")) # Три класса: дождь, солнце, лето
# Компиляция модели
model.compile(loss="sparse_categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
# Создание фиктивных данных для обучения и теста
x_train, x_test, y_train, y_test = train_test_split(texts, labels, test_size=0.2, random_state=42)
# Обучение модели
model.fit(x_train, y_train, epochs=10, verbose=0) # Модель будет идеально подстраиваться под эти простые данные
# Оценка модели
accuracy = model.evaluate(x_test, y_test)[1] # Извлекаем точность из метрик
print(f"Точность: {accuracy:.4f}")
```
В данном коде мы имеем простой синтетический датасет с четырьмя текстами, каждому из которых присвоена уникальная метка. Модель LSTM будет идеально обучена для этого набора данных и даст точность 1.0. Однако в реальных задачах точность обычно ниже из-за сложности данных и пересечений между классами.
– Извлечение признаков из текста:
Сверточные нейронные сети (Convolutional Neural Networks, CNN) изначально разрабатывались для обработки изображений, но они также могут быть эффективно применены для анализа текста. Одной из ключевых особенностей CNN является их способность автоматически извлекать значимые признаки из данных, что делает их полезными инструментами для анализа текстов.
Рассмотрим как работают сверточные слои в анализе текста:
1. Сверточные фильтры: Сверточные слои используют фильтры (ядра), которые скользят (конволюцируются) по входным данным. В случае текста, фильтры скользят по последовательности слов (токенов). Фильтры представляют собой матрицы весов, которые определяют, какие признаки они будут извлекать. Фильтры могут быть разных размеров и выполнять разные операции.
2. Извлечение признаков: При скольжении фильтров по тексту они извлекают локальные признаки. Например, один фильтр может выделять биграммы (пары слов), а другой – триграммы (три слова подряд). Фильтры "апроксимируют" части текста, выявляя важные структуры, такие как фразы, ключевые слова или грамматические конструкции.
3. Свертка и пулинг: После применения фильтров, результаты свертки подвергаются операции пулинга (pooling). Пулинг уменьшает размерность данных, оставляя только наиболее важные признаки. Операция Max-Pooling, например, выбирает максимальное значение из группы значений, что позволяет выделить самые значимые признаки.
4. Слои полносвязной нейронной сети: После извлечения признаков из текста через сверточные слои, результаты передаются на полносвязные слои нейронной сети. Эти слои выполняют классификацию, регрессию или другие задачи в зависимости от поставленной задачи. Для анализа текста это может быть задачей классификации текстов на категории или определения тональности.
Пример кода для анализа текста с использованием сверточных слоев на Python и библиотеке TensorFlow/Keras:
import tensorflow as tf
from tensorflow.keras.layers import Embedding, Conv1D, GlobalMaxPooling1D, Dense
from tensorflow.keras.models import Sequential
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
import numpy as np
# Генерируем синтетический датасет для примера
texts = ["Этот фильм был ужасным!", "Отличный фильм, рекомендую.", "Сюжет оставляет желать лучшего."]
# Метки классов (положительный, отрицательный)
labels = [0, 1, 0]
# Токенизация и векторизация текстов
tokenizer = Tokenizer(num_words=1000)
tokenizer.fit_on_texts(texts)
sequences = tokenizer.texts_to_sequences(texts)
# Подготовка данных для модели
max_sequence_length = max([len(seq) for seq in sequences])
padded_sequences = pad_sequences(sequences, maxlen=max_sequence_length)
# Создание модели CNN для анализа текста
model = Sequential()
model.add(Embedding(input_dim=len(tokenizer.word_index) + 1, output_dim=100, input_length=max_sequence_length))
model.add(Conv1D(32, 3, activation='relu')) # Изменено ядро с 5 на 3 и количество фильтров с 128 на 32
model.add(GlobalMaxPooling1D())
model.add(Dense(1, activation='sigmoid'))
# Компиляция модели
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# Обучение модели
x_train = padded_sequences
y_train = np.array(labels)
model.fit(x_train, y_train, epochs=10)
# Оценка модели
test_text = ["Это лучший фильм, который я когда-либо видел!"]
test_sequence = tokenizer.texts_to_sequences(test_text)
padded_test_sequence = pad_sequences(test_sequence, maxlen=max_sequence_length)
result = model.predict(padded_test_sequence)
print("Результат анализа текста:", result)
В данном примере результатом будет число от 0 до 1, которое показывает вероятность положительного обзора. Например, если результат равен 0.85, это означает, что модель оценивает текст как положительный с вероятностью 85%. Если результат близок к 0, это означает, что текст скорее всего отрицательный, а если близок к 1, то текст скорее всего положительный.
Этот код создает простую модель CNN для анализа тональности текстов. Обратите внимание, что для реальных данных потребуется больше данных и тонкая настройка модели для достижения высокой точности.
– Обработка последовательностей:
Сверточные нейронные сети (CNN), изначально разработанные для обработки изображений, также могут быть применены к текстовым данным. Для этого текст обрабатывается как последовательность символов или слов, и каждый элемент последовательности (символ или слово) кодируется в числовой форме. Затем текст преобразуется в матрицу, где каждый столбец соответствует символу или слову, а строки – контекстным окнам (например, наборам слов или символов).
Давайте рассмотрим этот процесс более подробно:
Кодирование текста: Сначала текст кодируется в числовую форму. Это может быть выполнено с использованием токенизации, при которой каждому уникальному слову или символу назначается уникальное числовое значение (индекс). Эти числовые значения представляют слова или символы в числовой форме.
Представление в виде матрицы: Кодированный текст представляется в виде матрицы, где каждый столбец соответствует слову или символу, а строки представляют контекстные окна. Это означает, что каждая строка матрицы представляет собой последовательность слов или символов из исходного текста. Размерность матрицы зависит от размера контекстного окна и размера словаря (количество уникальных слов или символов).
Сверточные слои: Сверточные слои в CNN применяются к матрице, чтобы извлечь важные признаки из текста. Свертка происходит путем сканирования фильтров (ядер свертки) через матрицу. Эти фильтры могут выявлять различные шаблоны и особенности в тексте, такие как последовательности слов или символов. Результатом свертки является новая матрица, называемая картой признаков (feature map).