Соответствие предпочтений пользователя порядку атрибутов объекта по процентам соответствия - PullRequest
1 голос
/ 04 сентября 2011

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

Использование автомобилей в качестве простого примера. Мы сузим его до цвета и стиля автомобиля (автомобиль, фургон и т. Д.). <Ч /> Часть первая

Пользователь выбирает в HTML-формате следующее:

Color: ( )White, (*)Black, ( )Red
Style: ( )Car, ( )Van, (*)Suv, (*)Truck

Теперь, если я преобразую вышеприведенное в двоичное число, где первая цифра = первый атрибут (белый) и продолжается.

Код атрибута = 0100011 (черный, внедорожник, грузовик) <Ч /> Часть вторая

Теперь с MySQL

Select item_id, attribute_code FROM items

items table = [item_id][attribute_code]

Далее используйте PHP, чтобы вычислить, насколько точно каждый код атрибута элементов соответствует предпочтениям пользователя.

// Set users attribute code to var
$user_pref = $_POST['user_att_code'];

while($row=mysql_fetch_array($result))
{
    // Pull attribute_code from database and put into var
    $item_code = $row['attribute_code'];

    // Set counters
    $count_digit = 0;
    $count_match = 0;

    // Length of attribute code
    $length = 7;

    // Start calculating match
    while($count_digit <= $length)
    {
        // Does first digit of users code = 1?
        // Does first digit of items code = 1?
        if($user_pref{$count_digit} != 0 && $user_pref{$count_digit} == $item_code{$count_digit})
        {
            // Add a positive match point to counter
            $count_match++;
        }

        // Next digit in code
        $count_digit++;
    }

    if($count_match > 0)
    {
    // Make array of item_id and match amount
    $item_search [$row['item_id']] = $count_match;
    }   
}

// Sort array by most similar
arsort($item_search);

Затем для вычисления процента используется немного больше кода.

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

user: 0100011
it_1: 0100011 = 100% match
it_2: 0100100 = 50% match
it_3: 0011000 = 0% match
// If you notice the 50% does not make sense ignore it.
// I left something out for simplification.

Теперь я знаю, что это работает. Тем не менее, это не похоже на хороший способ сделать это. Производительность в основном. Предполагая более 150 000 элементов и длину кода атрибута около 200 . Это как минимум 30 000 000 вычислений для одного поиска (на основе выше).

Возможно, есть другой способ? Это большое дело?

1 Ответ

0 голосов
/ 04 сентября 2011

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

Используйте отдельные таблицы для цветов и стилей. Также таблицы для организации отношений между данными (Предметы - Цвета, Предметы - Стили).

Вы сможете выбирать из базы данных ТОЛЬКО параметры, выбранные пользователем, и не выполнять итерацию по всем элементам при каждом запросе.

...