我有很多文章可以有多个标签。我想拿一篇文章并根据相互标签获得相关文章列表。
因此,如果articla A与B条共有3个标签,但只有2个标签与C条相同,那么相关文章列表中的B应高于C条。
我想对算法提出一些建议
答案 0 :(得分:1)
我为我公司网站的相关内容做了一个简单的版本,这些内容也与标签相匹配。该代码创建一个新的匿名类型,其中包含项目和匹配标记计数作为其两个属性,然后您可以按匹配数量排序。
以下是我使用的基本算法(其中GetAllItems()
返回Tags
属性类型为string[]
的项目列表,而tagsToMatch
是另一个的可枚举item的标签):
return GetAllItems()
.Select(item => new { Item = item, MatchedTagCount = item.Tags.Intersect(tagsToMatch).Count() })
.OrderByDescending(a => a.MatchedTagCount)
.Select(a => a.Item);
答案 1 :(得分:0)
好吧,我们假设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();
答案 2 :(得分:0)
一种方法是使用带有标签和文章表的数据库,然后使用查询来查找匹配项。这将是最简单的编程,但需要一个数据库。
另一种方法是扫描每篇文章并找到具有最大匹配标签的文章。如果每篇文章没有太多标签,这可能足够快。
第三种方法是索引所有标记,并在每个叶节点中包含指向与该标记关联的所有文章的链接。这将比以前的方法更快,但需要更多的编程。