将用户首选项与对象属性匹配按匹配百分比排序

时间:2011-09-04 16:37:22

标签: php mysql algorithm matching

我正在尝试计算项目与用户定义的偏好的匹配程度。以下是我想到的方法。但我并没有过多的经验,想知道是否有更好的方法可以解决这个问题。

使用汽车作为一个简单的例子。我们将其缩小到汽车的颜色和风格(汽车,面包车等)。

<小时/> 第一部分

用户在HTML表单中选择以下内容:

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

现在,如果我将上述内容转换为第一个数字=第一个属性(白色)的二进制数字,并继续。

属性代码 = 0100011(黑色,suv,卡车)

<小时/> 第二部分

现在使用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 :(得分:0)

为了获得更好的性能,您应该重新组织系统。

使用颜色和样式的分隔表。还有用于组织数据之间关系的表(项目 - 颜色,项目 - 样式)。

您将能够从用户选择的数据库ONLY参数中进行选择,而不是在每个请求中迭代所有项目。