2013-01-24 68 views
-2

我有許多文章可以有多個標籤。我想拿一篇文章,並根據相互標籤獲取相關文章的列表。基於普通標籤對相關文章進行排序

所以,如果articla A具有共同的3個標籤與商品B,但只有2中共同的標籤條C,B就應該是更高的相關文章列表比文章C.

標識上喜歡有索姆建議on算法

+0

您是否在投票社區爲您編寫算法?你正在處理簡單的C#對象嗎?你使用LINQ來恢復它們嗎?你想在數據庫級別執行此操作嗎?如果是這樣,你使用什麼樣的數據庫引擎?正如你所看到的,這裏沒有足夠的信息來真正回答你,也似乎你自己並沒有真正嘗試過任何事情,對嗎? –

回答

0

好吧,假設Article是類,TagsList<Tag>,它是Article的成員。然後,敏捷的思維,你可以做這樣的事情(記住,你可能需要適應的代碼一點,但這個想法表示:

class Article 
{ 
    public List<Tag> Tags { get; set; } 
} 

//get related to a 
Article a; 
List<Article> allArticles; 

//So, first filter to get all articles that have at least one tag in common then sort by the count of tags in common 
List<Article> related = allArticles.Where(x=> x.Tags.Any(t=> a.Tags.Contains(t)) 
         .OrderByDescending(x => x.Tags.Intersect(a.Tags).Count()) 
         .ToList(); 
+0

這不能很好地擴展,每篇文章的文章數量和標籤數量都很大。這基本上是「蠻力」選項。 – Servy

+0

@Servy的確如此,但考慮到這種情況...... – dutzu

1

我做的這個對我公司的網站的相關內容的簡單版本,它也匹配代碼創建一個新的匿名類型,其中包含項目和匹配的標籤計數作爲其兩個屬性,然後您可以按匹配數量進行排序。

這裏是我使用的基本算法(其中GetAllItems()返回列表string[]類型的Tags屬性的項目和tagsToMatch是其他項目的標記的枚舉項):

return GetAllItems() 
     .Select(item => new { Item = item, MatchedTagCount = item.Tags.Intersect(tagsToMatch).Count() }) 
     .OrderByDescending(a => a.MatchedTagCount) 
     .Select(a => a.Item); 
+0

這不會很好地擴展,每篇文章的文章數量和標籤數量都很大。這基本上是「蠻力」選項。 – Servy

+0

您可以通過過濾掉沒有共同標籤的文章來進一步優化此功能。您的查詢也將返回這些。儘管如此,它們根本不相關。 – dutzu

+0

@dutzu - 真的,在實際的版本中,我在處理該命令之前有額外的謂詞,因爲我們有其他規則,比如「產品標籤必須匹配」,否則就會得到無關的廢話。對於基本匹配,這將是高性能的。我們有數百個標籤文章,論壇帖子等,並沒有明顯的性能影響。 –

0

一種方法是使用帶有標籤和文章表的數據庫,然後使用查詢來查找匹配項。這將是最簡單的編程,但需要一個數據庫。

另一種方法是掃描每篇文章並找到最大匹配標籤的文章。如果每篇文章沒有太多標籤,這可能會足夠快。

第三種方法是索引所有標籤,並在每個葉節點中包含指向與該標籤關聯的所有文章的鏈接。這將比以前的方法更快,但需要更多的編程。

相關問題