Цель
Выполните классификацию документов по четырем определенным категориям (Мир, Спорт, Бизнес, Наука/Технология). Сравните точность классификатора с различными моделями, начиная от наивного Байеса и заканчивая сверточной нейронной сетью (CNN) и RCNN. Используя различные методы разработки функций и дополнительные функции обработки естественного языка (NLP), можно создать точный классификатор текста.
Классификация документов/текстов
Классификация документов/текстов — важная задача, которая имеет варианты использования во многих реальных задачах. Назначение тем документам, таким как новостные статьи, книги, веб-страницы, сообщения в социальных сетях, имеет множество применений, таких как фильтрация спама, анализ настроений, пометка запросов клиентов, обнаружение поддельных новостей и т. д. Чрезвычайно большой размер естественного языка, неограниченный характер и двусмысленность привели к двум проблемам, когда используя стандартные подходы к синтаксическому анализу, которые полагались исключительно на символические, созданные вручную правила: неуправляемые многочисленные правила и неспособность понять неграмматический текст, что-то, что легко понятно человеку. Постановка задачи, подходящая для машинного обучения. НЛП — это отрасль науки о данных, состоящая из систематических процессов анализа, понимания и извлечения информации из текстовых данных умным и эффективным способом. Используя НЛП и его компоненты, можно упорядочивать массивные фрагменты текстовых данных, выполнять многочисленные автоматизированные задачи и решать широкий спектр проблем, таких как автоматическое суммирование, машинный перевод, распознавание именованных сущностей, извлечение отношений, анализ настроений, распознавание речи, сегментация по темам и т. д.
Предыдущие исследования в этой области
В последние несколько лет нейронные сети, основанные на плотных векторных представлениях, давали превосходные результаты в различных задачах НЛП. Эта тенденция вызвана успехом встраивания слов и методов глубокого обучения. Традиционные системы NLP, которые были сформированы на основе правил машинного обучения, всегда в основном полагались на созданные вручную функции, тогда как глубокое обучение обеспечивало существенную разницу с многоуровневым автоматическим обучением представлению функций. Со временем, когда успех простой структуры глубокого обучения был установлен по сравнению с традиционными методологиями машинного обучения, несколько задач НЛП изменили свое внимание на эту новую область. Был предложен не только сложный алгоритм, основанный на глубоком обучении, но и значительно улучшены такие приложения, как маркировка семантических ролей и распознавание именованных объектов.
Набор данных
Выбранный набор данных представляет собой набор данных «Новости», состоящий из 1 20 000 новостных статей для обучения, разделенных на четыре категории: мир, спорт, бизнес, наука / техника. Он также включает 7600 тестовых образцов в формате csv. Я использовал библиотеку pandas для загрузки набора данных.
Предварительная обработка текста
Он состоит преимущественно из трех этапов:
- Токенизация — речь идет о разделении строк текста на более мелкие части или «токены». Абзацы можно разбить на предложения, а предложения — на слова.
- Удаление шума — на этом этапе я дополнительно очистил текст. Я добился этого, удалив знаки препинания, стоп-слова, лишние пробелы и многие другие точки данных, которые не имели отношения к задачам НЛП. Библиотека NLTK имеет встроенные функции для многих таких операций. Краткое описание нескольких предпринятых шагов:
- Удалены теги HTML: поскольку статьи, удаленные из Интернета, могут содержать теги HTML, поэтому для удаления тегов HTML был использован пакет Python BeautifulSoup.
- Удалите стоп-слова, символы с диакритическими знаками и знаки препинания. Поскольку стоп-слова, знаки препинания, лишние пробелы и символы с диакритическими знаками не добавляют полезной информации в наш алгоритм обработки текста, мы удалили их с помощью таких модулей, как Unicode и spaCy.
- Обращение к числам: в нашем приложении числа не дают каких-либо существенных знаний, поэтому мы их удалили. Во-первых, чтобы стандартизировать текст, числовые слова преобразовали в числовую форму, а затем удалили их из текстовых данных.
- Нормализация. В этом процессе я стандартизировал текст в единой последовательности. Я преобразовал текст в нижний регистр и с помощью библиотек NLTK выполнил стемминг и лемматизацию. Стемминг относится к удалению суффиксов, прикрепленных к слову, а лемматизация относится к сохранению корневого слова слова. Мы использовали лемматизацию для наших текстовых данных, потому что она работала лучше с предварительно обученным встраиванием слов.
Разработка функций
Текстовые файлы на самом деле представляют собой наборы слов (упорядоченные). Чтобы запустить алгоритмы машинного обучения, нам нужно преобразовать текстовые файлы в векторы числовых признаков.
Мы будем реализовывать следующие различные идеи, чтобы получить соответствующие функции из нашего набора данных.
- CountVectors — я использовал модуль CountVectorizer библиотеки scikit-learn для векторизации предложений. Он генерирует словарный запас для всех уникальных слов предложения. Из этого количества слов создается вектор признаков. По сути, это модель Bag of Words BOW.
- Уровень слова векторов TF-IDF. Теперь, чтобы присвоить вес вышеуказанному вектору признаков, мы использовали логику частоты терминов — обратная частота документа. Мы оценили слова на основе их частоты терминов (количество слов/количество слов) и их обратной частоты, т. е. присутствия в каждом из документов. Он низко оценивает повторяющиеся слова.
- TF-IDF Vectors Уровень N-грамм — в этом подходе для достижения лучших результатов объедините N (›= 2) слов для формирования N-грамм. Биграммы (N=2) являются наиболее оптимальными и наилучшим образом передают наиболее важную информацию среди других N-грамм.
- TF-IDF Vectors Уровень персонажа - уровень персонажа
- Функции, основанные на тексте / НЛП — я попытался добавить дополнительные функции НЛП, а именно количество слов, количество символов, среднюю плотность слов, количество слов в заголовке, но я обнаружил, что они вредны для точности модели. Так я их удалил
ВЫБОР МОДЕЛИ И ОБУЧЕНИЕ
Классические модели (используются в качестве базовой модели)
Наивный байесовский классификатор. Этот метод классификации основан на теореме Байеса и предполагает независимость предикторов.
Логистическая регрессия — эта модель использует логистическую/сигмовидную функцию для расчета вероятностей различных значений категориальной зависимой переменной при наличии одного или нескольких предикторов. Логит-функция представляет собой оценку логарифма шансов в пользу события и выводит s-образную кривую с оценками вероятности.
Модель бэггинга (случайный лес) — модели случайного леса представляют собой тип ансамблевых моделей, в частности моделей бэггинга. Основная цель этих моделей - уменьшить переоснащение. Они работают на снижение сложности модели.
XG Boost — повышающие модели относятся к типу ансамблевых моделей и работают над повышением скорости прогнозирования модели. Эта модель представляет собой метаалгоритм для уменьшения предвзятости и дисперсии в обучении с учителем. Одной из его сильных сторон является то, что он преобразует слабых учеников, т.е. классификаторы, слабо коррелирующие с истинной классификацией, в более сильные.
Чтобы еще больше улучшить производительность модели и изучить последние достижения в НЛП, я использовал следующие модели нейронных сетей для постановки задачи:
Мелкая нейронная сеть
Нейронные сети или нейронные сети с прямой связью. У них есть несколько слоев нейронов, расположенных так же, как в человеческом мозгу. Входной вектор объектов обрабатывается на каждом слое, а затем перенаправляется на следующий скрытый слой. Выходные данные для следующего слоя создаются путем умножения входных данных на вес w и смещение b. Все это суммировалось и затем передавалось в функцию активации. У меня есть функция выпрямленной линейной единицы (ReLU). Алгоритм инициализирует веса и обучает их, используя обратное распространение. Мы уменьшили ошибку предсказанного вывода, он использует методы оптимизации, такие как градиентный спуск.
Параметры
Чтобы иметь минимальные потери при обучении и максимизировать точность, я указал эпохи 10. Таким образом, в среднем я тренировал свою модель за 10 раундов. Кроме того, я установил размер пакета равным 50. По сути, это означает, что я использовал 50 выборок в одном прямом и обратном проходе, чтобы оптимизировать скорость вычислений и потребление памяти. Используется 10-процентное разделение проверки, это разделение обучающих данных для расчета функции потерь, и его следует хранить отдельно от тестового набора, чтобы не позволить тестовому набору влиять на модель.
Больше функций
Вложения слов (было обнаружено, что они хорошо работают с нейронными сетями).
В этом я стремился представить слова в виде векторов. Он сохраняет контекстуально похожие слова и сводит многомерные признаки слов к малоразмерным векторам признаков. Модель глубокого обучения, а именно RNN и CNN, используют ее в своем алгоритме. Я использовал GioVe для встраивания текста в слова. Модуль Word2Vec имеет модуль предварительной обработки, непрерывный пакет слов и скип-грамм. Последние две функции, по сути, представляют собой неглубокие нейронные сети.
Использование предварительно обученных вложений слов
Среди самых популярных методов — Word2Vec, разработанный Google, и GloVe (Global Vectors for Word Representation), разработанный Stanford NLP Group.
Я использовал Glove, так как он быстрее, хотя и менее точен, чем Word2Vec. GloVe использует матрицу совпадения и матричную факторизацию для уменьшения размерности.
Скачать-перчатка(822mb) — http://nlp.stanford.edu/data/glove.6B.zip
Глубокая нейронная сеть
Я использовал keras для настройки глубокой нейронной сети. Он опирается на специализированные или специализированные тензорные библиотеки: Theano и tensor flow 2.1. keras не обрабатывает тензорные манипуляции и дифференцирование. Слой внедрения принимает предварительно вычисленные целые числа, использует матрицу внедрения предварительно обученных векторов для назначения плотных векторов. Этот результат подается в плоский слой для последовательного ввода. Оттуда подается в плотный слой. Я также использовал GlobalMaxPooling ID после встраивания. Это уменьшает размер выборки, выбирая максимальное значение всех признаков.
Сверточная нейронная сеть (Covnets)
Это специализированная глубокая нейронная сеть для выявления специфических тенденций, которая используется для выделения наиболее важной информации в предложении. Скрытые слои, называемые сверточными слоями, начинаются с выборки входных признаков размеров фильтров ядра. Берется скалярное произведение патча и умноженных весов фильтра. Я использовал одномерную CNN, на которую не влияют переводы, т. е. она может понимать закономерности в разных позициях. Патч фильтров скользит по матрице встраивания и извлекает определенный шаблон n-граммы. Таким образом, ядра продолжают покрывать большую часть документа, пока не будет создано глобальное суммирование функций. Стратегия максимального объединения для подвыборки входных данных с использованием функции max применяется после каждого сверточного слоя. У него есть два применения: он обеспечивает вывод фиксированной длины и уменьшает размерность вывода наиболее важных функций. Такие слои складываются несколько раз, чтобы улучшить извлечение абстрактной информации.
Рекуррентная нейронная сеть двунаправленного GRU
В RNN выходы активации распространяются в обоих направлениях. Это приводит к зацикливанию, которое обеспечивает состояние нейронов, дающее им возможность запоминать полученные знания. Эта память дает силу RNN, но также создает проблему исчезающего градиента. Проблема заключается в медленной скорости обучения и настройке параметров из-за обучения с большим числом. слоев. Для решения этой проблемы используются LSTM (долговременная кратковременная память), но они часто сложны и медленны в вычислительном отношении. В этой статье используется более новая методика GRU. GRU предоставляет полную память и имеет только 2 вентиля вместо 3 в случае LSTM. Он обеспечивает производительность, аналогичную LSTM, но быстрее обучается.
Настройка гиперпараметров
Чтобы улучшить модель, я также прибегнул к использованию различных векторов признаков и других комбинаций настройки гиперпараметров. Настройка параметров — важный шаг, так как я обнаружил, что то, что работает для одной проблемы, может не подойти для другой. Я использовал рандомизированный поиск по сетке для настройки. Он принимает списки параметров и запускает модель с каждой комбинацией параметров. Затем я использовал классификатор Keras для создания моделей keras. При этом мы получаем доступ к технике перекрестной проверки библиотеки scikit-learn. Я использовал k-кратную перекрестную проверку. Я использовал k в диапазоне от 10 до 15. Это по существу делит мой набор данных на k наборов, из которых k-1 наборов используется для обучения модели, а оставшийся набор используется для тестирования модели. Это позволило мне запустить k разных прогонов, где каждый раздел когда-то использовался в качестве тестового набора. Конечным результатом стало то, что я получил значения параметров, обеспечивающие наилучшие характеристики, которые я использовал в своей окончательной модели.
Результат
Модель, которая дала мне наилучшую производительность на тестовых данных, — это CNN с точностью 90,87% с 10 эпохами. Модель можно использовать для обработки любого документа и прогнозирования для него класса. Используя несколько случайных новостных статей в Интернете, я обнаружил, что прогнозы довольно верны.
Заключение
В то время как классические модели обеспечивали хорошую точность, модели нейронных сетей еще больше улучшили ее. С большим количеством данных модели глубокого обучения превзойдут классические модели. Использование встраивания слов обеспечило дополнительное повышение точности на 2–3% и сокращение времени обучения. CNN показала лучшую производительность в нейронных сетях, но RNN по-прежнему давала хорошие результаты. Больше обучающих данных может заставить RNN работать лучше, чем CNN.