Этот пост - вторая часть серии. В первой части я построил модель анализа настроений на чистом pytorch. В этом посте я выполняю ту же задачу, но в torchtext и демонстрирую, где светится torchtext, а также это сокращает количество кода.

Анализ тональности - это задача классификации, в которой каждому образцу присваивается положительная или отрицательная метка. Вы можете следить за кодом здесь.

Скачать набор данных из [2]

Типичные компоненты классификационной задачи в НЛП

  1. Предварительная обработка и токенизация
  2. Создание словаря уникальных токенов и преобразование слов в индексы
  3. Загрузка предварительно обученных векторов, например Перчатка, Word2vec, Fasttext
  4. Заполнение текста нулями в случае переменной длины
  5. Загрузка данных и пакетирование
  6. Создание и обучение модели

Зачем использовать torchtext

Torchtext предоставляет набор классов, которые полезны в задачах НЛП. Эти классы заботятся о первых 5 пунктах выше с очень минимальным кодом. Мы подробно рассмотрим каждый пункт.

Я разделил данные на поезд и набор проверки и сохранил как csv.

Примечание. Убедитесь, что вы удалили все символы «\ n» перед сохранением csv, поскольку у torchtext есть проблемы с обработкой символа «\ n».

1. Определите, как обрабатывать данные

Первый шаг - объявить, какие атрибуты (столбцы) в фрейме данных мы хотим использовать и как их обрабатывать. Фрейм данных состоит из 4 столбцов («ItemID», «Sentiment», «SentimentSource», «SentimentText»), и мы хотим использовать только «Sentiment» и «SentimentText».

Столбец меток («Настроение») является двоичным и уже имеет числовую форму, поэтому нет необходимости его обрабатывать. Столбец твита («SentimentText») нуждается в обработке и токенизации, чтобы его можно было преобразовать в индексы.

Давайте разберем приведенный выше код. В torchtext столбец может называться полем. Объект поля принимает аргументы о том, как обрабатывать (токенизировать и т. Д.) Текст. Этот объект поля позже будет прикреплен к набору данных.

Строка 10 определяет схему того, как будет обрабатываться столбец или поле, когда мы будем передавать фактические данные (твиты) в будущем.

For text columns or fields, below parameters are used.
'sequential=True'
It tell torchtext that the data is in form of sequence and not discrete
'tokenize=tokenizer'
This attribute takes a function that will tokenize a given text. In this case the function will tokenize a single tweet. You can also pass 'spacy' string in this attribute if spacy is installed.
'include_lengths=True'
Apart from tokenized text we will also need the lengths of the tweets for RNN
'use_vocab=True'
Since this is used to process the text data, we need to create the vocabulary of unique words. This attribute tells torchtext to create the vocabulary

Строка 15 определяет схему того, как будет обрабатываться столбец или поле, когда мы будем передавать фактические данные (метки) в будущем.

For label columns or fields, below parameters are used.
'sequential=False'
Now we are defining the blueprint of label columns. Labels are not sequential data, they are discrete. So this attribute is false
                                    
'use_vocab=False'
Since it is a binary classification problem and labels are already numericalized, we will set this to false
'pad_token=None'
'unk_token=None'
We don't need padding and out of vocabulary tokens for labels.

В строке 20 мы определяем, как будет обрабатываться каждый столбец. Столбцы со значением None игнорируются и не загружаются.

2. Создайте набор данных torchtext.

Вы можете спросить, почему бы не использовать набор данных pytorch по умолчанию. Причина в том, что torchtext предоставляет набор наборов данных специально для задач НЛП. Одним из таких наборов данных является TabularDataset, который специально разработан для чтения файлов csv и tsv и их обработки. Это оболочка вокруг pytorch Dataset с дополнительными функциями.

Пока мы определили чертежи для обработки. Теперь мы фактически загрузим данные для обработки.

Строка 27 содержит метод TabularDataset.splits (), который используется, когда мы хотим обработать несколько файлов (обучение, проверка, тестирование) за один раз, используя ту же обработку.

path='./data'
Path were the csv or tsv files are stores
format='csv'
format of the files that will be loaded and processed
train='traindf.csv'
Name of train file. The final path will become ./data/traindf.csv
validation='valdf.csv'
Name of validation file. The final path will become ./data/valdf.csv
fields=train_val_fields
Tell torchtext how the coming data will be processed
skip_header=True
skip the first line in the csv, if it contains header

TabularDataset.splits () вернет набор данных поезда и набор данных проверки.

Давайте посмотрим, что содержит этот объект TabularDataset.

TabularDataset - это список, содержащий объект Example. Пример объекта объединяет все столбцы (текст и метки) в один объект. Доступ к этим столбцам можно получить по именам столбцов, как написано в приведенном выше коде.

3. Загрузка предварительно обученных векторов слов и создание словарного запаса.

Torchtext упрощает загрузку предварительно обученных векторов слов. Просто укажите имя предварительно обученного вектора слова (например, glove.6B.50d, fasttext.en.300d и т. Д.), И torchtext загрузит этот конкретный вектор, а затем вы сможете использовать его во встраиваемом слое.

Или, если вы уже загрузили предварительно обученные векторы, вы можете указать путь, и torchtext прочитает и загрузит его. Я использовал загруженные векторы в приведенном ниже коде.

В строках 4 и 6 выше, torchtext создает словарь на основе текста, представленного в столбце «SentimentText». Словарь построен на тексте в наборе данных поезда и наборе данных проверки и определяет максимальное количество уникальных слов как 100000. Словам, которых нет в словаре, будет назначен токен ‹unk›. Передайте предварительно обученные векторы во время создания словарного запаса.

Теперь, когда вы выполняете строку 4, torchtext создает словарь всех уникальных слов и размещает их в порядке убывания их частоты и добавляет токены ‹unk› и ‹pad› в начало этого словаря. Затем torchtext присваивает уникальное целое число каждому слову и сохраняет это отображение в txt_field.vocab.stoi (строка для индекса) и обратное отображение в txt_field.vocab.itos (индекс в строку).

4. Загрузка данных партиями.

Для данных с предложениями переменной длины torchtext предоставляет загрузчик данных BucketIterator (), который является оболочкой вокруг pytorch Dataloader. BucketIterator предоставляет некоторые дополнительные преимущества, такие как сортировка данных по длине текста и группировка текста одинаковой длины в пакете. Это помогает уменьшить количество требуемых отступов. Обратите внимание, что я не установил для текста какую-то конкретную длину. BucketIterator заполняет партию в соответствии с максимальной длиной выборки.

Примечание. BucketIterator возвращает объект Batch вместо текстового индекса и меток. Также объект Batch не повторяется, как pytorch Dataloader. Один объект Batch содержит данные одного пакета. Доступ к тексту и меткам можно получить через имена столбцов.

Это одна из маленьких икоты в torchtext. Но это легко преодолеть двумя способами. Либо напишите дополнительный код в цикле обучения для получения данных из объекта Batch, либо напишите итеративную оболочку вокруг объекта Batch, которая возвращает желаемые данные. Я воспользуюсь вторым подходом, так как он намного чище.

С помощью приведенного выше кода мы можем напрямую использовать его в цикле обучения, как pytorch Dataloader.

5. Наконец Модель и обучение

Ниже приведен код модели ConcatPooling вместе с предварительно обученным встраиванием. Я исключил код цикла обучения.

Другие классы в torchtext

Torchtext также предоставляет классы для загрузки других типов данных, например, для языкового моделирования, тегов последовательностей, перевода и т. Д.

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

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

[1] https://arxiv.org/abs/1801.06146

[2] http://thinknook.com/wp-content/uploads/2012/09/Sentiment-Analysis-Dataset.zip

[3] http://anie.me/On-Torchtext/