Встраивание слов приводит к линейному преобразованию n -длинных (n - это размер словаря, составляющего корпус текста) разреженных векторов документов в p -длинные плотные векторы с p ‹< n, таким образом, достигается уменьшение порядка…

В предыдущем посте Вложения слов и векторы документов: Часть 1. Сходство мы заложили основу для использования векторов документов на основе набора слов в сочетании с встраиваниями слов (предварительно обученными или специально обученными) для вычисления сходства документов, так как предшественник классификации. казалось, что векторы "документ + слово" лучше улавливают сходство (или отсутствие) в игрушечных документах, на которые мы смотрели. Мы хотим продолжить и применить этот подход к реальным репозиториям документов, чтобы увидеть, как векторы документ + слово подходят для классификации. В этом посте основное внимание уделяется подходу, механике и фрагментам кода для достижения этой цели. Результаты будут описаны в следующем посте этой серии.

План статьи выглядит следующим образом. Код для полной реализации можно скачать с github.

  1. Выберите репозиторий документов (скажем, 20 новостей на страницах SciKit для мультикласса или большой набор данных обзора фильмов из Стэнфорда для двоичной классификации тональности)
  2. Токенизируйте (остановили / остановили) корпус и получите словесные векторы (предварительно обученные и специально обученные) для токенов. Это нужно сделать только один раз, и мы используем их во всех классификационных тестах. Мы сохраняем их в Elasticsearch для легкого и быстрого поиска по мере необходимости. Рассмотрим алгоритмы Word2Vec / SGNS и FastText для слов-векторов. API Gensim используется для генерации пользовательских векторов и для обработки предварительно обученных.
  3. Создайте конвейер SciKit, который выполняет следующую последовательность операций, показанную на рисунке 1.
  • Получите токены документов (остановленные или заблокированные) из индекса Elasticsearch. Векторизуйте их (с помощью CountVectorizer или TfidfVectorizer из SciKit), чтобы получить матрицу слов документа высокого порядка.
  • Встраивайте векторы слов (Word2Vec, FastText, предварительно обученные или настраиваемые), полученные из индекса Elasticsearch для каждого токена. Это приводит к уменьшенной матрице документ-слово.
  • Запустите предоставленные SciKit классификаторы Полиномиальный наивный байесовский анализ, Линейные опорные векторы и Нейронные сети для обучения и прогнозирования. Все классификаторы используют значения по умолчанию, за исключением необходимого количества нейронов и скрытых слоев в случае нейронных сетей.

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

1. Токенизация

Хотя векторизаторы документов в SciKit могут токенизировать необработанный текст в документе, мы хотели бы потенциально контролировать его с помощью настраиваемых стоп-слов, выделения корней и т. Д. Вот фрагмент кода, который токенизирует сохранение корпуса из 20 новостей в индекс elasticsearch для последующего поиска.

В строке 10 выше мы удаляем все знаки препинания, удаляем токены, которые не начинаются с буквы, а также слишком длинные (›14 символов) или короткие (‹ 2 символа). Жетоны записываются в нижний регистр, игнорируемые слова удаляются (строка 14) и ограничиваются (строка 18). В строке 36 мы удаляем заголовки, нижние колонтитулы и т. Д. Информацию из каждого сообщения, так как это было бы бесполезным сообщением о том, к какой группе новостей принадлежит статья. По сути, мы затрудняем классификацию.

2. Слово-векторы

Следующий фрагмент кода обрабатывает опубликованные векторы слов fasttext в индекс elasticsearch.

В строке 22 выше мы читаем предварительно обученные векторы. Строка 23 индексирует их в elasticsearch. Мы также можем сгенерировать собственные векторы слов из любого доступного текстового корпуса. Gensim также предоставляет удобный API для этого.

В строках 35 и 41 модели обучаются с помощью токенов (остановленных или остановленных), полученных из индекса корпуса, который мы создали в разделе 1. Выбранная длина векторов - 300. min_count в строке 30 относится к до минимального количества раз, когда токен должен встречаться в корпусе, чтобы этот токен был учтен.

3. Технологический трубопровод

Мы векторизуем документы в репозитории, преобразуем и уменьшаем порядок модели, если нужно использовать встраивание слов, и применяем классификатор для подгонки и прогнозирования, как показано на рисунке 1 ранее. Давайте рассмотрим каждый из них по очереди.

3.1 Векторизация

Ранее мы говорили, что можем использовать векторизаторы count / tf-idf SciKit. Они точно дают матрицу "документ-термин" X, но на нашем этапе встраивания слов в конвейер требуется словарь / слова, полученные этим векторизатором. Поэтому мы пишем собственный класс-оболочку вокруг векторизатора SciKit и дополняем ответ преобразования словарём.

Оболочка инициализируется в строке 1 фактическим векторизатором SciKit вместе с min_df (минимальная частота в репозитории, необходимая для того, чтобы токен учитывался в словаре), установленным на 2. Строка 8 использует процедуру подбора выбранного векторизатора, а Метод transform в строке 12 выдает ответ как с X, так и с производным словарем V, который нужен на втором этапе.

3.2 Вставить слова

У нас есть m документов и n уникальных слов среди них. Основная часть работы здесь заключается в следующем.

  1. Получите p -мерный вектор слова для каждого из этих n слов из указателя, который мы подготовили в разделе 2.
  2. Подготовьте nxp матрицу векторов слов W, где каждая строка соответствует слову в отсортированном словаре
  3. Преобразуйте исходную разреженную матрицу документа-слова mxn X в плотную матрицу mxp Z простым умножением. Мы рассмотрели это в предыдущем посте. Но обратите внимание, что SciKit работает с документами как векторами-строками, поэтому W здесь - это транспонирование того же самого в уравнении 1 в этом посте. Ничего сложного.

p - это, конечно, длина слова-вектора, проекция исходного 1-горячего n -мерного вектора на этот поддельный p - слово-пространство. Однако нам следует быть осторожными с умножением матриц, поскольку X поступает из векторизатора в виде матрицы сжатой разреженной строки, а наша W является нормальной матрицей. Немного подтасовки индексов поможет. Вот фрагмент кода на этом этапе конвейера.

Строка 1 инициализирует преобразователь с помощью объекта wordvector (код смотрите в github), который имеет методы для получения векторов из индекса. Строка 15 получает отсортированный список слов из словаря, переданного на этапе векторизации. Матрица csr X использует тот же порядок для своих ненулевых записей, и нам также нужно получить W в том же порядке слов. Это делается в строке 16, и, наконец, умножение разреженной матрицы в строке 17 дает матрицу уменьшенного порядка Z, которую мы ищем.

3.3 Классификация

Это легко. Классификатор получает матрицу m x p Z, где каждая строка является документом. Он также получает вектор меток m x 1 при подборе модели. Мы будем оценивать три классификатора - наивный байесовский алгоритм, машины опорных векторов и нейронные сети. Мы запускаем их, не изменяя никаких параметров SciKit по умолчанию. В случае нейронных сетей мы пробуем несколько разное количество скрытых слоев (1, 2 или 3) и нейронов внутри (50, 100 и 200), поскольку для этого нет подходящих значений по умолчанию.

Метод getNeuralNet в строке 1 генерирует кортеж, который нам нужен для инициализации нейронной сети со скрытыми слоями и нейронами. Мы готовим набор классификаторов, которые применяются к различным комбинациям векторизаторов и преобразователей.

4. Дальнейшие действия

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

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -

Измененная версия этой статьи изначально была опубликована на xplordat.com 27 сентября 2018 г.