我有一個項目,其中有一個項目目錄,每個項目都有一個標籤數組。我想根據這些標籤提供相似的項目。根據一系列標籤創建有意義的建議
像這樣的東西(但具有更大的數據集):
{
"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中,使用骨幹和下劃線。然而,語言並不那麼重要 - 只是想知道什麼樣的技術或算法可以提供更好的結果。
有沒有使用類別以及標籤的可能性?所以'音樂'將是一個類別,標籤可以是'古典','朋克'......這樣你可以簡單地解散任何不屬於同一類別的東西,然後根據(最小變量數量)標籤。 –
不幸的是 - 實際上,類別可能只是被看作是某種「主標籤」,這並不能讓我更進一步。感謝您的輸入! – dmp
如果返回的數據集可能會很大,我們通常會(正如您必須清楚的那樣)以塊的形式返回集合,即sql限制。爲什麼不考慮實施這樣的技術?看起來好像你在問不可能的事情,不管數據是什麼語言,數據的負載都是大量的數據。 –