Классификация текстов веб-сайтов с помощью CNN

искусственный интеллект TensorFlow регулярное выражение модульный тест

В этой статье в основном описываются некоторые базовые знания об обработке естественного языка и о том, как использовать модель CNN для классификации текста веб-страницы веб-сайта, просканированного из Интернета.

Wod2Vec

Технология векторных слов заключается в преобразовании слов в векторную форму, потому что все наши классификаторы, в конце концов, являются векторами, поэтому предварительная обработка естественного языка часто требует векторизации. Прежде чем использовать svm в библиотеке sklearn для классификации текста, это можно сделать с помощьюCountVectorizer()иTfidfTransformer()векторизовать. Операции, выполняемые этими двумя функциями, представляют собой самую простую векторизацию с использованием функций частоты слов и обратной частоты слов в документе, но когда объем наших слов велик, построенная матрица будет очень большой (возможно, она внутренне выполняет сжатие матрицы и другие оптимизации), и такие основные признаки слова не могут отражать более сложные семантические признаки, поэтому нам нужно искать более эффективные векторные методы.

запущен гуглWord2VecТехнология – очень популярный метод. Учитывая центральное слово, Word2Vec пытается найти векторные представления различных слов, максимизируя логарифмическую вероятность контекстного слова и изменяя вектор с помощью стохастического градиентного спуска (SGD). Следовательно, он может показать линейную связь между различными векторами слов, то есть с помощью отображения нейронной сети можно зафиксировать некоторые разные грамматические и семантические понятия.

Классификация текстов CNN

CNN используется для классификации текста, потому что операция свертки CNN может извлекать некоторые важные функции текста. Реализовать основную ссылку Convolutional Neural Networks for Sentence Classification.Эта статья.

предварительная обработка данных

Для текста, спустившегося с веб-страницы, должны быть выполнены такие операции, как извлечение текста, удаление спецсимволов, сегментация слов, соединение слов. Затем нам нужно заполнить текст, то есть выравнивание, и унифицировать размеры вектора. Затем поместите его в модель Word2Vec для обучения, а затем получите словарь, а также получите векторную карту каждого слова.
Функция data_helper() предназначена для предварительной обработки данных. Включая чтение данных, категории, которые нам нужно разделить, составляют 12 категорий, поэтому метка представлена ​​​​в виде 12-мерного вектора, а соответствующий класс данных установлен на 1, а остальные — на 0.

модель CNN

Эта модель содержит только один сверточный слой и один объединяющий слой. Свертка имеет три длины [3, 4, 5].
Таким образом, размер ядра свертки должен быть трехмерным вектором: [размер ядра свертки, размер встроенного измерения, количество ядер свертки], но размер специального ядра свертки, указанный в тензорном потоке, также имеет количество каналов, потому что это не текст. Если изображение текстовое, установите количество каналов равным 1.
Затем результат получается с помощью нелинейной функции и операции объединения. Наконец, будет изменена форма, чтобы соединить все функции вместе и расширить их в одномерный вектор, который используется для последующего вычисления вероятности softmax.

Код ядра модели выглядит следующим образом:

ooled_outputs = []
for i, filter_size in enumerate(filter_sizes):
    with tf.name_scope("conv-maxpool-%s" % filter_size):
        # 卷积层
        filter_shape = [filter_size, embedding_size, 1, num_filters]
        W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W")
        b = tf.Variable(tf.constant(0.1, shape=[num_filters]), name="b")
        conv = tf.nn.conv2d(
            self.embedded_chars_expanded,
            W,
            strides=[1, 1, 1, 1],
            padding="VALID",
            name="conv")
        # 通过非线性函数
        h = tf.nn.relu(tf.nn.bias_add(conv, b), name="relu")
        # 池化操作
        pooled = tf.nn.max_pool(
            h,
            ksize=[1, sequence_length - filter_size + 1, 1, 1],
            strides=[1, 1, 1, 1],
            padding='VALID',
            name="pool")
        pooled_outputs.append(pooled)
# 连接所有pooled features
num_filters_total = num_filters * len(filter_sizes)
self.h_pool = tf.concat(3, pooled_outputs)
self.h_pool_flat = tf.reshape(self.h_pool, [-1, num_filters_total])

предотвратить переоснащение

Чтобы предотвратить переоснащение, могут быть добавлены такие меры, как регуляризация и отсев. Значение вероятности отсева по умолчанию установлено на 0,5, что на самом деле необходимо скорректировать в соответствии с компромиссом смещения и дисперсии в процессе обучения. Регуляризация выбирает регуляризацию L2, потому что модель не слишком сложна, значение по умолчанию равно 0, и ее можно настроить в соответствии с реальной ситуацией.

Проблемы, возникающие при реальном обучении

Memory Error

В начале я преобразовал в общей сложности более 100 000 фрагментов текстовых данных в векторизованные массивы в форме numpy и выполнил:

x_test = np.array(all_vectors)

На этом шаге будет ошибка памяти, сказал st, потому чтоnp.rarrayМетод копирует весь массив в память за один раз, может потому что памяти не хватает, но я запускал на сервере, там десятки G памяти, размер x_test должен бытьколичество текстов x максимальная длина текста x embedding_size. Проверьте предыдущие шаги обработки данных и обнаружите, что сегментация слов выполняется непосредственно по одному слову, а максимальная длина текста будет очень большой, поэтому окончательный вектор x_test будет очень большим. После этого я перешел на сегментацию на основе слов и все равно обнаружил ошибку памяти.
ст говорит использоватьnp.asarrayметод, который не копирует данные в память за один раз. Я попробовал, и ошибки памяти не было. Таким образом, последняя причина должна заключаться в том, что длина текста слишком велика, значение embedding_size установлено равным 128, а размер матрицы, полученный путем умножения трех последних векторов, будет очень большим.
Другое решение состоит в том, чтобы заполнить текст, длина которого недостаточна для максимальной длины в процессе заполнения текста, поэтому, если есть много коротких текстов, конечная матрица на самом деле будет иметь много нулевых значений, что является очень разреженной матрицей, поэтому вы можно рассмотреть возможность использования разреженного матричного способа хранения.

Серьезное переоснащение

Во время обучения данные обучения делятся на 1:0,8, часть обучения и часть проверки. Правильная скорость модели обучающего набора может достигать более 90%, а производительность проверочного набора близка к кривой обучающего набора с небольшой разницей. Но он не очень хорошо работает с реальными тестовыми данными (еще одна партия неразмеченных данных). Последняя причина может заключаться в том, что модель серьезно переобучена, потому что обучающие данные сопоставляются с использованием ключевых слов (категория веб-страницы и ключевые слова в содержании веб-страницы), а качество данных очень хорошее. Однако данные, полученные во время теста, представляют собой очередную порцию данных, взятых из Интернета.Хорошие и плохие смешаны, а производительность модели не идеальна.
Я пытался увеличить вероятность отсева и добавить регуляризацию и другие меры, но эффект не очевиден. Должно быть, влияние набора данных относительно велико.

Производительность сильно различается в зависимости от категории

Когда окончательно обученную модель протестировали на другом наборе данных, оказалось, что категорий 12, причем производительность разных категорий сильно отличалась, и не все категории можно было различить.
В итоге было установлено, что причина заключалась в том, что выборки в обучающей выборке не были сбалансированы, а количество выборок в разных категориях было совершенно разным. Улучшена производительность по различным категориям в тестовом наборе данных. И двенадцать категорий полностью разделены.

Суммировать

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

Соответствующий код уже есть на github.По сравнению с исходным кодом, data_helper.py был переписан, и добавлен eval_helper.py для проверки согласованности размеров реальных тестовых данных и т. д. И он используется для извлечения особенностей предложений, извлеченных в CNN, что являетсяembedding_size x filer_numВектор этого признака можно использовать для последующих задач.код нажмите здесьпопроси звезду~

использованная литература