Сегодня мы напишем детектор троллей для нашего форума. Почему в decl? Потому что на эрланге.
Обнаруживать троллей мы будем простым и эффективгым способом: будем строить граф интересующей нас ветки. Вершинами графа будут юзеры, а ребра (соответствующего веса и толщины) будут связывать тех юзеров, которые что-то друг другу писали. По такому графу нетрудно догадаться, кто есть кто в ветке.
В качестве soap-клиента будем использовать оный из yaws, про который можно прочитать пару строк здесь: http://yaws.hyber.org/soap_intro.yaws. Таким образом, из эрланговых либ нам понадобятся:
1. yaws
2. erlsom
3. ibrowse (к сожалению, веб-сервис не желает работать, когда в качестве http-клиента используется оный из http).
Из тулзов:
1. graphviz
2. imagemagick
Первым делом, сгенерируем hrl со структурами для веб-сервиса: http://gist.github.com/145677.
Далее напишем функцию, которая достанет все сообщения ветки по id этой самой ветки (вообще, сервис вроде бы достает ветку по id сообщения в ней, но id ветки совпадает с id первого сообщения в ней):
Эта штука возвращает список структур 'p:JanusMessageInfo'. Далее, пользуясь тем, что веб-сервис отдает сообшения отсортированными по времени, посчитаем количество ответов, которые пользователи отправляли друг другу.
Попрошу заметить, что все имена вымышленные и любые их совпадения с никами реальных людей случайны.
Теперь этот список преобразуем в граф для graphviz:
Этот граф остается записать в файл и сконвертить в картинку. Для выявления троллей, на мой взгляд, больше всего подходит neato. Для нашей гипотетической ветки мы получим вот такой граф:
Итак, наиболее вероятно, что в данной ветке троллем является thesz. Другие участники дискуссии практически не общаются друг с другом — только лишь с thesz-ом. Также заметно, что основным оппонентом thesz-а является jazzer. Но поскольку ему (кроме thesz-а) практически никто не отвечает — можно предположить, что jazzer представляет мнение большинства, тогда как thesz играет роль провокатора.
В качестве последнего штриха сделаем вот что. Будем строить несколько графов, представляющих состояния ветки в разные моменты времени. А потом сделаем gif.
Такие дела. Как видите, мы написали очень полезную тулзу: она поможет модераторам более эффективно раздавать предупреждения, банить пользователей и применять другие меры наказания. Достаточно одного взгляда на граф "горячей" ветки, чтобы понять кто в ней троллит — и принять соответствующие меры. Ура, товарищи. Банхаммер, вперед!
"Mr.Cat" <64543@users.rsdn.ru> writes:
> В качестве soap-клиента будем использовать оный из yaws, про который можно прочитать пару строк здесь: http://yaws.hyber.org/soap_intro.yaws. Таким образом, из эрланговых либ нам понадобятся:
А можешь посоветовать какую-либо статью/документацию по установке
библиотек в Erlang? То есть, есть ли здесь какой пакетный менеджер
аналогичный setuptools в python и gems в ruby? Или надо с каждой
библиотекой разбираться отдельно? Где надо располагать их файлы и как
прописывать к ним пути?
Здравствуйте, DemAS, Вы писали:
DAS>"Mr.Cat" <64543@users.rsdn.ru> writes:
>> В качестве soap-клиента будем использовать оный из yaws, про который можно прочитать пару строк здесь: http://yaws.hyber.org/soap_intro.yaws. Таким образом, из эрланговых либ нам понадобятся:
DAS> А можешь посоветовать какую-либо статью/документацию по установке DAS>библиотек в Erlang? То есть, есть ли здесь какой пакетный менеджер DAS>аналогичный setuptools в python и gems в ruby? Или надо с каждой DAS>библиотекой разбираться отдельно? Где надо располагать их файлы и как DAS>прописывать к ним пути?
Здравствуйте, DemAS, Вы писали: DAS> А можешь посоветовать какую-либо статью/документацию по установке DAS>библиотек в Erlang? То есть, есть ли здесь какой пакетный менеджер DAS>аналогичный setuptools в python и gems в ruby? Или надо с каждой DAS>библиотекой разбираться отдельно? Где надо располагать их файлы и как DAS>прописывать к ним пути?
Пакетных менеджеров я, к сожалению, не знаю.
Про пути немного написано тут: http://erlang.org/doc/man/code.html, хотя немного запутано.
По-моему, самый надежный способ — скомпилировав либу, положить папку с ней () в code:lib_dir() таким вот образом:
|-- code:lib_dir()
|-- library-version
|-- ebin <- *.beam идут сюда
|-- include <- *.hrl идут сюда
|-- src <- *.erl идут сюда
Что стоит учесть — изменения в этой папке не вступают в силу сами по себе во время выполнения.
Здравствуйте, DemAS, Вы писали:
DAS>"Mr.Cat" <64543@users.rsdn.ru> writes:
>> В качестве soap-клиента будем использовать оный из yaws, про который можно прочитать пару строк здесь: http://yaws.hyber.org/soap_intro.yaws. Таким образом, из эрланговых либ нам понадобятся:
DAS> А можешь посоветовать какую-либо статью/документацию по установке DAS>библиотек в Erlang? То есть, есть ли здесь какой пакетный менеджер DAS>аналогичный setuptools в python и gems в ruby? Или надо с каждой DAS>библиотекой разбираться отдельно? Где надо располагать их файлы и как DAS>прописывать к ним пути?
Здравствуйте, Mr.Cat, Вы писали:
MC>Вершинами графа будут юзеры, а ребра (соответствующего веса и толщины) будут связывать тех юзеров, которые что-то друг другу писали.
Имхо, этот граф должен быть направленным. Иначе теоретически в «центре розы» может оказаться участник, который вообще не написал ни одного комментария. Пусть некие вымышленные VladD2, Ikemefula, eao197, DarkGray и jazzer (а ведь это может быть армия виртуалов одного и того же злоумышленника!) собрались скопом потроллить (т.н. «рейд») одного участника, скажем, thesz. Если они написали жертве каждый по 2 комментария, а jazzer — все десять, то получится картинка примерно похожая на первый гиф.
MC>Банхаммер, вперед!
Знавал я троллей, комменты которых были категорически интересней, чем у большинства участников атакуемой ветки. Иногда полезней зарыть не топор войны, а банхаммер. Чтоб формальный предлог применения оного не довлел над поиском истины, так сказать. Чтоб с водой не выплеснуть и ребёнка, чтоб за формой не потерять содержание, ну вы поняли.
MC>linewidth(Weight) -> ...
Было бы неплохо, если бы детектор ещё визуализировал толщину самого тролля :)
Здравствуйте, Qbit86, Вы писали: Q>Имхо, этот граф должен быть направленным. Иначе теоретически в «центре розы» может оказаться участник, который вообще не написал ни одного комментария. Пусть некие вымышленные VladD2, Ikemefula, eao197, DarkGray и jazzer (а ведь это может быть армия виртуалов одного и того же злоумышленника!) собрались скопом потроллить (т.н. «рейд») одного участника, скажем, thesz. Если они написали жертве каждый по 2 комментария, а jazzer — все десять, то получится картинка примерно похожая на первый гиф.
Оптимальная форма представления — это, конечно, открытый вопрос. Помнится, примерно таким графом ктото на канале #scheme визуализировал дискуссии — и мне он показался довольно неплохим по соотношению простота реализации/выразительность.
Например, можно рисовать ребро с суммой сообщений, если юзеры пишут друг другу примерно в равных количествах, и дуги, если кто-то пишет больше. Как-то так:
MC>Итак, наиболее вероятно, что в данной ветке троллем является thesz. Другие участники дискуссии практически не общаются друг с другом — только лишь с thesz-ом. Также заметно, что основным оппонентом thesz-а является jazzer. Но поскольку ему (кроме thesz-а) практически никто не отвечает — можно предположить, что jazzer представляет мнение большинства, тогда как thesz играет роль провокатора.
А может быть и иначе — thesz отвечает на вопросы контингента а jazzer пытается на него наскакивать.
Вообще в любой дискуссии, мало-мальски занятной, будь то в интернет, будь то в реальной жизни, никогда не бывает такой ситуации, когда все общаются со всеми.
Практически всегда выделяются фракции в зависимости от взглядов, интересов, возраста, опыта и тд и тд.
Здравствуйте, DemAS, Вы писали:
DAS>"thesz" <49985@users.rsdn.ru> writes:
>> Cabal.
DAS> Замечательная штука, но при чем тут Haskell, если речь шла про Erlang?
Здравствуйте, Mr.Cat, Вы писали:
MC>Сегодня мы напишем детектор троллей для нашего форума. Почему в decl? Потому что на эрланге.
Из-за сбившегося форматирования (текст много шире окна просмотра) я не прочитал основной комментарий, а читал только комментарии поменьше.
Что делает моё поведение ещё более забавным.
PS
(к главным по RSDN)
А нельзя ли сделать так, чтобы текст пояснение не вылезал за пределы окна просмотра вне зависимости, вылезает ли код примеров? А то жутко неудобно читать.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, DemAS, Вы писали:
DAS>"Mr.Cat" <64543@users.rsdn.ru> writes:
>> В качестве soap-клиента будем использовать оный из yaws, про который можно прочитать пару строк здесь: http://yaws.hyber.org/soap_intro.yaws. Таким образом, из эрланговых либ нам понадобятся:
DAS> А можешь посоветовать какую-либо статью/документацию по установке DAS>библиотек в Erlang? То есть, есть ли здесь какой пакетный менеджер DAS>аналогичный setuptools в python и gems в ruby? Или надо с каждой DAS>библиотекой разбираться отдельно? Где надо располагать их файлы и как DAS>прописывать к ним пути?
Здравствуйте, thesz, Вы писали:
T>А нельзя ли сделать так, чтобы текст пояснение не вылезал за пределы окна просмотра вне зависимости, вылезает ли код примеров? А то жутко неудобно читать.
Здравствуйте, Ikemefula, Вы писали: I>А можно как нибудь сложить это все в одну пачку, что взял да запустил одним кликом ?
Охх, этого я пока не предусмотрел... Если выдастся свободное время — могу попробовать собрать все вместе... Там вон, гляжу, про билдсистемы/пакетные менеджеры подсказывают.
Здравствуйте, Ikemefula, Вы писали: I>А может быть и иначе — thesz отвечает на вопросы контингента а jazzer пытается на него наскакивать. I>Вообще в любой дискуссии, мало-мальски занятной, будь то в интернет, будь то в реальной жизни, никогда не бывает такой ситуации, когда все общаются со всеми. I>Практически всегда выделяются фракции в зависимости от взглядов, интересов, возраста, опыта и тд и тд. I>И одна из фракций будет обязательно в центре.
Ну так я и не претендовал на достоверность.
Все-таки автоматическое распознавание троллей — это тянет на тему для диссертации по какой-нибудь социологии.
Здравствуйте, Mr.Cat, Вы писали:
I>>Практически всегда выделяются фракции в зависимости от взглядов, интересов, возраста, опыта и тд и тд. I>>И одна из фракций будет обязательно в центре.
MC>Ну так я и не претендовал на достоверность. MC>Все-таки автоматическое распознавание троллей — это тянет на тему для диссертации по какой-нибудь социологии.
Тролль это очень мутное понятие, неясно что в себя включает.