Пишем парсер комментариев. Фильтруем спам и неадекватов

На Либератуме вот-вот начнет действовать парсер комментариев. Он и сейчас действует, не давая спамерам размещать анонимные ссылки, дебилам писать бессмысленные наборы букв, а «любителям прекрасного» ставить кучу минусов вместо тире.

Есть предложение сильнее нагрузить парсер работой. Вот мои предложения:

1. Парсер должен уметь фильтровать каменты по IP. Дело в том, что сейчас на сайте есть только один способ попрощаться с дебилом — забанить его по IP. Хотелось бы ввести режим, когда дебил будет не блокироваться, а переводиться в режим только для чтения. И чтобы этот режим автоматически снимался через заданный промежуток (а то я сам забываю снимать баны, динамические адреса меняются и невинные люди не могут зайти на сайт).

2. Парсер должен уметь по ключевым словам распознавать анонимные комментарии троллей и отправлять их на предмодерацию.

3. Парсер должен делать даже из говнокомментария (по форме, а не по содержанию) конфетку:
— менять минус, окруженный двумя или более пробелами на длинное тире;
— буква после точки с пробелом должна приводиться к верхнему регистру;
— знаки дюйма должны заменяться на кавычки (вложенные кавычки должны меняться на лапки);
— после знаков пунктуации должен следовать пробел;
— повторяющиеся элементы должны сокращаться до приемлемых размеров (многоточие из 10 точек до нормальных 3);
— элементы интернет-фольклора должны вырезаться (!!!!!!!11одинодин);
— парсер должен вести постоянную борьбу с псевдографикой (_____________);
— и другое.

Что еще поручим парсеру?

field_vote: 
Пока без оценки

И чтобы этот режим автоматически снимался через заданный промежуток

Кажется я ещё в 2009 году про это писал: однозначно надо!

Парсер должен уметь по ключевым словам распознавать анонимные комментарии троллей и отправлять их на предмодерацию.

Это глупо. Парсер "--- не искусственный интеллект и вместо этого будем получать фигню.

+ Троллинг, а не задалбывание оппонента своей тупость или навязчивостью (aka преследование), бытовое хамство или засирание комментов всякой фигнёй (aka вайп) "--- явление в целом положительное, т.к. основной своей целью ставит получение лулзов от разрыва шаблона оппонента. Т.е., когда твоему оппоненту нечем ответить на твою точку зрения, кроме хамства и НЕНАВИСТИ, но очень хочется.

менять минус, окруженный двумя или более пробелами на длинное тире;

Вообще-то в стандартной раскладке это всё же дефис.

Во-вторых, лучше тире ставить даже для одного дефиса, если вокруг него есть хотя бы два пробела.

Кроме того, стоит добавить диапазоны (т.е. среднее тире), когда вокруг одного или более дефиса стоят цифры;
ставить знак минуса (есть и такой знак), если следует такая комбинация: пробел-дефис-цифра;
ставить спец. знак для сложных имён (например, Анна-Мария), если оба слова вокруг дефиса начинаются с заглавных букв.

буква после точки с пробелом должна приводиться к верхнему регистру;

Вот это не надо, иначе будем получать фигню типа "За 100 руб. Можно купить..."

после знаков пунктуации должен следовать пробел;

С этим надо быть осторожнее, т.к. знаки пунктуации много где используются. Например, запятая в числе 12,345 совсем не нужна.

знаки дюйма должны заменяться на кавычки (вложенные кавычки должны меняться на лапки);

+1

повторяющиеся элементы должны сокращаться до приемлемых размеров (многоточие из 10 точек до нормальных 3);

Хорошо бы преобразовывать эти точки в символ "многоточие".

элементы интернет-фольклора должны вырезаться (!!!!!!!11одинодин);

Это слишком сложно. Да и не нужно. Разве что совсем вопиющие случай типа приведённого выше.

Что еще поручим парсеру?

Да и этого вполне много!

Кажется я ещё в 2009 году про это писал: однозначно надо!

Тут есть маленькая техническая проблемка, связанная с движком. Например, юзер может нашкодить и через месяц перевоспитаться. А целая подсеть т.н. абузоустойчивого провайдера может использоваться для рассылки спама на протяжении многих лет. Проблема в том, что и те, и другие баны размещаются в одной таблице, которая не предусматривает временных отметок:

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 никому не нужны. Зачем мне сидеть у компа и у кого-то вызывать ненависть, если можно пойти с друзьями пообщаться, спортом позаниматься или денег заработать?

Вообще-то в стандартной раскладке это всё же дефис.

Не совсем так. Код этой клавиши не совпадает с неразрывным дефисом (‑). Да и визуально видно, что он короче. Кстати, и с минусом (−) тоже не совпадает. Тут один товарищ пишет, что на клавиатуре вообще знак дефисоминуса.

иначе будем получать фигню типа "За 100 руб. Можно купить..."

Тут согласен. Не говоря уже о том, что даже после сокращений точка может ставиться, а может и не ставиться. Например: "млн" без точки и "тыс." с точкой. Но хотелось бы как-то исправлять каменты, которые полностью набраны в нижнем регистре — раздражает. Например, такой фильтр: все набрано только в верхнем или только в нижнем и имеется несколько точек в самом каменте — в топку.

должны вырезаться (!!!!!!!11одинодин); Это слишком сложно.

Почему? Использование восклицательного знака более-менее однозначно: только в конце слова, после него пробел. Да и по общему количеству восклицаний можно судить о каменте. Пример. Кстати, к этому топику можно все каменты прогнать через «восклицательный фильтр» и ничего ценного потеряно не будет. :)

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

Идея хорошая. Но как будет чиститься таблица? По крону? Тогда его надо запускать как минимум раз в час, что так же нагрузит БД. Триггеры тут вообще не в тему, т.к. нагрузят сервер ещё сильнее.

ИИ тут не нужен, нужен обыкновенный байесовский фильтр. Он идеально подходит, так как данные для его обучения уже собраны — это сами каменты + голосовалка «5 звезд».

Здесь две проблемы:

1) У бейесовского метода есть и принципиальный недостаток: он базируется на предположении, что одни слова чаще встречаются в нежелательных комментах, а другие — в обычных, и неэффективен, если данное предположение неверно. Это прокатывает для спама, но для комментов это предположение скорее всего ошибочно.

2) голосовалка «5 звезд» "--- явно нерелевантна желательности/нежелательности комментария, т.к. отражает скорее отношение к комменту, а не его качество.

ИХМО, развлечение для задротов, которые в RL никому не нужны. Зачем мне сидеть у компа и у кого-то вызывать ненависть, если можно пойти с друзьями пообщаться, спортом позаниматься или денег заработать?

Этот вопрос вы можете задать себе по результатам комментирования поста liberatum.ru/news/vozrast-razrabotchika-linux

Не совсем так. Код этой клавиши не совпадает с неразрывным дефисом (‑).

Возможно потому, что это обычный "разрывный" дефис?

Да и визуально видно, что он короче. Кстати, и с минусом (−) тоже не совпадает. Тут один товарищ пишет, что на клавиатуре вообще знак дефисоминуса.

В любом случае, это не тире.

Например, такой фильтр: все набрано только в верхнем или только в нижнем и имеется несколько точек в самом каменте — в топку.

Тогда уж не только точек, но воскл. знаков. И не в топку, а не премодерацию. Иначе будет добавлены буквы в другом регистре в самых неожиданных МеСтАх.

Почему? Использование восклицательного знака более-менее однозначно: только в конце слова, после него пробел.

А ещё после цифры (знак факториала) и без разрыва, после другого воскл. знака (усиление или двойной факториал), в скобочках (журналистский укороченный вариант (sic!)) и т.д. и т.п.

Максимум можно ограничить число воскл. знаков тремя без учёта пробельных символов. Но это не спасёт от "1111" и "одинодинодин".

Но как будет чиститься таблица? По крону? Тогда его надо запускать как минимум раз в час

Да. Тем более, что Крон уже и так вызывается каждый час. Это стандартное требование движка Drupal для любого сайта. Добавляем в hook_cron() один запрос к БД на удаление всех записей старше заданной временной отметки и все.

он базируется на предположении, что одни слова чаще встречаются в нежелательных комментах, а другие — в обычных

А что не так? Или Вы считаете троллей большими оригиналами? Уверен, что если не в каждом, так хоть в некоторых комментариях будут попадаться ключевые слова, которые можно с высокой вероятностью отнести к творчеству троллей. Из научного интереса, чуть позже попробую составить частотный словарь по ссылке, которую Вы дали ниже.

Тем более, что есть дополнительные факторы: количество комментариев в час, распределение комментариев одного автора по темам, рейтинг комментариев. Думаю, даже без байесовского фильтра можно придумать алгоритм.

голосовалка «5 звезд» "--- явно нерелевантна желательности/нежелательности комментария, т.к. отражает скорее отношение к комменту, а не его качество"

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

Иначе будет добавлены буквы в другом регистре в самых неожиданных МеСтАх.

Зашита ориентирована на пионеров, попавших на сайт случайно. Например, часто школьники пишут, переходя с поисковиков по запросам, связанным с Вконтактом. Постоянные читатели, разобравшиеся как работает парсер, все равно обойдут защиту.

или двойной факториал

Как Вы думаете, из 40 тыс. каментов на этом сайте, сколько из них содержат знак двойного факториала? :)

К разговору о фильтре по ключевым словам. Самый непопулярный комментарий на сайте за всю историю вот. 64 минуса. Половина слов в нем входит в группу подозрительных.

Второй по непопулярности вот. 23 минуса. Опять половина слов, характерных для нежелательных каментов.

Третий. Вот. Тут осечка.

Четвертый. Ключевых слов нет, из 4 слов в одном орфографическая ошибка.

Пятый. Вообще шедевр. Странно, как такое пропустили модераторы. Тут уже можно использовать слова для обучения.

бля 2 1.092896
какого 2 1.092896
стиральной 2 1.092896
хочеться 2 1.092896
постирать 2 1.092896
линуксятники 2 1.092896
просто 2 1.092896
машине 2 1.092896
ответ 2 1.092896
нигде 1 0.5464481
поезд 1 0.5464481
ок 1 0.5464481
ооо 1 0.5464481
дерьма 1 0.5464481
претендовать 1 0.5464481
тупой 1 0.5464481
обычно 1 0.5464481
должны 1 0.5464481
причем 1 0.5464481
скорость 1 0.5464481
ааааа 1 0.5464481
срать 1 0.5464481
копашиться 1 0.5464481
тему 1 0.5464481
давайка 1 0.5464481
й 1 0.5464481
круто 1 0.5464481
обычным 1 0.5464481
всех 1 0.5464481
люди 1 0.5464481
заборе 1 0.5464481
микроконтролер 1 0.5464481
aptitude 1 0.5464481
винде 1 0.5464481
негатива 1 0.5464481
бисто 1 0.5464481
видел 1 0.5464481
вопрос 1 0.5464481
огребешь 1 0.5464481
воняли 1 0.5464481
займете 1 0.5464481
нишу 1 0.5464481
добивался 1 0.5464481
никогда 1 0.5464481
оборотов 1 0.5464481
пипец 1 0.5464481
результата 1 0.5464481
нада 1 0.5464481
командах 1 0.5464481
нить 1 0.5464481
адрес 1 0.5464481
назат 1 0.5464481
опросов 1 0.5464481
окружающих 1 0.5464481
хочешь 1 0.5464481
типа 1 0.5464481
тогда 1 0.5464481
копаться 1 0.5464481
программист 1 0.5464481
админ 1 0.5464481
прочитать 1 0.5464481
смеритесь 1 0.5464481
колокольни 1 0.5464481
остальных 1 0.5464481
прежде 1 0.5464481
кучу 1 0.5464481
возразите 1 0.5464481
кстати 1 0.5464481
обычные 1 0.5464481
свою 1 0.5464481
покопаемся 1 0.5464481
ls 1 0.5464481
мелкомягких 1 0.5464481
ушел 1 0.5464481
такого 1 0.5464481
мировое 1 0.5464481
дороги 1 0.5464481
зауважают 1 0.5464481
хотеть 1 0.5464481
apt 1 0.5464481
должен 1 0.5464481
носочки 1 0.5464481
спецов 1 0.5464481
всего 1 0.5464481
крутых 1 0.5464481
грязные 1 0.5464481
линуксу 1 0.5464481
перепрошить 1 0.5464481
консоле 1 0.5464481
остальное 1 0.5464481
get 1 0.5464481
перестанете 1 0.5464481
госполство 1 0.5464481
ууу 1 0.5464481
х 1 0.5464481
ниша 1 0.5464481
перестаните 1 0.5464481
сам 1 0.5464481
людям 1 0.5464481
лидеры 1 0.5464481
степени 1 0.5464481
меньше 1 0.5464481
разобратьсо 1 0.5464481
grep 1 0.5464481
манипуляцие 1 0.5464481
традиционно 1 0.5464481
настроить 1 0.5464481

Обработав тысячи комментариев, можно получить неплохой словарик. По нему проверяем все каменты по каждому автору, смотрим усредненную оценку автора и его активность по отдельным темам. По этим данным уже можно строить гипотезу о принадлежности комментатора к одной из групп: порядочные пользователи, дураки, тролли и т.п. Например, срабатывает фильтр по словам, но в топике этот автор оставил только один комментарий. Делаем вывод, что это вряд ли тролль. Выпиливаем комментарий, но не баним самого юзера. Ну и так далее. Как Вам такая идея?

Проблема лишь в том, чтобы не положить этой проверкой сайт. :)

Кое-какие изменения внесены в работу парсера. Возможны адские глюки. Просьба бдить и сразу сообщать.

comrade аватар

Нельзя ли, всё же, кавычки на ёлочки не менять?
Понимаю, Новый Год, и всё такое...

Просто я, например, пользуюсь и тем, и тем, в разных случаях. И сам умею ёлочки ставить компизом. Что могут и другие пользователи линукса использовать.
А жертвам виндовса можно добавить ещё одну кнопочку над окошком набора комментария – "Кавычки Ёлочки, они же Лапки":))

Иногда удобно по смыслу два типа кавычек использовать. Они могут, даже, в одной фразе оказаться вложенными!

К тому же парсер ошибается – с частотой 1/2, 1/3 – левую кавычку меняет на ёлку, а правая остаётся обычной верхней кавычкой(((-:

comrade аватар

«первую пару кавычек парсер правильно переделал», «вторую - нет"

Проверка: «первая пара кавычек», «вторая пара кавычек».

У меня все работает. Смею предположить, что у Вас парсер не сработал потому, что не обнаружил в Вашем сообщении предложений. Как известно, предложение заканчивается точкой.

Но спасибо за замечания. Допишу правила.

Что касается Вашей просьбы по поводу отключения парсера, то и она будет удовлетворена.

Комментировать

Filtered HTML

  • Use [fn]...[/fn] (or <fn>...</fn>) to insert automatically numbered footnotes.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <blockquote> <strike> <code> <h2> <h3> <h4> <h5> <del> <img>
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.