Оценка общих библиотек НЛП в реальном времени (с фрагментами кода)

С тех пор, как я начал работать над NLP (Обработка естественного языка), мне было интересно, какая из них является лучшей библиотекой NLP, которая может удовлетворить большинство наших общих требований NLP. Хотя это правда, что не существует универсального решения, и выбор библиотеки будет зависеть от поставленной задачи, мне все еще было любопытно, как бы сравнивались разные библиотеки, если бы их сравнивали с очень простой задача.

Помня об этом, я надел шляпу разработчика и приступил к написанию кода Python с использованием различных библиотек, чтобы оценить их с точки зрения очень распространенной задачи. Чтобы не усложнять задачу, я решил использовать для оценки задачу классификации текста Twitter. Наиболее распространенными сегодня библиотеками NLP являются NLTK, Spacy, WordBlob, Gensim и, конечно, архитектуры Deep Neural Network, использующие ячейки LSTM (Long Short Term Memory) или GRU (Gated Recurrent Unit).

Постановка проблемы

Набор данных, который я использую, состоит из коллекции твитов Twitter. Некоторые твиты отмечены как расистские, а другие нет. Это классическая задача бинарной классификации, основанная на контролируемом обучении. Наша работа - создавать модели на основе разных библиотек и использовать их для классификации ранее невидимого текста как расистского или нет.

Вот некоторые из доступных твитов:

Метка 1 означает, что твит расистский, а метка 0 - нет.

Для краткости я остановлюсь только на ключевых частях кода. Чтобы получить полный код, посетите мой репозиторий Машинное обучение на GitHub. Поскольку я уже очистил набор данных и выполнил EDA (исследовательский анализ данных), я также не буду здесь останавливаться на этих деталях.

Здесь я сосредоточусь на пяти различных библиотеках - NLTK, WordBlob, Spacy with CNN, Spacy с векторами документов и, наконец, модель глубокой нейронной сети с ячейками Bidirectional LSTM.

Я буду использовать оценки ROC-AUC и F1-Score в качестве показателей оценки.

Итак, приступим.

NLTK

Начнем с пакета НЛТК. Здесь мы использовали библиотеку NLTK для токенизации и лемматизации твитов и модель Word2Vec Gensim для создания векторов слов. Наконец, для обучения и вывода используется модель XGBoost Classifier. Ниже приведен фрагмент, содержащий соответствующие разделы кода.

Используя эту технику, мне удалось получить показатель ROC-AUC, равный 0,8, и показатель F1, равный 0,68.

TextBlob

TextBlob - это дружественная к новичкам библиотека НЛП, которая предоставляет множество интересных функций. Он также предоставляет встроенные текстовые классификаторы. Однако я обнаружил, что TextBlob намного медленнее, чем другие библиотеки, которые я использовал.

Для нашей цели мы будем использовать встроенный DecisionTreeClassifier TextBlob. Ниже приведен фрагмент кода:

Используя эту технику, мне удалось получить показатель ROC-AUC 0,68 и показатель F1 0,46.

Spacy с CNN

Spacy - одна из самых популярных и широко используемых библиотек для НЛП, предлагающая очень мощные функции. Он предлагает встроенный классификатор текста с именем textcat, который доступен как компонент конвейера по умолчанию. Компонент textcat поддерживает BOW (набор слов), S Imple-CNN (сверточную нейронную сеть) и Ensemble архитектуры.

В нашем примере мы будем использовать архитектуру simple-cnn.

Для этого сценария я получил оценку ROC-AUC 0,78 и оценку F1 0,66.

Простор с векторами документов

В этом примере мы продолжим использовать Spacy, но вместо использования встроенного в него классификатора текста я бы использовал Spacy для создания векторов документов, а затем скармливал эти векторы классификатору XGBoost. Посмотрим, улучшит ли это наш результат.

Здесь мы получаем показатель ROC-AUC, равный 0,8, и показатель F1, равный 0,64.

Глубокая нейронная сеть с ячейками LSTM

Наконец, мы создадим модель нейронной сети с использованием двунаправленных ячеек LSTM. Мы будем использовать библиотеку Keras TensorFlow и использовать ее функции, такие как токенизация и заполнение последовательностей.

Здесь мы получаем показатель ROC-AUC, равный 0,82, и показатель F1, равный 0,41.

Вывод

Давай сравним результаты сейчас

Показатели ROC_AUC моделей очень похожи. Глядя на результаты F1, кажется, что NLTK и Spacy лучше всего подходят для этой работы. Тем не менее, определенно возможно дальнейшее улучшение моделей с использованием различных методов оптимизации и настройки гиперпараметров, особенно модели на основе LSTM.

Полный код для всех вышеперечисленных примеров доступен в моем репозитории GitHub Машинное обучение.

Предварительно обученные модели в последнее время вызывают много сенсаций. С недавним выпуском OpenAI GPT3 энтузиазм достиг рекордно высокого уровня. Мне любопытно, как они справятся с нашей простой задачей классификации текста.

Это то, что я собираюсь попробовать дальше. Продолжайте следить за этим пространством, чтобы узнать больше.