2010-11-29 23 views
2

私たちはサービス会社を運営するためのヘルプデスクアプリケーションを構築しており、コールセンターの人々が顧客からの問題記述に基づいてカテゴリを割り当てるのを支援しようとしています。データベースPHP/MySQLの類似検索文字列

私の主な考えは、顧客の説明を以前の説明と比較し、割り当てられた最も一般的なカテゴリに基づいて以前のサービスコールで使用されたカテゴリを使用することです。

どのようにすればいいですか?

私の説明フィールドは、説明がかなり長いため、ブロブフィールドです。私は、最小限のシステムリソースを必要とするこれを行う方法を見つけることを好むでしょう。任意の入力のための

感謝:)

マイク

答えて

0

私は、カスタムコードの人間です。私は大規模で肥大化したシステムを使用するなら、仕事が正しく行われたとは思わないので、これをコードしたくない場合は塩の塊でこれを取ってください。しかし、これはあなたが作っているほど難しくないかもしれません。はい、私は間違いなくタグ付けシステムに行くでしょう。しかし、それほど複雑である必要はありません。ここで

は、私はそれを処理する方法をです:

まず、3つのテーブルでデータベースを作ります。 1つはカテゴリ、タグ、「リンク」(カテゴリとタグ間のリンク)です。

次に、配列を初期化する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; 
} 

?> 

次に、データベースをどのように設定するかを指定します。 (あなたは空想を取得したい場合は、InnoDBのにMySQLのエンジンを切り替えると関係を作る。少し速く、物事を作ります!)、いくつかのカテゴリと、いくつかのタグを作成して、それらを一緒にリンクする

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つのテーブル、1つまたは2つのPHP関数、および少数のMySQLクエリがあります。データベースはカテゴリ、タグ、両方の参照と同じくらい大きいだけです(リンクテーブルで参照は多くのスペースを占有しません)

データベースを更新するには、タグデータベースに存在し、それらを説明に割り当てることを決めたカテゴリにリンクします。これにより、データベースのタグ範囲が広がり、時間の経過とともにデータベースが説明に合わせて調整されます(つまり、より正確になります)。

あなたが本当に詳細な取得したい場合は、が正確なシステムをより一層なるだろう加重タグシステム、のようなものを作成するために、カテゴリとタグの間ののリンクを複製挿入したいです。

+0

基本的にタグをカテゴリに割り当ててから、説明のタグ数をタグのカテゴリ数と比較します。私は...記述にタグ(食べ物、肉、毛皮)がある場合、それらの2つの単語に "リンク"しているので最も高い確率は(食べ物)ですが、動物に2回目の試合が起こる可能性があります。 –

+0

かなり。それは私がそれについて行く方法です! – Qix