在PHP / MySQL数据库中查找类似的描述

时间:2010-11-29 08:28:18

标签: php mysql

我们正在构建一个服务台应用程序来运行我们的服务公司,我正在努力帮助呼叫中心人员根据客户的问题描述分配类别。

我的主要想法是将客户提供的描述与之前的描述进行比较,并根据分配的最常见类别使用先前服务调用中使用的类别。

任何想法怎么做?

我的描述字段是一个blob字段,因为一些描述很长。我宁愿找到一种方法来做到这一点,需要最少的系统资源。

感谢您的任何意见:)

麦克

1 个答案:

答案 0 :(得分:0)

我是自定义代码的人;如果你使用大而膨胀的系统,我觉得这项工作没有做好,所以如果你不想自己编写代码,那么就把它拿出来。但是,这可能不像你做的那么难;是的,我肯定会使用标记系统。但是,它不一定非常复杂。

以下是我将如何处理它:

首先,创建一个包含3个表的数据库;一个用于类别,标签和“链接”(类别和标签之间的链接)。

然后,创建一个初始化数组的PHP函数(空工作正常)并推送新的(小写的)单词(如果它们不存在)。这方面的一个例子可能是:

<?php

// Pass the new description to this 
// function.
function getCategory($description)
{
    // Lowercase it all
    $description = strtolower($description);

    // Kill extra whitespace
    $description = trim($description);
    $description = preg_replace('~\s\s+~', ' ', $description);

    // Kill anything that isn't a number or a letter
    // NOTE: This is untested, so just edit this however you'd like to make it work. The
    // idea is to just eliminate everything that isn't a letter or number. Just don't take out
    // spaces; we need them!
    $descripton = trim($description, "!@#$%^&*()_+-=[]{};:'\"\\\n\r|<>?,./");

    // Now the description should just contain words with a single space in between them.
    // Let's break them up.
    $dict = explode(" ", $description);

    // And find the unique ones...
    $dict = array_unique($dict, SORT_STRING);

    // If you wanted to, you could trim either common words you specify,
    // or any words under, say, 4 characters. Up to you!

    return $dict;
}

?>

接下来,按您的需要填充数据库;制作一些类别和一些标签,然后将它们链接在一起(如果你想获得想象力,将MySQL引擎切换到InnoDB并建立关系。让事情变得更快!)

Table `Categories`
|-------------------------|
| Column: Category        |
| Rows:                   |
|   Food                  |
|   Animals               |
|   Plants                |
|                         |
|-------------------------|


Table `Tags`
|-------------------------|
|  Column: Tag            |
|  Rows:                  |
|    eat                  |
|    hamburger            |
|    meat                 |
|    leaf                 |
|    stem                 |
|    seed                 |
|    fur                  |
|    hair                 |
|    claws                |
|                         |
|-------------------------|

Table `Links`
|-------------------------|
| Columns: tag, category  |
| Rows:                   |
|  eat, Food              |
|  hamburger, Food        |
|  meat, Food             |
|  leaf, Food             |
|  leaf, Plant            |
|  stem, Plant            |
|  fur, Animals           |
|  ...                    |
|-------------------------|

通过使用MySQL InnoDB关系,链接表不会通过创建行占用更多空间;这是因为它们在某种程度上是链接的,并且都是通过引用存储的。这将非常减少数据库大小。

现在,对于踢球者来说,这是对数据库的一个聪明的mysql查询,它遵循以下步骤:

  1. 对于每个类别,总结属于类别描述词典(我们在早期PHP函数中创建)的标签。
  2. 将它们从最大到最小排序
  3. 拉出您想要的前1或3或许多建议类别!
  4. 这将为您提供一个包含最多匹配标记数的类别列表。您希望如何制作MySQL查询取决于您。

    虽然这似乎很多设置,但实际上并非如此。您最多有3个表,一个或两个PHP函数和一些MySQL查询。数据库只会与类别,标签和对两者的引用一样大(在链接表中;引用不占用太多空间!)

    要更新数据库,只需将不存在的标记放入标记数据库,并将它们链接到您决定分配给描述的类别。这将扩大数据库的标签范围,并随着时间的推移,使您的数据库更加符合您的描述(即更准确)。

    如果您想要非常详细,请在类别和标签之间插入重复的链接,以创建一种加权标记系统,这将使您的系统<强大>更加准确。