Pull to refresh

Не очень большие данные и определение тональности текста

Reading time 2 min
Views 7.6K
Всякая идея имеет простое, понятное и неправильное решение.
Одно из таких решений я и опишу в этой статье.
Не пытайтесь повторить эти эксперименты дома.
А если попытаетесь — то претензии по сгоревшим процессорам не принимаются.



Итак, есть датасет 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.svm
Cross Validation Accuracy = 75.6316%

Почему это работает?
Дело в том, что чем больше общих последовательностей в двух текстах, тем больше будет сжатие Z(XY)
Таким образом система сама выделяет общие группы символов.
Возможно что на 200 случайных файлах получилось бы лучше.

Но — помните предупреждение не повторять это дома?
Сам процесс вычисления матрицы на домашнем компьютере может занять сутки — если в одном потоке.
Или спалить процессор в мультипоточном режиме, если охлаждение слабое.
Это кстати не шутка — я так когда-то два сервера в датацентре на другом конце планеты сжег, правда другим алгоритмом еще более жестким.

И именно поэтому этот метод представляет лишь теоретический интерес в рамках прикладной фаллометрии.

PS
Кода не будет за тривиальностью — я все делал шеллом и перловыми онлайнерами, при попытке чтения которых гомосапами, архивация начинает происходить непосредственно в коре головного мозга. А нейронные сети, как известно, плохо приспособлены к такой нагрузке.

PPS
А вдохновил меня на сей эксперимент — вот этот пост.

UPDATE
Судя по отзывам, показав практическую часть, я не прояснил зачем это нужно.
В самом деле, в реальных задачах этот метод явно неприменим — затратность очень велика.

Метод вычисления дистанции компрессией известен давно и имеет под собой теоретический бэкграунд.
Желающим с ним ознакомиться рекомендую это.

Вопрос однако не в конкретном методе.
Современные аналитики строят классификаторы долго, дорого и руками.
Руками вообще делается многое — от feature sculpting до разработки структуры сети.

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

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

Но если есть агностические методы в игрушечных задачах, то они могут существовать и в больших. И поиск таких методов намного более интересен, чем тренировки автоэнкодеров на L2 метрике.
Особенно учитывая то, что на использованной здесь NCD метрике автоэнкодер натренировать скорее всего не получится.
Tags:
Hubs:
+10
Comments 12
Comments Comments 12

Articles