Не очень большие данные и определение тональности текста
Всякая идея имеет простое, понятное и неправильное решение.Одно из таких решений я и опишу в этой статье.Не пытайтесь повторить эти эксперименты дома.А если попытаетесь — то претензии по сгоревшим процессорам не принимаются.Итак, есть датасет www.cs.cornell.edu/people/pabo/movie-review-data/review_polarity.tar.gzОн состоит из 1000 негативных и 1000 позитивных отзывов.
Как с помощью буханки черного хлеба архиватора xz и линейного классификатора получить точность, сравнимую со сверточной нейронной сетью, word2vec или прочими чудесами совеременных технологий?
Очень просто.
1. Берем 100 случайных текстов (50 из негативов и 50 из позитивов)2. Выкидываем их из датасета.3. Для каждого из 1900 оставшихся считаем обобщенную дистанцию с каждым из 100 выкинутых следующим методом: Пусть X и Y — два файла, для которых надо посчитать дистанцию.И пусть Z (N) — длина файла N после сжатия его архиваторм xz.
Вычислим значенияX = Z (X)Y = Z (Y)XY = Z (XY)YX = Z (YX)
Последние два значения — результат архивации конкатенации файлов X и Y в первом случае и Y и X — во втором.
И теперь считаем магическую формулу, взятую здесьattribute = (min (XY, YX)-min (X, Y))/max (X, Y)
4. У нас получилась матрица 1900×100Теперь ее надо нормализовать от 0 до 1.
5. Тадам:$svm-train -v 10 -s 0 -t 0 -с 10 rand100.norm.svmCross Validation Accuracy = 75.6316%
Почему это работает? Дело в том, что чем больше общих последовательностей в двух текстах, тем больше будет сжатие Z (XY)Таким образом система сама выделяет общие группы символов.Возможно что на 200 случайных файлах получилось бы лучше.
Но — помните предупреждение не повторять это дома? Сам процесс вычисления матрицы на домашнем компьютере может занять сутки — если в одном потоке.Или спалить процессор в мультипоточном режиме, если охлаждение слабое.Это кстати не шутка — я так когда-то два сервера в датацентре на другом конце планеты сжег, правда другим алгоритмом еще более жестким.
И именно поэтому этот метод представляет лишь теоретический интерес в рамках прикладной фаллометрии.
PSКода не будет за тривиальностью — я все делал шеллом и перловыми онлайнерами, при попытке чтения которых гомосапами, архивация начинает происходить непосредственно в коре головного мозга. А нейронные сети, как известно, плохо приспособлены к такой нагрузке.
PPSА вдохновил меня на сей эксперимент — вот этот пост.
UPDATEСудя по отзывам, показав практическую часть, я не прояснил зачем это нужно.В самом деле, в реальных задачах этот метод явно неприменим — затратность очень велика.
Метод вычисления дистанции компрессией известен давно и имеет под собой теоретический бэкграунд.Желающим с ним ознакомиться рекомендую это.
Вопрос однако не в конкретном методе.Современные аналитики строят классификаторы долго, дорого и руками.Руками вообще делается многое — от feature sculpting до разработки структуры сети.
Здесь я показал полностью агностический метод, не требующий никаких знаний о предметной области. Вообще никаких. Нам наплевать на каком языке написано содержимое файла, единственное ограничение — это должен быть линейный поток байт (потому с изображениями не работает).
Да, пример относится к категории игрушечных, в реальных задачах такие алгоритмы бессмысленны.
Но если есть агностические методы в игрушечных задачах, то они могут существовать и в больших. И поиск таких методов намного более интересен, чем тренировки автоэнкодеров на L2 метрике.Особенно учитывая то, что на использованной здесь NCD метрике автоэнкодер натренировать скорее всего не получится.