вводить
Привет мир! ! я недавно присоединилсяJatana.ai обслуживатьNLPИсследователь (стажер и), и его попросили изучить варианты использования классификации текста с использованием моделей глубокого обучения.
В этой статье я поделюсь своим опытом и знаниями, полученными во время экспериментов с различными архитектурами нейронных сетей.
Я расскажу о трех основных алгоритмах, таких как:
- Сверточная нейронная сеть (CNN)
- Рекуррентная нейронная сеть (RNN)
- Иерархическая сеть внимания (HAN)
Классификация текстов в наборах данных на датском, итальянском, немецком, английском и турецком языках.
вот так. ✅
Об обработке естественного языка (NLP)
широко используется в различных бизнес-задачах
Целью классификации текста является автоматическая классификация текстовых документов по одной или нескольким предопределенным категориям.
Некоторые примеры классификации текста:
- Понимание настроений аудитории из социальных сетей (???)
- Обнаружение спама и не-спама
- Автоматическая пометка запросов клиентов
- Разделите новостные статьи на предопределенные темы
Классификация текстов является очень активной областью исследований как в научных кругах, так и в промышленности. В этом посте я попытаюсь представить несколько разных подходов и сравнить их производительность, где реализация основана наKeras.
Весь исходный код и экспериментальные результаты доступны на jatana_research.в хранилищеоказаться.
Конвейер сквозной классификации текста состоит из следующих компонентов:
- Текст тренировки:Это входной текст, который наша модель обучения с учителем способна изучить и предсказать желаемый курс.
- Вектор признаков:Вектор признаков — это вектор, содержащий информацию, описывающую характеристики входных данных.
- Этикетка:Это предопределенные категории/классы, предсказанные нашей моделью.
- Алгоритм машинного обучения:Это алгоритм, с помощью которого наша модель может обрабатывать классификацию текста (в нашем случае: CNN, RNN, HAN).
- Прогностическая модель:Модели, обученные на исторических наборах данных, могут выполнять прогнозирование меток.
Проанализируйте наши данные:
Мы используем 3 типа наборов данных с различными классами, как показано в таблице ниже:
Классификация текста с использованием сверточных нейронных сетей (CNN):
CNNпредставляет собой класс искусственных нейронных сетей с глубокой прямой связью (связей между узлами
Я имею в виду Юн Кимбумагаа это Денни Бритцблог.
CNN обычно используются в компьютерном зрении, но недавно они стали применяться для решения различных задач НЛП.Результаты многообещающие?.
Давайте кратко рассмотрим, что происходит, когда мы используем CNN для текстовых данных с помощью графиков. Результат каждой свертки срабатывает при обнаружении специального шаблона. Изменяя размер ядер и объединяя их выходные данные, вы можете самостоятельно обнаруживать шаблоны нескольких размеров (2, 3 или 5 соседних слов).Шаблонами могут быть выражения (словесные ngrams?), такие как «Я ненавижу», «Очень хорошо», поэтому CNN может идентифицировать их в предложениях независимо от их местоположения.
В этом разделе я использую упрощенную CNN для построения классификатора. Поэтому сначала используйте Beautiful Soup, чтобы удалить некоторые теги HTML и некоторые нежелательные символы.
def clean_str(string):
string = re.sub(r“\\”,“”,string)
string = re.sub(r“\'”,“”,string)
string = re.sub(r“\” “,”,“string”
return string.strip()。lower()
texts = []; labels = []
for i in range(df.message.shape [0]):
text = BeautifulSoup(df.message [i ])
text.append(clean_str(str(text.get_text()。encode())))
for for in df ['class']:
labels.append(i)
Здесь я использовалGoogle Glove 6B вектор 100d.Его официальный документ:
Для неизвестного слова следующий код рандомизирует его вектор. Ниже приведена очень простая сверточная архитектура, использующая в общей сложности 128 фильтров размера 5 и максимальное объединение 5 и 35, следуяэтот блогпример.
sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
embedded_sequences = embedding_layer(sequence_input)
l_cov1= Conv1D(128, 5, activation='relu')(embedded_sequences)
l_pool1 = MaxPooling1D(5)(l_cov1)
l_cov2 = Conv1D(128, 5, activation='relu')(l_pool1)
l_pool2 = MaxPooling1D(5)(l_cov2)
l_cov3 = Conv1D(128, 5, activation='relu')(l_pool2)
l_pool3 = MaxPooling1D(35)(l_cov3) # global max pooling
l_flat = Flatten()(l_pool3)
l_dense = Dense(128, activation='relu')(l_flat)
preds = Dense(len(macronum), activation='softmax')(l_dense)
Это архитектура модели CNN.
Классификация текста с помощью рекуррентной нейронной сети (RNN):
ПервыйРекуррентная нейронная сеть (RNN)— это класс нейронных сетей, в которых связи между узлами образуют ориентированный граф вдоль последовательности. Это позволяет ему демонстрировать динамическое временное поведение временных рядов.
Использование знаний из внешних вложений может повысить точность RNN, поскольку оно интегрирует новую информацию (лексическую и семантическую) о словах, которые были обучены и уточнены на очень большом наборе данных. Предварительно обученные вложения, которые мы собираемся использовать,GloVe.
RNN могут выглядеть пугающе ?. Хотя они трудны для понимания, они очень интересны. Они заключают в себе очень красивый дизайн, который преодолевает недостатки традиционных нейронных сетей при работе с данными последовательности: текст, временные ряды, видео, последовательности ДНК и т. д.
RNN представляет собой серию блоков нейронной сети, которые связаны друг с другом как цепочка. Каждый передает сообщение преемнику. Если вы хотите погрузиться во внутренности, я настоятельно рекомендую Colah's.блог.
Такую же предварительную обработку можно выполнить и с Beautiful Soup. Мы будем иметь дело с текстовыми данными, которые являются типом последовательности. Порядок слов очень важен для понимания. Будем надеяться, что RNN справятся с этим и зафиксируют долгосрочные зависимости.
Чтобы использовать Keras для текстовых данных, нам сначала нужно их предварительно обработать. Для этого мы можем использовать класс Keras Tokenizer. Объект используетnum_wordsПараметр как параметр, это максимальное количество слов, которое нужно сохранить после токенизации, в зависимости от частоты слов.
MAX_NB_WORDS = 20000
tokenizer = Tokenizer (num_words=MAX_NB_WORDS) tokenizer.fit_on_texts(texts)
После того, как токенизатор установлен на данные, мы можем использовать его для преобразования текстовых строк в последовательности чисел. Эти числа представляют позицию каждого слова в словаре (представьте это как карту).
- В этом разделе я попытаюсь решить эту проблему, используя рекуррентную нейронную сеть и кодировщик LSTM на основе внимания.
- Используя кодировщик LSTM, мы намереваемся закодировать всю информацию о тексте в последнем выводе рекуррентной нейронной сети перед запуском сети прямой связи для классификации.
- Это очень похоже на нейронные машины перевода и последовательности обучения. Ниже приведеныИерархическое нейронное автокодирование абзацев и документовсхема устройства.
- Для этого я использую слои LSTM в Keras. В дополнение к прямому LSTM здесь я использовал двунаправленный LSTM и объединил последний вывод вывода LSTM.
- Keras предоставляет очень хорошую оболочку, называемуюдвусторонний, что сделает это кодирование легким. ты сможешьздесьПосмотреть пример кода
sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
embedded_sequences = embedding_layer(sequence_input)
l_lstm = Bidirectional(LSTM(100))(embedded_sequences)
preds = Dense(len(macronum), activation='softmax')(l_lstm)
model = Model(sequence_input, preds)
model.compile(loss='categorical_crossentropy',optimizer='rmsprop', metrics=['acc'])
Это архитектура модели RNN.
Классификация текста с использованием иерархической сети внимания (HAN):
Я сослался на эту исследовательскую работу"Иерархическое внимание к классификации веб-документов».. Это может быть отличным руководством для классификации документов с использованием HAN. Такую же предварительную обработку можно выполнить с помощью Beautiful Soup. Предварительно обученные вложения, которые мы будем использовать,GloVe.
- Здесь я создаю иерархическую сеть LSTM. Мне пришлось структурировать ввод данных как 3D вместо 2D, как описано в двух разделах выше.
- Таким образом, входной тензор будет [количество комментариев в пакете, количество предложений, количество слов в каждом предложении].
tokenizer = Tokenizer(nb_words=MAX_NB_WORDS)
tokenizer.fit_on_texts(texts)
data = np.zeros((len(texts), MAX_SENTS, MAX_SENT_LENGTH), dtype='int32')
for i, sentences in enumerate(reviews):
for j, sent in enumerate(sentences):
if j< MAX_SENTS:
wordTokens = text_to_word_sequence(sent)
k=0
for _, word in enumerate(wordTokens):
if(k<MAX_SENT_LENGTH and tokenizer.word_index[word]<MAX_NB_WORDS):
data[i,j,k] = tokenizer.word_index[word]
k=k+1
После этого мы можем использовать волшебную функцию Keras TimeDistributed для построения иерархического входного слоя, как показано ниже. Мы также можем обратиться к этомустатья.
embedding_layer=Embedding(len(word_index)+1,EMBEDDING_DIM,weights=[embedding_matrix],
input_length=MAX_SENT_LENGTH,trainable=True)
sentence_input = Input(shape=(MAX_SENT_LENGTH,), dtype='int32')
embedded_sequences = embedding_layer(sentence_input)
l_lstm = Bidirectional(LSTM(100))(embedded_sequences)
sentEncoder = Model(sentence_input, l_lstm)
review_input = Input(shape=(MAX_SENTS,MAX_SENT_LENGTH), dtype='int32')
review_encoder = TimeDistributed(sentEncoder)(review_input)
l_lstm_sent = Bidirectional(LSTM(100))(review_encoder)
preds = Dense(len(macronum), activation='softmax')(l_lstm_sent)
model = Model(review_input, preds)
Это архитектура модели HAN.
результат
Ниже приведен график точности Loss и loss pl.
Обратите внимание ?:
- Основываясь на приведенных выше графиках, CNN добилась хорошей точности проверки и высокой согласованности, а RNN и HAN также достигли высокой точности, но они не согласованы во всех наборах данных.
- Было обнаружено, что RNN являются наихудшей архитектурой в готовых к производству сценариях.
- Модель CNN превосходит две другие модели (RNN и HAN) с точки зрения времени обучения, но если у нас есть огромный набор данных, HAN может работать лучше, чем CNN и RNN.
- Для наборов данных 1 и 2 с большим количеством обучающих выборок HAN достиг наилучшей точности проверки, в то время как, когда обучающие выборки очень малы, HAN также не работает (набор данных 3).
- Когда обучающих выборок немного (набор данных 3), CNN достигла наилучшей точности проверки.
Улучшение производительности:
Для оптимальной работы ? мы можем:
- Точная настройка гиперпараметров. Гиперпараметры — это переменные, устанавливаемые перед обучением, которые определяют структуру сети и то, как сеть обучается. (например: скорость обучения, размер партии, количество эпох). Тонкую настройку можно выполнить следующими способами: ручной поиск, поиск по сетке, случайный поиск...
- Улучшенная предварительная обработка текста: входные данные могут быть лучше предварительно обработаны в соответствии с потребностями набора данных, например, удаление некоторых специальных символов, чисел, стоп-слов и т. д.
- Используйте Dropout Layer: Dropout — это метод регуляризации, который позволяет избежать переобучения (повышает точность проверки), тем самым улучшая обобщение.
настройка инфраструктуры
Все вышеперечисленные эксперименты проводились сГрафический процессор Nvidia Tesla K808-ядерный виртуальный ЦП.
Кроме того, все эксперименты проводились вRahul Kumarпод руководством руководства.
Кроме того, я также хотел бы поблагодаритьJatana.ai Предоставили мне очень хорошую инфраструктуру и полную поддержку ?.
благодарныйRahul Kumar.
Английский оригинал: Отчет о классификации текстов с использованием CNN, RNN и HAN
Для получения дополнительных статей, пожалуйста, посетите:www.apexyun.com
Общедоступный номер: Galaxy № 1
Контактный адрес электронной почты: public@space-explore.com
(Пожалуйста, не перепечатывайте без разрешения)