2013-11-02 67 views
3

我有一個項目,其中有一個項目目錄,每個項目都有一個標籤數組。我想根據這些標籤提供相似的項目。根據一系列標籤創建有意義的建議

像這樣的東西(但具有更大的數據集):

{ 
    "item": { 
     "description":"thing", 
     "tags": ["a","b","c","e","f"] 
    }, 
    "item": { 
     "description":"thing", 
     "tags": ["a","b"] 
    }, 
    "item": { 
     "description":"thing", 
     "tags": ["a","c"] 
    }, 
    "item": { 
     "description":"thing", 
     "tags": ["b","c"] 
    } 
} 

兩兩件事至今我曾嘗試:

首先是對單個項目的標籤之間的直線相交,並其他具有一個或多個相同標籤的項目。這很有效,但是在標籤有點泛化的情況下(想象一下,標籤上有諸如「音樂」之類的東西都是音樂項目),返回的項目數量非常巨大。

第二個是一個有點瘋狂的想法,我把標籤數組轉換成一個字符串,並計算levenshtein差異。這適用於長度大致相同或更大但物品笨重的物品。不過,它確實減少了第一次返回的脂肪。這不是正確的方式,但想要展現我的目標。這樣實現它:

// snip: this is inside a BB collection 

    getSimilarByTag: function(tags, ignore){ 
      var hits = []; 

      if (tags) { 

       this.filter(function(item){ 

        if (item.get('cat') === ignore){ 
         return; // no need to include 
        }; 

        var itemTags = item.get('tags'); 
        var result = _.intersection(tags, itemTags); 

        if (result.length) { 
         // calc levenshtein distance between the intersection and the search array 
         var dist = _.str.levenshtein(result.join(' '), tags.join(' ')); 
         if (Math.log(dist) < 1.5) { // this value needs tuning? 
          hits.push(item.toJSON()); 
         } else { 
          // based on our magic number above, ignore this 
         } 
        }; 
       }); 
      } 

      return hits; 
     } 

我正在做我所有的代碼在JavaScript中,使用骨幹和下劃線。然而,語言並不那麼重要 - 只是想知道什麼樣的技術或算法可以提供更好的結果。

+0

有沒有使用類別以及標籤的可能性?所以'音樂'將是一個類別,標籤可以是'古典','朋克'......這樣你可以簡單地解散任何不屬於同一類別的東西,然後根據(最小變量數量)標籤。 –

+0

不幸的是 - 實際上,類別可能只是被看作是某種「主標籤」,這並不能讓我更進一步。感謝您的輸入! – dmp

+0

如果返回的數據集可能會很大,我們通常會(正如您必須清楚的那樣)以塊的形式返回集合,即sql限制。爲什麼不考慮實施這樣的技術?看起來好像你在問不可能的事情,不管數據是什麼語言,數據的負載都是大量的數據。 –

回答

1

大多數適用數據的一個簡單例程可能是,按照標記交集的大小順序返回匹配,並返回有限的計數。如果您可以將某些標籤加重爲更重要,那麼您可以使用它來調整退貨訂單。例如,如果用戶先前從目錄中購買了物品,則與其購買相關聯的標籤在訂單算法中可能具有增加的分數。