Это часть серии статей о классификации комментариев к обзорам Yelp с использованием методов глубокого обучения и встраивания слов. В последней части (части 1) этой серии я показал, как мы можем получить вложения слов и классифицировать комментарии на основе LSTM. В этой части я использую один слой CNN поверх LSTM для сокращения времени обучения.

Ниже приводится краткое содержание различных частей:

  • Часть-1: В этой части я строю нейронную сеть с LSTM, и при подборе нейронной сети к задаче классификации использовались вложения слов.
  • Часть 2: в этой части я добавляю дополнительный одномерный сверточный слой поверх слоя LSTM, чтобы сократить время обучения.
  • Часть-3: В этой части-3 я использую ту же сетевую архитектуру, что и часть-2, но использую предварительно обученные вложения 100 размерных слов перчатки в качестве начального ввода.
  • Часть 4. В части 4 я использую word2vec для изучения встраивания слов.

Импортировать библиотеки

# Keras
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from keras.models import Sequential
from keras.layers import Dense, Flatten, LSTM, Conv1D, MaxPooling1D, Dropout, Activation
from keras.layers.embeddings import Embedding
## Plotly
import plotly.offline as py
import plotly.graph_objs as go
py.init_notebook_mode(connected=True)
# Others
import nltk
import string
import numpy as np
import pandas as pd
from nltk.corpus import stopwords

from sklearn.manifold import TSNE

Обработка данных

Обработка данных включает следующие этапы:

  1. Удалить числовые и пустые тексты
  2. Преобразуйте пять классов в два класса (положительный = 1 и отрицательный = 0)
  3. Убрать пунктуацию из текстов
  4. Преобразование слов в нижний регистр
  5. Удалить стоп-слова
  6. Стемминг

Детальный код обработки данных можно найти на П арт-1.

Создайте нейронную сеть с LSTM и CNN

Модель LSTM работала хорошо. Однако тренировка трех эпох занимает целую вечность. Один из способов сократить время обучения - улучшить сеть, добавив «сверточный» слой. Сверточные нейронные сети (CNN) происходят от обработки изображений. Они пропускают «фильтр» над данными и вычисляют представление более высокого уровня. Было показано, что они на удивление хорошо работают с текстом, даже несмотря на то, что они не обладают способностью обработки последовательностей LSTM.

def create_conv_model():
    model_conv = Sequential()
    model_conv.add(Embedding(vocabulary_size, 100, input_length=50))
    model_conv.add(Dropout(0.2))
    model_conv.add(Conv1D(64, 5, activation='relu'))
    model_conv.add(MaxPooling1D(pool_size=4))
    model_conv.add(LSTM(100))
    model_conv.add(Dense(1, activation='sigmoid'))
    model_conv.compile(loss='binary_crossentropy', optimizer='adam',    metrics=['accuracy'])
    return model_conv
model_conv = create_conv_model()
model_conv.fit(data, np.array(labels), validation_split=0.4, epochs = 3)
### Training output
Train on 1004322 samples, validate on 669548 samples
Epoch 1/3
1004322/1004322 [==============================] - 20429s - loss: 0.2981 - acc: 0.8711 - val_loss: 0.2786 - val_acc: 0.8814
Epoch 2/3
1004322/1004322 [==============================] - 3363s - loss: 0.2657 - acc: 0.8871 - val_loss: 0.2774 - val_acc: 0.8820
Epoch 3/3
1004322/1004322 [==============================] - 11838s - loss: 0.2495 - acc: 0.8954 - val_loss: 0.2768 - val_acc: 0.8841

Визуализация встраивания слов

В этом подразделе я хочу визуализировать веса встраивания слов, полученные из обученных моделей. Вложения слов со 100 измерениями сначала сокращаются до двух измерений с помощью t-SNE. У Tensorflow есть отличный инструмент для красивой визуализации вложений, но здесь я просто хочу визуализировать отношения слов.

## Get weights
conv_embds = model_conv.layers[0].get_weights()[0]
## Plotting function
def plot_words(data, start, stop, step):
    trace = go.Scatter(
        x = data[start:stop:step,0], 
        y = data[start:stop:step, 1],
        mode = 'markers',
        text= word_list[start:stop:step]
    )
    layout = dict(title= 't-SNE 1 vs t-SNE 2',
                  yaxis = dict(title='t-SNE 2'),
                  xaxis = dict(title='t-SNE 1'),
                  hovermode= 'closest')
    fig = dict(data = [trace], layout= layout)
    py.iplot(fig)
## Visualize words in two dimensions 
conv_tsne_embds = TSNE(n_components=2).fit_transform(conv_embds)
plot_words(conv_tsne_embds, 0, 2000, 1)

Большое спасибо за чтение. Полный код можно найти на Github. Дайте мне знать, если у вас возникнут вопросы или эта статья нуждается в исправлении. В следующей части я буду обсуждать, как мы можем использовать предварительно обученные вложения слов Glove и использовать их для классификации.