Zalando Research только что выпустила новую версию Flair - простой библиотеки Python NLP!

Почему это большая новость для НЛП? Flair предлагает самые современные решения в решении таких проблем, как распознавание именованных сущностей (NER), теги части речи (PoS), устранение неоднозначности. и текстовая классификация. Это фреймворк НЛП, построенный на основе PyTorch.

В этой статье объясняется, как использовать существующие и создавать собственные текстовые классификаторы с Flair.

Вступление

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

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

Причина, по которой Flair является захватывающей новостью для НЛП, заключается в том, что недавняя статья Встраивание контекстных строк для маркировки последовательностей от Zalando Research описывает подход, который неизменно превосходит предыдущие современные решения. Он реализован и полностью поддерживается в Flair и может использоваться для создания текстовых классификаторов.

1. Подготовка

Для установки Flair вам понадобится Python 3.6. Если у вас его еще нет, вот руководство о том, как это сделать. Затем, чтобы установить Flair, запустите:

pip install flair

Это установит все необходимые пакеты, необходимые для запуска Flair. Он также будет включать PyTorch, над которым сидит Флер.

2. Использование предварительно обученной классификационной модели.

В новом выпуске 0.4 есть две предварительно обученные модели. Модель анализа настроений, обученная на наборе данных IMDB, и модель «обнаружения оскорбительного языка» (которая в настоящее время поддерживает только немецкий).

Использование, загрузка и сохранение модели были объединены в один метод, который делает весь процесс использования предварительно обученных моделей на удивление простым.

Чтобы использовать модель анализа настроений, просто запустите:

from flair.models import TextClassifier
from flair.data import Sentence
classifier = TextClassifier.load('en-sentiment')
sentence = Sentence('Flair is pretty neat!')
classifier.predict(sentence)
# print sentence with predicted labels
print('Sentence above is: ', sentence.labels)

При первом запуске Flair загрузит модель анализа настроений и по умолчанию сохранит ее в подпапке .flair домашнего каталога. Это может занять до нескольких минут.

Приведенный выше код сначала загружает необходимые библиотеки, затем загружает модель анализа тональности в память (сначала загружает ее, если необходимо), а затем предсказывает оценку тональности предложения «Чутье довольно здорово!» по шкале от 0 до 1 . Последняя команда выводит: The sentence above is: [Positive (1.0)].

Вот и все! Теперь вы можете, например, включить код в REST api и предложить услугу, сопоставимую с анализом тональности Google Cloud Natural Language API, который может оказаться довольно дорогостоящим при использовании в производственной среде при большом количестве запросов.

3. Обучение классификатора произвольного текста.

Чтобы обучить настраиваемый текстовый классификатор, нам сначала понадобится помеченный набор данных. Формат набора данных классификации Flair основан на формате FastText Facebook. Формат требует, чтобы одна или несколько меток были определены в начале каждой строки, начиная с префикса __label__. Формат следующий:

__label__<class_1> <text>
__label__<class_2> <text>

В этой статье мы будем использовать набор данных Kaggle по обнаружению SMS-спама для создания классификатора спама / не-спама с помощью Flair. Набор данных подходит для обучения, поскольку он содержит всего 5572 строки и достаточно мал, чтобы обучить модель за несколько минут на ЦП.

3.1 Предварительная обработка - Создание набора данных

Сначала мы загружаем набор данных по этой ссылке на Kaggle, чтобы получить spam.csv. Затем в том же каталоге, что и наш набор данных, мы запускаем приведенный ниже фрагмент предварительной обработки, который выполнит некоторую предварительную обработку и разделит наш набор данных на наборы для обучения, разработки и тестирования.

Убедитесь, что у вас установлены Pandas. Если нет, сначала запустите pip install pandas.

import pandas as pd
data = pd.read_csv("./spam.csv", encoding='latin-1').sample(frac=1).drop_duplicates()
data = data[['v1', 'v2']].rename(columns={"v1":"label", "v2":"text"})
 
data['label'] = '__label__' + data['label'].astype(str)
data.iloc[0:int(len(data)*0.8)].to_csv('train.csv', sep='\t', index = False, header = False)
data.iloc[int(len(data)*0.8):int(len(data)*0.9)].to_csv('test.csv', sep='\t', index = False, header = False)
data.iloc[int(len(data)*0.9):].to_csv('dev.csv', sep='\t', index = False, header = False);

Это удалит некоторые дубликаты из нашего набора данных, перемешает их (рандомизирует строки) и разделит данные на наборы для обучения, разработки и тестирования с использованием разделения 80/10/10.

Если это сработает успешно, вы получите _7 _, _ 8_ и dev.csv, отформатированные в формате FastText, готовые для использования с Flair.

3.2 Обучение пользовательской модели классификации текста

Чтобы обучить модель, запустите этот фрагмент кода в том же каталоге, что и сгенерированный набор данных.

from flair.data_fetcher import NLPTaskDataFetcher
from flair.embeddings import WordEmbeddings, FlairEmbeddings, DocumentLSTMEmbeddings
from flair.models import TextClassifier
from flair.trainers import ModelTrainer
from pathlib import Path
corpus = NLPTaskDataFetcher.load_classification_corpus(Path('./'), test_file='test.csv', dev_file='dev.csv', train_file='train.csv')
word_embeddings = [WordEmbeddings('glove'), FlairEmbeddings('news-forward-fast'), FlairEmbeddings('news-backward-fast')]
document_embeddings = DocumentLSTMEmbeddings(word_embeddings, hidden_size=512, reproject_words=True, reproject_words_dimension=256)
classifier = TextClassifier(document_embeddings, label_dictionary=corpus.make_label_dictionary(), multi_label=False)
trainer = ModelTrainer(classifier, corpus)
trainer.train('./', max_epochs=10)

При первом запуске этого кода Flair загрузит все необходимые модели встраивания, что может занять до нескольких минут. После этого весь тренировочный процесс займет еще 5 минут.

Этот фрагмент сначала загружает необходимые библиотеки и наборы данных в объект корпуса.

Затем мы создаем список вложений (два контекстных вложения Flair и вложение слов GloVe). Этот список затем используется в качестве входных данных для нашего объекта встраивания документа. Сложение и встраивание документов - одна из самых интересных концепций Flair. Они предоставляют средства для объединения различных вложений вместе. Вы можете использовать как традиционные вложения слов (например, GloVe, word2vec, ELMo), так и контекстные вложения Flair. В приведенном выше примере мы используем основанный на LSTM метод объединения вложений слов и контекстных строк для создания вложений документов. Вы можете прочитать больше об этом здесь".

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

3.3 Использование обученной модели для прогнозов

Теперь мы можем использовать экспортированную модель для создания прогнозов, запустив следующий фрагмент из того же каталога:

from flair.models import TextClassifier
from flair.data import Sentence
classifier = TextClassifier.load_from_file('./best-model.pt')
sentence = Sentence('Hi. Yes mum, I will...')
classifier.predict(sentence)
print(sentence.labels)

Фрагмент распечатывает «[ham (1.0)]», что означает, что модель на 100% уверена, что наше примерное сообщение не является спамом.

Как он работает по сравнению с другими фреймворками?

В отличие от FastText от Facebook или даже от Google AutoML Natural Language, классификация текста с помощью Flair по-прежнему является относительно низкоуровневой задачей. У нас есть полный контроль над тем, как встраивание текста и обучение выполняется, имея возможность устанавливать такие параметры, как скорость обучения, размер пакета, коэффициент отжига, функция потерь, выбор оптимизатора ... Для достижения оптимальной производительности эти гиперпараметры необходимо настроить. Flair предоставляет нам оболочку хорошо известной библиотеки настройки гиперпараметров Hyperopt (описанной здесь), которую мы можем использовать для настройки наших гиперпараметров для достижения оптимальной производительности.

В этой статье для простоты мы использовали гиперпараметры по умолчанию. При использовании в основном параметров по умолчанию наша модель чутья достигла показателя f1 0,973 после 10 эпох.

Для сравнения мы обучили модель классификации текста с помощью FastText и на платформе AutoML Natural Language. Сначала мы запустили FastText с параметрами по умолчанию и получили f1-оценку 0,883, что означает, что наша модель значительно превзошла FastText. Однако FastText потребовалось всего несколько секунд для обучения, в отличие от 5 минут для нашей пользовательской модели Flair.

Затем мы также сравнили наши результаты с результатами, полученными на платформе Google AutoML Natural Language. Платформе сначала потребовалось 20 минут, чтобы просто проанализировать набор данных. После этого мы начали процесс обучения, который длился почти 3 часа (что стоило почти 10 долларов бесплатных кредитов), но получили f1-оценку 99,211 - немного лучший результат, чем наша пользовательская модель Flair.

Последние мысли

Эта статья должна дать вам общее представление о том, как использовать Flair для классификации текста.

В следующей публикации мы объясним, как настроить гиперпараметры Flair для достижения оптимальной производительности и превзойти AutoML Google в классификации текста.