2010-11-29 105 views
2

我們正在建立一個幫助臺應用程序來運行我們的服務公司,我試圖找出協助呼叫中心人員根據客戶的問題描述分配一個類別。在數據庫中查找類似的說明PHP/MySQL

我的主要想法是將客戶給出的描述與之前的描述進行比較,並根據最常用的類別使用先前服務調用中使用的類別。

任何想法如何做到這一點?

我的描述字段是一個blob字段,因爲一些描述很長。我寧願找到一種方法來做到這一點,這需要最少的系統資源。

感謝任何輸入:)

邁克

回答

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, "[email protected]#$%^&*()_+-=[]{};:'\"\\\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或您希望的多個建議類別拔出!

這會給你一個很好的匹配計數最高的類別列表。您想如何製作MySQL查詢取決於您。

雖然這看起來像很多設置,但它確實不是。您最多有3個表格,一個或兩個PHP函數和一些MySQL查詢。數據庫將只有類別,標籤和對兩者的引用(在鏈接表中;引用不佔用太多空間!)

要更新數據庫, t存在於標籤數據庫中,並將它們鏈接到您決定分配給描述的類別。這將擴大數據庫的標籤範圍,隨着時間的推移,您的數據庫將更加適合您的描述(即更準確)。

如果你想獲得真正詳細,你會插入複製類別和標籤之間鏈接創建排序加權標籤系統的,這將讓你的系統準確。

+0

好的,所以基本上只需將標籤分配給類別,然後將描述中的標籤計數與標籤的類別計數進行比較。也就是說,如果描述包含標籤(吃,肉,毛),那麼最高可能性就是(食物),因爲它與這兩個詞「連接」,但可能與動物有第二次匹配。 – 2010-12-01 06:04:21