我有許多文章可以有多個標籤。我想拿一篇文章,並根據相互標籤獲取相關文章的列表。基於普通標籤對相關文章進行排序
所以,如果articla A具有共同的3個標籤與商品B,但只有2中共同的標籤條C,B就應該是更高的相關文章列表比文章C.
標識上喜歡有索姆建議on算法
我有許多文章可以有多個標籤。我想拿一篇文章,並根據相互標籤獲取相關文章的列表。基於普通標籤對相關文章進行排序
所以,如果articla A具有共同的3個標籤與商品B,但只有2中共同的標籤條C,B就應該是更高的相關文章列表比文章C.
標識上喜歡有索姆建議on算法
好吧,假設Article
是類,Tags
是List<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();
我做的這個對我公司的網站的相關內容的簡單版本,它也匹配代碼創建一個新的匿名類型,其中包含項目和匹配的標籤計數作爲其兩個屬性,然後您可以按匹配數量進行排序。
這裏是我使用的基本算法(其中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);
一種方法是使用帶有標籤和文章表的數據庫,然後使用查詢來查找匹配項。這將是最簡單的編程,但需要一個數據庫。
另一種方法是掃描每篇文章並找到最大匹配標籤的文章。如果每篇文章沒有太多標籤,這可能會足夠快。
第三種方法是索引所有標籤,並在每個葉節點中包含指向與該標籤關聯的所有文章的鏈接。這將比以前的方法更快,但需要更多的編程。
您是否在投票社區爲您編寫算法?你正在處理簡單的C#對象嗎?你使用LINQ來恢復它們嗎?你想在數據庫級別執行此操作嗎?如果是這樣,你使用什麼樣的數據庫引擎?正如你所看到的,這裏沒有足夠的信息來真正回答你,也似乎你自己並沒有真正嘗試過任何事情,對嗎? –