С кем и против кого вы заодно

Главные вкладки

Во все профили пользователей добавилась статистика по единомышленникам и противникам, собранная по результатам голосования за темы и комментарии (да-да, те самые звёздочки). Чем ярче имя пользователя на странице, тем больше сходятся у него оценки с вашими. Ну или с оценками пользователя, профиль которого вы просматриваете.

Вот скажем в профиле Administrator'а видно, что с Василиса мы соглашались нечасто, а с Nikolay_ — почти всегда.

Чем больше шрифт у имени пользователя — тем чаще он голосовал за те же темы и комментарии. Например, Ytreza голосовала в тех же постах, что и Administrator и скорее соглашалась с ним, чем не соглашалась.

Посмотреть на своих собственных единомышленников и противников вы сможете, если залогинитесь. Если там пусто, то не расстраивайтесь — голосуйте за темы и комментарии, и единомышленники у вас обязательно появятся.

Для любопытствующих, в двух словах алгоритм такой:

  • выбираем для каждой пары пользователей темы, в которых проголосовали оба
  • создаём два вектора с голосами
  • вычисляем линейный коэффициэнт корреляции для обоих векторов
  • отбираем те результаты, где вероятность ошибки при отклонении нулевой гипотезы меньше 0,05
  • красиво показываем
  • ???

P.S. А представьте, сколько всего интересного знают о вас Facebook, ВКонтакте и иже с ними.

Комментарии

Аватар пользователя Демидова

Ло́гика (др.-греч. λογική — «наука о правильном мышлении», «искусство рассуждения» от λόγος — «речь», «рассуждение», «мысль») — раздел философии, нормативная[неизвестный термин][1] наука о формах, методах и законах интеллектуальной познавательной деятельности, формализуемых с помощью логического языка. Поскольку это знание получено разумом, логика также определяется как наука о формах и законах правильного мышления.

Гугл - спасёт мир!

Упс,

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

А можно всех уже несуществующих пользователей тоже убрать, а то заходишь в "собутыльники" "единомышленники" , а там кладбище...

Аватар пользователя Фати Шах

они погибли за идею-это лучше, чем быть никем непонятой-адын, совсем адын.

Аватар пользователя Наблюдатель

Теперь всё ок.

Чёт всё равно какой-то косячок имеет место быть в алгоритме: если к примеру у меня есть единомышленник, который отображается в моем списке единомышленников самыми большими буквами, то по логике и я я его списке единомышленников должен отображаться такими же буквами, а такого не происходит.

Не обязательно. У вас с пользователем Nevada много общих голосов, а у Nevada с пользователем LV в четыре раза больше общих голосов. Так что это нормально, что вы у него шрифтом поменьше.

Почти как в анекдоте: "Понимаете, - ответил Изя, - это в Вашингтоне и Париже Вы – крупная фигура, и там невозможно. А для нас в Житомире, Вы – ноль без палочки."

Аватар пользователя Демидова

После того, как стало невозможным ставить оценки самому себе, их вообще стали ставить гораздо меньше.

Аватар пользователя Сибби

Ну, для клономаток это не проблема: знай себе, логинься под каждым ником и озвездюливай сама себя. :)

Аватар пользователя Лия

После того, как стало невозможным ставить оценки самому себе, их вообще стали ставить гораздо меньше.

Оценок стало меньше после того, как народу реально показали, что их, казалось бы, безобидные клики кто-то и зачем-то "подсчитывает".

Ооо, у меня есть просто супер-единомышленники :) И совсем мало противников, по-моему, сплошные клоны. Это означает, что я мало единиц ставлю?

Аватар пользователя Наблюдатель

А у меня есть предложение к Администратору: опубликуйте алгоритм, а мы тут сообща попробуем довести его до кондиции.

А заглавное сообщение прочитать? Все лучше, чем фрицморгановское и ему подобное говно на форум тащить

Аватар пользователя Наблюдатель

Паоло, Вы не поверите, но всяческие Идеюшки с Маринелями намного больше говнища на форум тащат и Вас это как-то совсем не возмущает.
Либо тогда уж слагайте с себя модераторские полномочия, если не в состоянии быть объективным.
ЗЫ: Кстати, я не въехал, какое отношение имеет разбор полетов по "Левиафану" к алгоритму Администратора?

Но они не заявляют о себе, как о персонах, критически оценивающих читаемые тексты, поэтому к ним и отношение иное.

PS. Значит, в отношении оценки фрицморгановских текстов возражений нет ;-)

Аватар пользователя Наблюдатель

Но они не заявляют о себе, как о персонах, критически оценивающих читаемые тексты

То есть включение дурочек априори освобождает от всякой ответственности?

фрицморгановских текстов

Отчего же? Есть. Что Вам не понравилось в оценках Фрица Моргена, вы обосновать не посчитали нужным, заведомо назвав их говном.
Вы фильм смотрели?

О какой ответственности речь? За ссылки кого то банили?

Аватар пользователя Наблюдатель

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

Замечательно! Самому придумать тезис, самому его опровергнуть!

А у меня есть предложение к Администратору: опубликуйте алгоритм, а мы тут сообща попробуем довести его до кондиции.

Да пожалуста:

Делаем выборку данных


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 очков одной и той же теме или одному и тому же комментарию.

Условие v1.uid != 0 AND v2.uid != 0 исключает анонимные комментарии.

В результате получаем таблицу из шести колонок:

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


  1. В первой колонке — id первого пользователя, в данном случае это администратор (uid=1)
  2. во второй колонке — id второго пользователя
  3. в третьей колонке — имя первого пользователя
  4. в четвёртой колонке — имя второго пользователя
  5. в пятой колонке — голос первого пользователя
  6. в шестой колонке — голос второго пользователя


Рассчитываем корреляцию голосов


Рассчёт конечно можно написать на 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

  1. В первой колонке id второго пользователя
  2. во второй колонке имя второго пользователя (для того, чтобы можно было его сразу же показать на экране)
  3. в третьей колонке количество тем и комментариев, за которые проголосовали оба пользователя
  4. в четвёртой колонке — корреляция
  5. в пятой колонке — 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);
}

Тут всё просто. Чем больше шрифт — тем больше пользователи голосовали в одних и тех же темах. Чем ярче текст — тем больше корреляция. Если корреляция позитивная — то показываем пользователя в единомышленниках, иначе — в противниках.

Аватар пользователя Наблюдатель

Погорячился, был не прав... )))
В Delphi я не силен. Когда-то неплохо программировал на SIMATIC, но уже лет 6, как "не брал в руки шашек"...

Аватар пользователя hele_kamo

# Administrator

Да пожалуста:

гад-гад-гад.
читаю , и понимаю -что нихрена не понимаю :
а можна в картинках ?

Аватар пользователя Alekca

От спасибочки админу, кЮшать не буду, а коэф. корреляции посчитаю!:))
Эх,лучше бы качество модерации повысили, что ли.
Кста, присоединяюсь к просьбе
А можно всех уже несуществующих пользователей тоже убрать
Как и у всех-штабеля "мертвецов" по обе стороны.

Аватар пользователя hele_kamo

# Paolo_Cocoa
О какой ответственности речь? За ссылки кого то банили?

оооо, по случаю : меня в российско-украинской теме забанил за что ?
дал ссылочку на самоидентификацию от президента украины ,что -то не устраивает - претензии к нему .
если у тебя комплексы или пмс - то это к врачу , я тут не помощник .

я тут не помощник .

Тоже мне бином Ньютона

Аватар пользователя hele_kamo

повторю : фееричный модератор , даже нет : феерический

Alekca в ср, 21/01/2015 - 20:52

Вот сижу я в Пусто де Сантьяго любуюсь видом на океан' солнышко заходит'тепло,cангрию потягиваю- ляпотаа:-) И черт меня дернул в инет зайти!

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

Аватар пользователя Alekca

Млиииин, тебе к психиатру.Ты меня в покое оставишь? Что ни коммент,то на мой пост.Славатегоспидя, что ты далеко живёшь, а то б и не скрылась бы от преследований:((
Вот уж прям похвастаться нельзя,когда хорошо, так, что ля? А ты не завидуй.И пиши по существу, а не когда встаёт на Алексу:)

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

Аватар пользователя Alekca

привет Вике.А кто это, дружок? Ты меня ни с кем не спутал?Лены есть, Наташи-есть.Вик- тут нет в подружайках.

# Alekca в чт, 29/01/2015 - 12:40

Млиииин, тебе к психиатру.Ты меня в покое оставишь? Что ни коммент,то на мой пост.Славатегоспидя, что ты далеко живёшь, а то б и не скрылась бы от преследований:((

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

Фуу ,(порутчик)Алекса,где вы там и пошлость.
Зря модерировала свой пост.Без последнего добавления было лучше.

Аватар пользователя Alekca

Уфф, сябра Vivaldя, какой же ты банный лист и ханжа!Если по-нормальному не понимаешь, как на тебя ещё воздействовать? 100 раз просила-отстань,отвянь проходи мимо,не реагируй-не дошло по-хорошему.Послушай лучше замечательне стихи. http://fit4brain.com/7690
Уважаемы модераторы и администратор, прошу почистить тему от от нашего с Вавальди флуда ни о чём

Страницы