Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Типизация (определение свойств) объекта руками пользователей сайта

Anna | 29.05.2014 | нет комментариев

Нередки случаи, когда требуется определить комплект свойств опять сделанного объекта. Скажем, это может касаться сайта с изложениями товаров, фильмов (и, соответственно, для всякого объекта нужен комплект тегов либо свойств). Вообще, это касается всякого хранилища изложений всяких объектов, которые полагают присутствие свойств и вероятности сопоставлять объекты между собой по тезису «схож либо непохож».

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

Для наглядности, будем считать, что у нас – сайт, посвященный сотовым телефонам. На сайте (для простоты) – 5 телефонов, владеющих следующими условными свойствами (свойства пронумерованы для комфорта):
A> Виброзвонок (1), Радио (2), Громкая связь (3), Фонарь (4)
B> Виброзвонок (1), Громкая связь (3), MP3- плеер (5)
C> Фонарь (4), Неразборный корпус (6), MP3- плеер (5)
D> Неразборный корпус (6), TV (7)
E> MP3- плеер (5), TV (7), Радио (2)

И добавляется шестой агрегат, про тот, что менеджер сайта ничего не знает, в различие от посетителей. Пускай это будет агрегат с Радио (2) и TV (7).

В нашем примере существует каждого 7 допустимых признаков у объекта. Новому объекту мы присваиваем все допустимые свойства.

Дальнейшим этапом мы обязаны определить только те свойства, которыми объект подлинно владеет, для этого мы предлагаем посетителям сайта предпочесть степень сходства между знаменитым нам объектом и новым (предлагаем нечаянно выбранный объект). Сходство оценивается по шкале от 0 до 2х, где 0 – «не схоже», 1- «есть что-то всеобщее» и 2- «дюже схоже». Дозволено сделать больше растянутую шкалу, но для простоты, тут используется именно эта.

При сопоставлении мы рассматриваем только те свойства, которые есть и у нового, и у знаменитого нам объекта. Если пользователь предпочел степень схожести «дюже схоже», то мы прибавляем 1 к «весу» пересекающихся свойств у неведомого объекта. При «есть что-то всеобщее» прибавляем 0.5, а если «не схожи», то вычитаем 1.

Я набросал маленький пример на PHP, иллюстрирующий работу алгорифма.

// насколько объекты схожи на новейший
$known_objects = array ('a'=>1, 'b'=>0, 'c'=>0, 'd'=>1, 'e'=>2);
//объекты и их свойства
$a = array (1,2,3,4);
$b = array (1,3,5);
$c = array (4,6,5);
$d = array (6,7);
$e = array (5,7,2);
//для всякого свойства нового объекта мы определяем вес, для начала он = 1
$new_object = array (1=>1, 2=>1, 3=>1, 4=>1, 5=>1, 6=>1, 7=>1);
//множитель, чем поменьше значение, тем больше плавно изменяются веса
const K_MUL = 0.1;
$s = array_keys($known_objects);

//100 итераций, сопоставляем со нечаянно выбранным объектом
for ($i=0; $i<100; $i  ) {
    shuffle($s);
    $new_object = cmp($new_object, $$s[0], $known_objects[$s[0]]);
}
//нормализуем веса 
process($new_object);
//выводим итог
print_r($new_object);

//нормализуем веса и удаляем свойства с весом поменьше 0.5
function process(&$new_object) {
    $max = 0;
    foreach ($new_object as $k=>$v) {
        if ($v > $max) {
            $max = $v;
        }
    }
    $mv = 1.1;
    if ($max > $mv) {
        $div = (1 / $max);
        foreach ($new_object as $k=>$v) {
            $new_object[$k] *= $div;
        }
    }
    foreach ($new_object as $k=>$v) {
        if ($new_object[$k] <0.5) {
            unset($new_object[$k]);
        }
    }
}
//сравниваем неведомый ($a) и знаменитый ($b) объект
function cmp($a,$b,$val) {
    switch ($val) {
        case 0: {
            $add = -0.5;
            break;
        }
        case 1: {
            $add = 0.5;
            break;
        }
        case 2: {
            $add = 1;
            break;
        }
    }
    foreach ($a as $k=>$v) {
        if (in_array($k, $b)) {
            $a[$k]  = $add * K_MUL;
        }
    }
    return $a;
}

Код дюже простейший, но дает осознавание работы.
На выходе мы получаем что-то как бы такого массива, где ключ- номер свойства, а значение = вычисленный вес

Array
(
[2] => 1,
[7] => 0.944444
)

Как показывают тесты, точность зависит от числа итераций, при этом, минимальное кол-во итераций = 50 (соотносится с K_MUL * 0.5, где 0.5– наименьший шаг метаморфозы веса).

Добавление знаменитых объектов с различной степенью похожести улучшает определение свойств незнакомого объекта.

Человеческий фактор

Рассмотренный нами случай является совершенным. Но что делать, если, возможен, определенный процент пользователей отвечает неточно? Для моделирования сходственной обстановки дозволено добавить рандомизацию результатов, добавив в функцию cmp следующую строку:
If (rand(0,100) > 70) {
$val = rand(0,2);
}

Мы моделируем обстановку, в которой всякий 3-й результат является случайным (может соответствовать истине, а может, и нет).

Как показали тесты, при увеличении числа итераций в 3 раза (те самые 1/3 допустимо неправильных результатов), мы получаем все тот же массив 2 и 7, и лишь иногда возникают флуктуации, которые дозволено отсеять, изменив порог в функции «process»
Array (
[2] => 0.98648648648649 – правильное качество
[6] => 0.50675675675676 — флуктуация
[7] => 1 – правильное качество
)

Допустимые совершенствования

Первое совершенствование – это устранение погрешностей. Имея довольное число сопоставлений, мы можем исключить итоги, которые не вписываются в всеобщую массу, и тем самым можем повысить точность.

Второе совершенствование: метаморфоза веса голоса у пользователей.
Пользователи, чьи результаты совпадают с результатом большинства, получают больший вес собственного голоса. Соответственно, при последующих голосованиях за «похожесть», голос такого пользователя будет иметь больший вес, что тоже должно уменьшить разброс.

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

Буду рад вопросам, предложениям и легко комментариям.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB