Читать нас в Telegram

FastText — это библиотека, содержащая предобученные готовые векторные представления слов (читать, что это такое) и классификатор, то есть алгоритм машинного обучения разбивающий слова на классы. FastText разработала команда исследователей из Facebook AI Research, в составе которых был и создатель Word2vec Томаш Миколов (к тому времени перешедший из Google в Facebook).

Для получения векторного представления слов одновременно используются модели skipgram и CBOW (Continuous Bag-of-Words). Как работают эти модели можно прочитать в нашем материале о word2vec.

Так что же отличает FastText? Более быстрая работа по сравнению с другими пакетами и моделями. Для модели векторных представлений слов используется skip-gram с негативным сэмплированием. Негативное сэмплирование — это способ создать для обучения векторной модели отрицательные примеры, то есть показать ей пары слов, которые не являются соседями по контексту. Для каждого положительного примера (когда слова в тексте стоят рядом, например, «пушистый котик») мы подбираем несколько отрицательных («пушистый утюг», «пушистый радиосигнал», «пушистое бегство»). Всего подбирается от 3 до 20 случайных слов. Такой случайный подбор нескольких примеров не требует много компьютерного времени и позволяет ускорить работу FastText.

Skip-gram игнорирует структуру слова, но в некоторых языках есть составные слова, как, например, в немецком. Поэтому к основной модели была добавлена subword-модель. Subword-модель — это представление слова через цепочки символов (n-граммы) с n от 3 до 6 символов от начала до конца слова плюс само слово целиком. Например слово замок с n = 3 будет представлено n-граммами <за, зам, амо, мок, ок > и последовательностью <замок>. Таким образом, для модели есть разница между последовательностью <зам> в слове зам — и n-граммой зам из слова замок. Такой подход позволяет работать и с теми словами, которые модель ранее не встречала.

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

В основе классификатора лежит модель линейной классификации, по архитектуре схожая с моделью CBOW. Чем больше количество классов, тем больше время работы линейной модели. Для оптимизации классификатора используется иерархический софтмакс основанный на алгоритме кодирования Хаффмана.

Дерево классов состоит из веток, где в самом верху наиболее встречающейся класс, а его дети — связанные менее встречающееся классы. Например, у класса «Биология» будут дети узлы классов «Животные» и «Растения» и т.д. Вероятности классов определяется для каждого узла от первого узла-родителя до последнего узла-ребенка. Таким образом, у дочернего узла вероятность всегда меньше, чем у его узла-родителя.

Как можно применить библиотеку в практической задаче, рассмотрим ниже.

Как применить FastText в задачах NLP

Скачать предобученные векторные представления слов для русского языка можно по ссылке в конце статьи. Там же список всех доступных языков — сейчас их 157. То есть мы берем уже готовые векторы слов и используем их, чтобы представить слова из нашего корпуса.

Может оказаться, что каких-то слов не будет в предобученных векторах FastText, так как обучение проходило на определенном корпусе. Однако мы уже знаем, что FastText обучается не только на словах, но и на символьных последовательностях. Поэтому модель может порождать адекватные вектора и для слов, которые не встречала.

По умолчанию FastText использует вектора слов размерностью 300. Но при желании размерность можно изменить с помощью утилит FastText.

Официально FastText можно установить или на Linux или Mac OS. Существует и неофициальная сборка для Windows. Также, FastText-модели есть внутри некоторых библиотек для Python, работающих вне зависимости от операционной системы. И конечно, модель запускается в Google Colab.
В репозитории проекта FastText на GitHub есть справка по установке и функциям библиотеки. После адаптации уже готовых векторных представлений слов под нужную задачу их используют для обучения нейросети или классификатора вроде логической регрессии. Кстати, использование логистической регрессии позволяет проверить собранный вами алгоритм автоматической обработки текста, не тратя много времени.

Самый простой способ попробовать FastText

Попробовать просчитать векторное представление FastText можно, используя пакет gensim в питон. Там есть модель FastText. Импортируется модель так:

from gensim.models import FastText

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

У модели есть гиперпараметры. Вот описание некоторых из них:

  • Размерность вектора модели. Если установить 100 — каждое слово в корпусе будет представлено в виде 100-мерного вектора, и т.п.
  • Размер окна. Этот параметр задает, сколько соседних слов считается частью контекста. Если выставить 40, то алгоритм возьмет 40 слов спереди от слова и 40 слов сзади от слова;
  • Наименьшее допустимое количество символов в слове, для которого будет создаваться векторное представление; так можно убрать частотные, но не очень значимые слова типа союзов и предлогов.
  • Выбор архитектуры векторной модели: skip-gram или СBOW. Sg = 1 переключит на модель skip-gram. По умолчанию значение параметра 0, что означает использование CBOW.

Источники