Пишем парсер комментариев. Фильтруем спам и неадекватов
На Либератуме вот-вот начнет действовать парсер комментариев. Он и сейчас действует, не давая спамерам размещать анонимные ссылки, дебилам писать бессмысленные наборы букв, а «любителям прекрасного» ставить кучу минусов вместо тире.
Есть предложение сильнее нагрузить парсер работой. Вот мои предложения:
1. Парсер должен уметь фильтровать каменты по IP. Дело в том, что сейчас на сайте есть только один способ попрощаться с дебилом — забанить его по IP. Хотелось бы ввести режим, когда дебил будет не блокироваться, а переводиться в режим только для чтения. И чтобы этот режим автоматически снимался через заданный промежуток (а то я сам забываю снимать баны, динамические адреса меняются и невинные люди не могут зайти на сайт).
2. Парсер должен уметь по ключевым словам распознавать анонимные комментарии троллей и отправлять их на предмодерацию.
3. Парсер должен делать даже из говнокомментария (по форме, а не по содержанию) конфетку:
— менять минус, окруженный двумя или более пробелами на длинное тире;
— буква после точки с пробелом должна приводиться к верхнему регистру;
— знаки дюйма должны заменяться на кавычки (вложенные кавычки должны меняться на лапки);
— после знаков пунктуации должен следовать пробел;
— повторяющиеся элементы должны сокращаться до приемлемых размеров (многоточие из 10 точек до нормальных 3);
— элементы интернет-фольклора должны вырезаться (!!!!!!!11одинодин);
— парсер должен вести постоянную борьбу с псевдографикой (_____________);
— и другое.
Что еще поручим парсеру?
Чингачгук
24 ноября, 2013 - 01:33
Кажется я ещё в 2009 году про это писал: однозначно надо!
Это глупо. Парсер "--- не искусственный интеллект и вместо этого будем получать фигню.
+ Троллинг, а не задалбывание оппонента своей тупость или навязчивостью (aka преследование), бытовое хамство или засирание комментов всякой фигнёй (aka вайп) "--- явление в целом положительное, т.к. основной своей целью ставит получение лулзов от разрыва шаблона оппонента. Т.е., когда твоему оппоненту нечем ответить на твою точку зрения, кроме хамства и НЕНАВИСТИ, но очень хочется.
Вообще-то в стандартной раскладке это всё же дефис.
Во-вторых, лучше тире ставить даже для одного дефиса, если вокруг него есть хотя бы два пробела.
Кроме того, стоит добавить диапазоны (т.е. среднее тире), когда вокруг одного или более дефиса стоят цифры;
ставить знак минуса (есть и такой знак), если следует такая комбинация: пробел-дефис-цифра;
ставить спец. знак для сложных имён (например, Анна-Мария), если оба слова вокруг дефиса начинаются с заглавных букв.
Вот это не надо, иначе будем получать фигню типа "За 100 руб. Можно купить..."
С этим надо быть осторожнее, т.к. знаки пунктуации много где используются. Например, запятая в числе 12,345 совсем не нужна.
+1
Хорошо бы преобразовывать эти точки в символ "многоточие".
Это слишком сложно. Да и не нужно. Разве что совсем вопиющие случай типа приведённого выше.
Да и этого вполне много!
pomodor
24 ноября, 2013 - 22:09
Тут есть маленькая техническая проблемка, связанная с движком. Например, юзер может нашкодить и через месяц перевоспитаться. А целая подсеть т.н. абузоустойчивого провайдера может использоваться для рассылки спама на протяжении многих лет. Проблема в том, что и те, и другие баны размещаются в одной таблице, которая не предусматривает временных отметок:
CREATE TABLE IF NOT EXISTS `access` (
`aid` int(11) NOT NULL AUTO_INCREMENT,
`mask` varchar(255) NOT NULL DEFAULT '',
`type` varchar(255) NOT NULL DEFAULT '',
`status` tinyint(4) NOT NULL DEFAULT '0',
PRIMARY KEY (`aid`)
);
Чтобы прикрутить временный бан придется либо допиливать эту таблицу (что может привести к конфликтам с другими модулями Drupal), либо запилить свою таблицу, но тогда придется вводить дополнительные проверки при создании новых материалов, при попытке логина и на ввод каментов. В Друпале это делается через хуки и не самым лучшим образом сказывается на производительности.
Я склоняюсь к третьему способу — заводится отдельная таблица, в ней IP тех комментаторов, чье творчество будет отправляться на предмодерацию. Каждая запись живет в таблице только определенное время и потом автоматом выпиливается.
ИИ тут не нужен, нужен обыкновенный байесовский фильтр. Он идеально подходит, так как данные для его обучения уже собраны — это сами каменты + голосовалка «5 звезд». Сработал фильтр — камент на предмодерацию.
За лулзами лучше в цирк.
ИХМО, развлечение для задротов, которые в RL никому не нужны. Зачем мне сидеть у компа и у кого-то вызывать ненависть, если можно пойти с друзьями пообщаться, спортом позаниматься или денег заработать?
Не совсем так. Код этой клавиши не совпадает с неразрывным дефисом (‑). Да и визуально видно, что он короче. Кстати, и с минусом (−) тоже не совпадает. Тут один товарищ пишет, что на клавиатуре вообще знак дефисоминуса.
Тут согласен. Не говоря уже о том, что даже после сокращений точка может ставиться, а может и не ставиться. Например: "млн" без точки и "тыс." с точкой. Но хотелось бы как-то исправлять каменты, которые полностью набраны в нижнем регистре — раздражает. Например, такой фильтр: все набрано только в верхнем или только в нижнем и имеется несколько точек в самом каменте — в топку.
Почему? Использование восклицательного знака более-менее однозначно: только в конце слова, после него пробел. Да и по общему количеству восклицаний можно судить о каменте. Пример. Кстати, к этому топику можно все каменты прогнать через «восклицательный фильтр» и ничего ценного потеряно не будет. :)
Чингачгук
25 ноября, 2013 - 21:13
Идея хорошая. Но как будет чиститься таблица? По крону? Тогда его надо запускать как минимум раз в час, что так же нагрузит БД. Триггеры тут вообще не в тему, т.к. нагрузят сервер ещё сильнее.
Здесь две проблемы:
1) У бейесовского метода есть и принципиальный недостаток: он базируется на предположении, что одни слова чаще встречаются в нежелательных комментах, а другие — в обычных, и неэффективен, если данное предположение неверно. Это прокатывает для спама, но для комментов это предположение скорее всего ошибочно.
2) голосовалка «5 звезд» "--- явно нерелевантна желательности/нежелательности комментария, т.к. отражает скорее отношение к комменту, а не его качество.
Этот вопрос вы можете задать себе по результатам комментирования поста liberatum.ru/news/vozrast-razrabotchika-linux
Возможно потому, что это обычный "разрывный" дефис?
В любом случае, это не тире.
Тогда уж не только точек, но воскл. знаков. И не в топку, а не премодерацию. Иначе будет добавлены буквы в другом регистре в самых неожиданных МеСтАх.
А ещё после цифры (знак факториала) и без разрыва, после другого воскл. знака (усиление или двойной факториал), в скобочках (журналистский укороченный вариант (sic!)) и т.д. и т.п.
Максимум можно ограничить число воскл. знаков тремя без учёта пробельных символов. Но это не спасёт от "1111" и "одинодинодин".
pomodor
25 ноября, 2013 - 22:05
Да. Тем более, что Крон уже и так вызывается каждый час. Это стандартное требование движка Drupal для любого сайта. Добавляем в hook_cron() один запрос к БД на удаление всех записей старше заданной временной отметки и все.
А что не так? Или Вы считаете троллей большими оригиналами? Уверен, что если не в каждом, так хоть в некоторых комментариях будут попадаться ключевые слова, которые можно с высокой вероятностью отнести к творчеству троллей. Из научного интереса, чуть позже попробую составить частотный словарь по ссылке, которую Вы дали ниже.
Тем более, что есть дополнительные факторы: количество комментариев в час, распределение комментариев одного автора по темам, рейтинг комментариев. Думаю, даже без байесовского фильтра можно придумать алгоритм.
Так отношение и нужно. Если товарищ в каждом каменте вызывает неодобрение публики, с какой вероятностью его автоматическое выпиливание нанесет сайту вред? Трудно даже представить себе такой случай.
Зашита ориентирована на пионеров, попавших на сайт случайно. Например, часто школьники пишут, переходя с поисковиков по запросам, связанным с Вконтактом. Постоянные читатели, разобравшиеся как работает парсер, все равно обойдут защиту.
Как Вы думаете, из 40 тыс. каментов на этом сайте, сколько из них содержат знак двойного факториала? :)
pomodor
25 ноября, 2013 - 22:43
К разговору о фильтре по ключевым словам. Самый непопулярный комментарий на сайте за всю историю вот. 64 минуса. Половина слов в нем входит в группу подозрительных.
Второй по непопулярности вот. 23 минуса. Опять половина слов, характерных для нежелательных каментов.
Третий. Вот. Тут осечка.
Четвертый. Ключевых слов нет, из 4 слов в одном орфографическая ошибка.
Пятый. Вообще шедевр. Странно, как такое пропустили модераторы. Тут уже можно использовать слова для обучения.
Обработав тысячи комментариев, можно получить неплохой словарик. По нему проверяем все каменты по каждому автору, смотрим усредненную оценку автора и его активность по отдельным темам. По этим данным уже можно строить гипотезу о принадлежности комментатора к одной из групп: порядочные пользователи, дураки, тролли и т.п. Например, срабатывает фильтр по словам, но в топике этот автор оставил только один комментарий. Делаем вывод, что это вряд ли тролль. Выпиливаем комментарий, но не баним самого юзера. Ну и так далее. Как Вам такая идея?
Проблема лишь в том, чтобы не положить этой проверкой сайт. :)
pomodor
1 декабря, 2013 - 05:19
Кое-какие изменения внесены в работу парсера. Возможны адские глюки. Просьба бдить и сразу сообщать.
comrade
24 декабря, 2013 - 10:40
Нельзя ли, всё же, кавычки на ёлочки не менять?
Понимаю, Новый Год, и всё такое...
Просто я, например, пользуюсь и тем, и тем, в разных случаях. И сам умею ёлочки ставить компизом. Что могут и другие пользователи линукса использовать.
А жертвам виндовса можно добавить ещё одну кнопочку над окошком набора комментария – "Кавычки Ёлочки, они же Лапки":))
Иногда удобно по смыслу два типа кавычек использовать. Они могут, даже, в одной фразе оказаться вложенными!
К тому же парсер ошибается – с частотой 1/2, 1/3 – левую кавычку меняет на ёлку, а правая остаётся обычной верхней кавычкой(((-:
comrade
24 декабря, 2013 - 10:42
«первую пару кавычек парсер правильно переделал», «вторую - нет"
pomodor
24 декабря, 2013 - 11:27
Проверка: «первая пара кавычек», «вторая пара кавычек».
pomodor
24 декабря, 2013 - 11:30
У меня все работает. Смею предположить, что у Вас парсер не сработал потому, что не обнаружил в Вашем сообщении предложений. Как известно, предложение заканчивается точкой.
Но спасибо за замечания. Допишу правила.
Что касается Вашей просьбы по поводу отключения парсера, то и она будет удовлетворена.
Комментировать