✏️ ️Посты 🌍 Путешествия Подписаться 👍 Донат
🔍
👤
У кого больше зла в твиттере?
19 мая 2012 — 33 комментария — 26422 просмотра — 546 слов

Кому лень читать, могут сразу отмотать в конец, там картинка.

Вчера мне выдался свободный денек и я решил посвятить его кодингу «для себя». Давно вынашивал план написать спам-фильтр для блога на основе каких-нибудь алгоритмов машинного обучения. Что-то типа собственного Akismet, только хуже. Конечно, ценность у проект представлял сугубо для меня, но саморазвитие - это же классно!

Для тех, кто не в курсе - как это все работает: в написании такой системы выбор пал на широко известные алгоритмы классификации, такие как наивный байесовский классификатор и метод Фишера (в наукозадротских кругах известный как «итеративный взвешенный метод наименьших квадратов», если я ничего опять не путаю). Хотел так же использовать давно любимые нейронные сети, но не смог нормально придумать входные сигналы. Любые попытки в конце сводились к вышесказанным классификаторам и я поклал хуй. Как известно и тот и другой метод являются примерами обучения с учителем.

Когда пара классов классификатора (кеке, каламбурчик) на Языке Самого Высокого Уровня Бетон было написано, мне внезапно пришла в голову идея. Классификатор ведь можно использовать не только для определения спама, он получился универсальный и принимал любое количество классов (категорий) для классификации. Тут как раз подвернулся под руку твиттер со своими вечными срачами и мне показалось интересным замерить количество ненависти в каждом из твиттер-аккаунтов моих знакомых. Задача показалась смешной и забавной и, конечно же, я как мудак решил ее реализовать. Никакой научной значимости и полезности для общества, в отличии отзывов на фламп, она не несет, так что можно считать, что я просто хорошо провел время.

Для обучения мне нужно было напарсить обучающее множество. Подключив python-twitter я написал простенький скрипт, который выводил твит и спрашивал есть ли в нем НЕНАВИСТЬ или ДОБРО. На обучение я убил, наверное, больше часа. Всего было собрано по больше 500 твитов в каждой из двух категорий, а сколько вашего я говна начитался - жесть. Но это все равно крайне мало для действительно показательных результатов, я просто заебался. Метод Фишера, реализованный в системе как главный, достаточно хорошо определяет вероятность и не будет лажать как Байес, если слово встретилось только 1 раз в какой-то категории. Будем надеяться. В качестве порогов я задал 0.8, то есть сообщение считается злом или добром только в случае более чем 80% уверенности. Запуск производился на 300 последних твитах пользователя, полученных все через тот же twitter api. Ретвиты не учитывались. И еще одна важная оговорка: мне было лень регать приложения, что-то там подключать, поэтому тестовые выборки делались в «файле ненависти» есть много твитов нашего любимого The___Master, см. пикрелейтед).

Итак, в первом раунде у нас участвуют: iTipsyL, un1or, ReDetection, s_mordvinov, netsvetaev, 2kay_, themylogin, enchantner, a_kadorkin, belokur, alex_ign, vas3k, nakukryskin, paulstashevsky, pechenushka, pro100che, The_Mindless, Feelek.

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

Позже, когда напишу нормальный класс для общения с классификатором и БД, выложу его на свой github, сможете поштырить.

Обучающие выборки не выкладываю во избежание срача и демагогии. Ну и наконец-то вот (кликабельно):



Комментировать
Комментарии 👇
potomushto 19 мая 2012 в 09:50 #
0

sentiment analysis, только я не понял какие фичи ты использовал, n-граммную модель языка?

vas3k 19 мая 2012 в 09:55 #
0

potomushto, ну изначальный проект не рассчитывался именно на sentiment analysis, так что n-граммы не юзал (кстати, отличная идея, надо попробовать, благодарю). Там просто слова нормализуются (приводятся к начальной форме) и подсчитывается сколько раз какое слово встретилось там и там. На основе этого потом подсчитывается суммарная вероятность всего текста (метод фишера использует функцию хи-квадрат для этого), короче все банально. Развиваться можно еще далеко :)

werehuman 19 мая 2012 в 10:03 #
0

Странно, я думал, что больше всего ненависти будет у тебя.

werehuman 19 мая 2012 в 10:03 #
0

Пока что кого точно помню, что забыл: o_Ohmy, werehuman, hanggard, кто еще? Я в твиттер по сути только репощу всякие смехуёчки, по мне вряд ли удастся что-то задетектить.

potomushto 19 мая 2012 в 10:11 #
0

ога, получается юниграмная частотная модель. Такие проекты-велосипеды на один день люблю я. Если будет интересно добей до какого-нибудь веб-сервиса с коррекцией, пусть по-тихому обучается дальше сам.

potomushto 19 мая 2012 в 10:14 #
0

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

potomushto 19 мая 2012 в 10:15 #
0

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

werehuman 19 мая 2012 в 10:40 #
0

potomushto, а ещё с такой кашей в голове, что никому ничего не понятно.

Psyhister 19 мая 2012 в 13:37 #
0

А меня? =(

Alive 19 мая 2012 в 14:25 #
0

Интересно, каким образом ты задавал "ненависть". Учитывая, что пол твиттера у меня - няшности - довольно странный результат. Да и твои ровные 50% радуют ;)

The Master 19 мая 2012 в 15:20 #
0

Э, а чё меня пропиарили а в таблице ненависти меня нету. Как так? Это дискриминация!!! Я буду жаловаться!

vas3k 19 мая 2012 в 16:35 #
0

The Master, у тебя акк закрытый :P Psyhister, точно, записал.

Sk8er 19 мая 2012 в 20:43 #
0

проверь меня)

vas3k 20 мая 2012 в 07:50 #
0

Добавил еще одну картинку

werehuman 20 мая 2012 в 08:20 #
0

Не, у тебя определённо очень предвзятые фильтры.

vas3k 20 мая 2012 в 08:41 #
0

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

vas3k 20 мая 2012 в 08:49 #
0

Интересно. Сколько, блядь, раз нужно предупредить в посте об этом, сколько раз сказать лично или еще где-то написать, что выборка мала, что обучение недостаточно, что показывает погоду, что просто ХА-ХА, БЛЯДЬ, ПОСМЕЯЛИСЬ И РАЗБЕЖАЛИСЬ, но нет же, каждый считает, что я лично сидел и его лично считал с ненавистью АХ ЭТОТ СМОРДВИНОВ И ВЕРХУМАН МЕНЯ ОБИДЕЛИ ЩАС Я ИМ ЗАРЕЖУ ДОБРА ХАХАХАХ. Да, я упомянул, что сделал главную ошибку - смешал обучающее и тестовое множество (хоть и обучающие твиты я выбирал ранние, а тестил на поздних), да, там далеко не совершенно всё, там используется, как уже обсуждали, униграммная модель, которая считает, что если слово "колбаса" встречалась больше в твитах ненависти - оно характеризует зло, обсуждение гомосексуалистов или iphone 4 - точно ненависть и наоборот. Это программа, написанная за час для лулзов, а вы побежали серьезно считать свои твиты. Это влияние пиратов на глобальное потепление, не более. Расслабьтесь, блядь.

werehuman 20 мая 2012 в 09:50 #
0

Чо ты бугуртишь ёбана? Все расслаблены, кроме тебя.

Alive 20 мая 2012 в 10:20 #
0

угу. Я без поддекста спросил. Мне правда интересны критерии "добра" и "зла".

vas3k 20 мая 2012 в 10:21 #
0

Alive, я тебе потом расскажу что такое машинное обучение, раз ты пропускал пары по нему. И как конкретно работает эта система на пальцах.

Alive 20 мая 2012 в 10:24 #
0

V@s3K, Как работает, я себе представляю более менее (хоть у нас и не было пар по этому всему). Мне интересен "словарь" именно.

vas3k 20 мая 2012 в 10:25 #
0

Alive, выборка из 1000 старых твитов разных людей (штук 20 по-моему), к сожалению, в том числе и ваших.

Alive 20 мая 2012 в 10:33 #
0

V@s3K, аааар. Я не про это же. Тупо приведи пример твита, который отправился в "зло". Не очевидного "заебали суки", естественно :(

vas3k 20 мая 2012 в 10:35 #
0

Alive, если я начну приводить примеры твитов, тут начнется "да я совсем не со зла это писал, это шутка была" и.т.д. Ну и плюс ошибки классификатора. Так что не буду.

Alive 20 мая 2012 в 10:36 #
0

V@s3K, Вааааася :(

... 20 мая 2012 в 12:11 #
0

выложу его на свой github выложи :) интересно посмотреть)

Psyhister 20 мая 2012 в 14:48 #
0

Охохо, я 4-5 по злу. Join the dark side, we have cookies! :D

Psyhister 20 мая 2012 в 14:53 #
0

И ваще, харе сраться, охуенно же. Я даже первые 2 коммента не понял =(

ReDetection 20 мая 2012 в 23:27 #
0

ыы) я в топе злости :D

@nakukryskin 21 мая 2012 в 07:54 #
0

Накукрыскин прямо одна из обителей зла :3

vas3k 21 мая 2012 в 07:55 #
0

@nakukryskin, почему это? У тебя наоборот высокие показатели достаточно.

ReDetection 21 мая 2012 в 14:00 #
0

кстати. если скармливать нейронной сети текст и разницу времени между предыдущим твитом, научить ее определять ФУТБОЛ The_Master'а, потом прикрутить это дело к yahoo pipes, то можно будет автоматически фильтровать всякое такое из ленты :)

корнхолио 26 июля 2012 в 07:46 #
0

меня забыл! у меня вообще тви полон зла!

Еще? Тогда вот