Ну во-первых, регистрация новых пользователей с момента голосования запрещена. А во-вторых, я периодически вычищаю голоса дублонов и пользователей из-за VPN.
Видимо всё-таки славянка, а не Славянка. Судя по вашим комментариям, вы попали под раздачу, когда ответили ВБР, или как он там в то время назывался. Не связывайтесь с отбросами общества — и всё будет у вас хорошо. Логиньтесь как славянка, кто ж вам мешает-то.
2) Почему вы решили, что на место "пауков" придут умные, интересные, вежливые юзеры?
Если даже и не придут, количество проблем, требующих ежедневного внимания, уменьшится. У нас есть пользователь, бывший ВБР, а теперь человек с тысячью ников, который пишет анонимки в полицию, постит гадости в социальных сетях, а когда вдруг прорывается на сайт — так просто всех подряд задирает.
Так можно ведь отменять свой голос. Кто-то отменил видно. А по поводу фальсификаций… ну кто будет этим заморачиваться? Только Глебов, но он уже даже не модератор.
Вместо того, чтобы писать точки, напишите на webmaster@russian-belgium.be, чтобы вас добавили в раздел Няни. Нужно ваше фото, телефон, примерный адрес (хотя бы коммуна и почтовый иднекс) и пару слов о себе.
Например, даже в приведенном макете нет в меню ссылки типа "Каталог предприятий", где вообще эта страница , где выводится лента этих предприятий? Ну понятно есть "Карта", переходишь на эту страницу видишь карту, а под ней пустота. Ну хотя бы пустили бы под ней материалы из Раздела (Тип материалов) этих самых предприятий!
А у меня есть предложение к Администратору: опубликуйте алгоритм, а мы тут сообща попробуем довести его до кондиции.
Да пожалуста:
Делаем выборку данных
SELECT v1.uid uid1, v2.uid uid2, u1.name name1, u2.name name2,
v2.entity_id entity_id, v1.value value1, v2.value value2
FROM votingapi_vote v1
JOIN (votingapi_vote v2, users u1, users u2)
ON (v1.uid != v2.uid AND v1.entity_id=v2.entity_id
AND v1.entity_type=v2.entity_type AND v1.uid=u1.uid AND v2.uid=u2.uid)
WHERE v1.uid < v2.uid AND v1.uid != 0 AND v2.uid != 0
ORDER BY v1.uid,v2.uid;
JOIN таблицы votingapi_vote на себя саму выбирает все пермутации пар пользователей, а условие v1.uid < v2.uid превращает пермутации в комбинации.
Условие v1.entity_id=v2.entity_id AND v1.entity_type=v2.entity_type позволяет выбрать голоса, которые пользователи отдали за одну и ту же тему или комментарий. Скажем, первая строчка в нашей выборке означает, что Administrator и Bob дали 100 очков одной и той же теме или одному и тому же комментарию.
uid1 uid2 name1 name2 value1 value2
1 2 Administrator Bob 100 100
1 2 Administrator Bob 20 20
1 2 Administrator Bob 40 40
1 2 Administrator Bob 100 100
1 2 Administrator Bob 20 100
1 2 Administrator Bob 100 100
1 2 Administrator Bob 100 100
1 2 Administrator Bob 100 100
1 2 Administrator Bob 100 100
1 2 Administrator Bob 80 80
1 2 Administrator Bob 100 20
1 2 Administrator Bob 20 20
1 2 Administrator Bob 60 60
1 2 Administrator Bob 100 100
1 2 Administrator Bob 100 100
В первой колонке — id первого пользователя, в данном случае это администратор (uid=1)
во второй колонке — id второго пользователя
в третьей колонке — имя первого пользователя
в четвёртой колонке — имя второго пользователя
в пятой колонке — голос первого пользователя
в шестой колонке — голос второго пользователя
Рассчитываем корреляцию голосов
Рассчёт конечно можно написать на PHP, но зачем тогда придумали R?
Берём табличку, сгенерированную на предыдущем этапе из записываем её в файл in.tsv. Затем:
#!/usr/bin/env Rscript
d <- read.delim("../in.tsv")
unique1 <- unique(c(d$uid1, d$uid2))
for (id1 in unique1) {
if (file.exists(as.character(id1))) {
file.remove(as.character(id1))
}
temp1 <- d[d$uid1==id1 | d$uid2==id1, ]
unique2 <- unique(c(temp1$uid1, temp1$uid2))
unique2 <- unique2[!unique2 == id1] # remove id1
for (id2 in unique2) {
if (id1 < id2) {
result <- temp1[temp1$uid1==id1 & temp1$uid2==id2, ]
name <- as.character(result$name2[1])
} else {
result <- temp1[temp1$uid1==id2 & temp1$uid2==id1, ]
name <- as.character(result$name1[1])
}
n = nrow(result)
if (n > 7) {
x <- result$value1
y <- result$value2
pvalue <- cor.test(x,y)$p.value
if (is.finite(pvalue) && pvalue < 0.05) {
correlation <- cor(x,y)
cat(id2, name, n, correlation, pvalue, "\n", sep = "\t", file = paste(id1, sep = ""), append = T)
}
}
}
}
Вся работа по расчёту корреляции делается функцией cor(x,y). Функция cor.test(x,y) рассчитывает метрики корреляции, в том числе её значимость (p-value). По умолчанию считается, что всё, что имеет p-value ≥ 0.05 недостаточно значимо, поэтому отбираем только результаты с p-value < 0.05 и записываем в файл с именем, равным uid первого пользователя.
Игра с id1, id2 и if-else нужна для того, чтобы выбрать все комбинации пар пользователей, вне зависимости от порядка.
Из таблицы сверху должен получиться файл с названием «1» и следующим содержимым:
2 Bob 15 0.6039604 0.01710946
В первой колонке id второго пользователя
во второй колонке имя второго пользователя (для того, чтобы можно было его сразу же показать на экране)
в третьей колонке количество тем и комментариев, за которые проголосовали оба пользователя
в четвёртой колонке — корреляция
в пятой колонке — p-value
С обработкой данных мы закончили.
Показываем результаты
Я решил показать результаты в профиле пользователя, вот соответствующий хук:
/**
* Hook into the user menu
*/
function mymodule_menu() {
$items['user/%user/likeminded'] = array(
'access callback' => TRUE,
'access arguments' => array(1),
'page callback' => 'mymodule_likeminded', // function defined below
'page arguments' => array(1),
'title' => 'Likeminded',
'weight' => 5,
'type' => MENU_LOCAL_TASK,
);
return $items;
}
Ну и самая длинная часть — вывод результатов.
/**
* Display likeminded users
*/
function mymodule_likeminded($arg){
if (is_object($arg) && !$arg->uid) {
return;
}
# this is my path to the results, your path may be different
$path = drupal_get_path('module', 'mymodule') . '/pearsons/' . $arg->uid;
$lines = array();
$min = 0; $max = 0;
if ($handle = @fopen($path, 'r')) {
while($line = fgets($handle)) {
$line = explode("\t", $line);
if ($line[2] >= $max) { $max = $line[2]; }
if ($line[2] < $min) { $min = $line[2]; }
$lines[] = $line;
}
}
$output = '';
// Likeminded
$output .= '<h1>' .t('Likeminded') .'</h1>' ;
$output .= '<div class="likeminded">';
foreach($lines as &$line) {
if ($line[3] > 0 ) {
$size =mymodule_font_size($min, $max, $line[2]);
$opacity = $line[3];
$output .= "<span style="\"font-size:"" .="" $size="" "pt;opacity:"="" $opacity="" "\"="">";
$output .= l($line[1], 'user/' . $line[0]);
$output .= "</span>";
}
}
$output .= '</div>';
// Adversaries
$output .= '<h1>' .t('Adversaries') .'</h1>' ;
$output .= '<div class="adversaries">';
foreach($lines as &$line) {
if ($line[3] < 0 ) {
$size =mymodule_font_size($min, $max, $line[2]);
$opacity = abs($line[3]);
$output .= "<span style="\"font-size:"" .="" $size="" "pt;opacity:"="" $opacity="" "\"="">";
$output .= l($line[1], 'user/' . $line[0]);
$output .= "</span>";
}
}
$output .= '</div>';
return $output;
}
/**
* calculate the font size in proportion to the maximum and minimum of common votes
*/
function mymodule_font_size($min_count, $max_count, $cur_count,
$min_font_size=11, $max_font_size=36) {
if ($min_count == $max_count) # avoid DivideByZero exception
{
return $min_font_size;
}
return (
($max_font_size - $min_font_size)
/
($max_count - $min_count)
*
($cur_count - $min_count) + $min_font_size);
}
Тут всё просто. Чем больше шрифт — тем больше пользователи голосовали в одних и тех же темах. Чем ярче текст — тем больше корреляция. Если корреляция позитивная — то показываем пользователя в единомышленниках, иначе — в противниках.
Не обязательно. У вас с пользователем Nevada много общих голосов, а у Nevada с пользователем LV в четыре раза больше общих голосов. Так что это нормально, что вы у него шрифтом поменьше.
В первой версии алгоритма поиска единомышленников и противников была ошибка. Пользователи, зарегистрированные раньше, не учитывались в рассчёте. Теперь всё ок.
А вообще-то хотелось попросить: уважаемый Админ, можно сделать так, чтобы непрочитанные сообщения были видны на каждой странице, где они есть, а не только на первой.
Это не так просто. К тому же, как заметил как-то Paolo_Cocoa, писать в темы больше чем на 50 комментариев становится сложнее, и это хорошо.
И еще: хотелось бы, чтобы на непрочитанное сообщение можно было попадать и из своего профиля.
Уже сейчас можно отметить птичку " Уведомлять меня о новых комментариях" внизу страницы, тогда ссылки на новые комментарии будут приходить на почту.
А профиль пользователя ждут другие изменения. Например, выборка лучших и худших комментариев пользователя ;-)
Интересно, а можно сделать такую же штуку про единомышленников, пользуясь статистикой не по всем комментам и темам, а отдельно по каждому разделу. Ведь, возможно, что по купле-продаже люди единомышленники, а по политике - совсем наоборот.
Частые посетители зачастую голосуют за или против других пользователей, а не по политике и по купле-продаже. Те, кто заходит пореже, голосуют за содержимое поста или за оформление текста.
Лучше мы сделаем автоматическую кластеризацию — украинцы, строители, родители и так далее.
Update. Более или менее верифицировано 7 голосов за Путина.
Это пишет тётка с популярного у русскоязычных лыжного курорта Val Thorens ;-)
О, уже 4 голоса за Путина. Я всех знаю либо шапочно, либо виртуально, либо через третьих лиц. Так что ошибки быть не может.
Это было почти 10 лет назад, однако. Да и то удаляли вас не за содержание, а за многочисленность призывов, т.е. за спам.
У нас конечно анонимность и всё такое, но вот действительно нашлось три живых человека за Путина. Я как мог — проверил.
За Путина был подан пока один голос сумасшедшего старпера из-под Люксембурга. Ну и боты, конечно. Сейчас опять прибегут накручивать.
Вот
Ну во-первых, регистрация новых пользователей с момента голосования запрещена. А во-вторых, я периодически вычищаю голоса дублонов и пользователей из-за VPN.
Сейчас SEO ссылку запостит и мы её удалим ;-)
Нет модераторов. См. тут.
Ок, давайте проведём эксперимент. Заберём на время модераторские права у всех и вернём elen elen, Deanna, tanechka.333, veranica.
Да вы уже 3 года как ник поменяли.
Видимо всё-таки славянка, а не Славянка. Судя по вашим комментариям, вы попали под раздачу, когда ответили ВБР, или как он там в то время назывался. Не связывайтесь с отбросами общества — и всё будет у вас хорошо. Логиньтесь как славянка, кто ж вам мешает-то.
Ну например по тому, насколько часто в тему заходят посетители с поисковых машин. Скажем, в тему Хорошо на свете жить!!! Сплагиачено у Леденцовой...))) … вообще не заходят, а в тему Получение студенческой визы в Бельгию: (из России) я поступала в художественное… вполне себе заходят.
Если даже и не придут, количество проблем, требующих ежедневного внимания, уменьшится. У нас есть пользователь, бывший ВБР, а теперь человек с тысячью ников, который пишет анонимки в полицию, постит гадости в социальных сетях, а когда вдруг прорывается на сайт — так просто всех подряд задирает.
17-20 ноября 2017.
Так можно ведь отменять свой голос. Кто-то отменил видно. А по поводу фальсификаций… ну кто будет этим заморачиваться? Только Глебов, но он уже даже не модератор.
Украина — это страна такая?
Да, виноват.
Вообще-то действительно нисколько. А от острой лучевой болезни погибло 134 человека. Детали, конечно, сложнее.
Ну хотя бы адрес и телефон можно было бы дать.
ОП пишет через прокси на LeaseWeb, шифруется. Надеюсь, читатели у нас не глупые и на разводку не попадутся.
Да, мы тут уже написали.
Ну так вы батенька нам не послали необходимые данные.
Гусаров буду удалять с особой жестокостью. Михаил — молодец.
Слушаюсь и повинуюсь, общественное мнение.
А ещё можно разрешить ссылки на картинки только через HTTPS. Заодно решится проблема со страшными сообщениями, что часть страницы не защищена от АНБ.
Так это ж стрельбы по Сирии.
Спамер. Удалили его уже.
Так он называется в Википедии.
Brat и Irina Ka. видимо.
Создали.
Вместо того, чтобы писать точки, напишите на webmaster@russian-belgium.be, чтобы вас добавили в раздел Няни. Нужно ваше фото, телефон, примерный адрес (хотя бы коммуна и почтовый иднекс) и пару слов о себе.
Поездку в Баден и Страсбург отменили.
Так вы не проголосовали.
Видно надо расширение поставить для пользовательских скриптов. Что-то вроде Tampermonkey.
Можно написать пользовательский скрипт. У вас Google Chrome? Нажмите Ctrl-Shift-J, вставьте в появившуюся консоль вот эту строчку
и все ваши комментарии исчезнут… до перезагрузки страницы.
Хорошие идеи будем копировать. Ну вот например объявления с фоновыми картинками — это свежо, берём.
Вы на РвБ с планшета хоть раз зайдите, если уж с телефона не заходили.
Было время, пользователи эту функциональность очень просили. Но сейчас наверно уже можно убрать с главной страницы и перенести в раздел правила.
Готово.
Есть такая статистика.
Гуглила-а-а? Вверху страницы огромными буквами написано Переводчики.
Да пожалуста:
Делаем выборку данных
JOIN таблицы votingapi_vote на себя саму выбирает все пермутации пар пользователей, а условие v1.uid < v2.uid превращает пермутации в комбинации.
Условие v1.entity_id=v2.entity_id AND v1.entity_type=v2.entity_type позволяет выбрать голоса, которые пользователи отдали за одну и ту же тему или комментарий. Скажем, первая строчка в нашей выборке означает, что Administrator и Bob дали 100 очков одной и той же теме или одному и тому же комментарию.
Условие v1.uid != 0 AND v2.uid != 0 исключает анонимные комментарии.
В результате получаем таблицу из шести колонок:
Рассчитываем корреляцию голосов
Рассчёт конечно можно написать на PHP, но зачем тогда придумали R?
Берём табличку, сгенерированную на предыдущем этапе из записываем её в файл in.tsv. Затем:
Вся работа по расчёту корреляции делается функцией cor(x,y). Функция cor.test(x,y) рассчитывает метрики корреляции, в том числе её значимость (p-value). По умолчанию считается, что всё, что имеет p-value ≥ 0.05 недостаточно значимо, поэтому отбираем только результаты с p-value < 0.05 и записываем в файл с именем, равным uid первого пользователя.
Игра с id1, id2 и if-else нужна для того, чтобы выбрать все комбинации пар пользователей, вне зависимости от порядка.
Из таблицы сверху должен получиться файл с названием «1» и следующим содержимым:
С обработкой данных мы закончили.
Показываем результаты
Я решил показать результаты в профиле пользователя, вот соответствующий хук:
Ну и самая длинная часть — вывод результатов.
Тут всё просто. Чем больше шрифт — тем больше пользователи голосовали в одних и тех же темах. Чем ярче текст — тем больше корреляция. Если корреляция позитивная — то показываем пользователя в единомышленниках, иначе — в противниках.
Не обязательно. У вас с пользователем Nevada много общих голосов, а у Nevada с пользователем LV в четыре раза больше общих голосов. Так что это нормально, что вы у него шрифтом поменьше.
Упс,
В первой версии алгоритма поиска единомышленников и противников была ошибка. Пользователи, зарегистрированные раньше, не учитывались в рассчёте. Теперь всё ок.
Это не так просто. К тому же, как заметил как-то Paolo_Cocoa, писать в темы больше чем на 50 комментариев становится сложнее, и это хорошо.
Уже сейчас можно отметить птичку " Уведомлять меня о новых комментариях" внизу страницы, тогда ссылки на новые комментарии будут приходить на почту.
А профиль пользователя ждут другие изменения. Например, выборка лучших и худших комментариев пользователя ;-)
Частые посетители зачастую голосуют за или против других пользователей, а не по политике и по купле-продаже. Те, кто заходит пореже, голосуют за содержимое поста или за оформление текста.
Лучше мы сделаем автоматическую кластеризацию — украинцы, строители, родители и так далее.
Всех посчитаем.
В последний раз.
Возможно, это два разных человека.
Так точно. Чем ярче цвет — тем более похожи у вас оценки. Чем больше шрифт — тем больше вы голосовали по одним и тем же темам и комментариям.