Нейронные сети - это просто! Или классифицируем текст с помошью fasttext
Всем добрый день! на дворе лето, а значит пришло время заняться чем то необычным. Сейчас многие говорят про исскуственный интелект, восстание роботов и прочее. Вот и я решил приобщиться в созданию матрицы))0) Да ладно, шучу. На самом деле я как то набрел на одну очень занятную библиотеку от Facebook и решил поведать вам о ней.
Сегодня мы поробуем классифицировать текст с помощью fastText.
About fastText
fastText – это библиотека для обучения представлениям слов и классификации предложений. Инструмент поддерживает несколько языков, включая английский, немецкий, испанский, французский, чешский и русский (!).
Для эффективной обработки массивов данных с большим количеством различных категорий fastText использует иерархический классификатор, который организовывает различные категории в древовидную структуру вместо плоской.
Проект полностью открытый и исходный код доступен на GthHub, что не может не радовать.
fastText может как распозновать текст, выделяя классы, так и понимать похожие слова. Для классификации текста используется Bag of Tricks for Efficient Text Classification, а для слов Enriching Word Vectors with Subword Information. Это пожалуй все, то нужно знать. А теперь поехали учить компьютеры захватывать миры! Ой что это я)
Практика
Специально для этого переписал часть питоновского кода на C++
и собрал проект с Visual Studio 2017. По этому для Windows
ничего собирать не нужно. Linux
- пользователи я думаю без труда соберут все необходимое себе сами, через терминал.
UPD: Windows-версия выросла в отдельный форк fasttext и доступна на github
И так качаем архив последнего релиза отсюда и распаковываем его. В архиве валяется сам EXE-файл и DLL к нему. Если вы хотите использовать функции fastText в другой win32 программе - вы всегда можете сделать DLL-Import
и вызывать необходимые вункции откуда угодно. В рамках этой статьи мы отсановимся на консольной версии приложения.
К стати о функциях, чтобы их посмотреть достаточно просто вбить имя программы в CMD. Вся документация перенесена и прописана:
Нас интересует функция supervised
:
Начинаем обучать.
Для начала подготовим датасет. Данные хранятся в обычном текстовом файле, где каждая строка выгядят следующим образом:
Класс | Предложение |
---|---|
__label__greet | Привет |
Все классы помечаются особым префиксом вида: __<prefix>__<subprefix>
. Префиксы могут быть любые, но по умолчанию используется __label__
. Префиксы вы можете задать вручную, при вызове функции отребутом -label
.
Пусть для начала нейросеть отличает 2 класса: приветствие
и прощание
.
Создаем наш файл train.txt
в дериктории с EXE - файлом:
P.s. Enter в после последней строки - обязателен.
Обучим модель:
Ура! Она обучилась! Программа создаст 2 файла: model.bin
и model.vec
. В VEC - файле - хранятся векторы наших предложений, а в BIN файле - сама модель. Ну что затестим?
Создадим текстовый файл test.txt
:
Запустим тест!!!
Хм… Как то сраанно оно работает? Почему так? Дело в том что изначалино программа берет очень небольное колличество итераций обучения (эпох). Как вы уже заметили на выходе она пишет: loss: 0.682726
. Это означает, что вероянтность ошибки равна 0.6. Увеличим эпохи. Пусть поучится подольше!
Уже лучше! Пробуем еще! Как завещал Ленин: “Учиться, учиться…“!
Превосходно! Тестим!
PROFIT!
P.s.
Я надеюсь, что благодаря этой статье вы сможете поиграться с нейронками и классификацией текста. Безусловно, для чего то более серьезного - требуются более серьезные наборы данных, подготовленных специальным образом. В общем эксперементируйте и дерзайте!