使用 tf-idf 算法在 C# 中构建基于内容的推荐系统






4.24/5 (5投票s)
如何在 C# 中实现基于内容的推荐系统?
引言
大家都习惯于在电子商务平台或在线新闻网站上看到推荐的产品。亚马逊可能是第一个有效利用推荐带来的激增的零售商,在本系列文章中,我们的目标是深入探讨此类系统是如何实际构建的。我们将发现实际上有多种方法,并特别关注基于内容的推荐。即使在这个受限的场景中,我们也会找到许多定制的可能性,并利用广泛采用的 tf-idf 算法。最后,我们将把这些概念应用于一个开放数据集,为赫芬顿邮报推荐文章。
以下关于此主题的权威教科书值得参考。本书的内容超出了推荐系统,涵盖了众多广泛而普遍的数据挖掘主题。它特别强调了管理海量数据的实现。
海量数据集挖掘 (Leskovec, Rajaraman, Ullman)
本文的灵感来源于一篇最初发布的文章,可在这里找到。请参考它以获得全面的回顾。
赶时间的人可以立即下载源代码并根据自己的需求进行定制。或者,如果您不怕理论,或者只是好奇在线电子商务的某些方面是如何运作的,请继续阅读。
我们所说的推荐系统是什么意思?
推荐系统是一种软件应用程序或算法,旨在为用户提供个性化的建议或推荐。这些建议可以包括产品、服务或内容,例如电影、音乐、书籍或文章,基于用户的偏好、行为或与系统的历史互动。推荐系统通常用于各种在线平台,通过提供符合个人偏好的定制建议来增强用户体验。
这个全面的定义适用于各种场景,包括在线平台和传统的实体店。这个概念并非随着互联网的出现才出现的新事物。在实体零售店中,大型商店传统上通过陈列来突出产品,但**通常会普遍推广相同的产品**。在线平台能够向不同用户呈现不同产品,每次互动都不同,这推动了该领域专业公司的发展。
在传统的零售店里,无论戴夫的偏好或需求如何,约翰和戴夫都会看到相同的产品。实体店的正面展示的静态性质阻碍了对每个用户的适应。相比之下,在线平台具有灵活性,可以根据用户偏好为每个用户量身定制个性化推荐,并在每次请求时动态重新排列产品。
我们的目标是揭示所使用的方法,探讨正在使用的算法,并通过一个具体的例子来实现它们。
我需要实现一个推荐系统!从哪里开始?
实现推荐主要有两种不同的方法:基于内容的过滤和协同过滤。我们将对每种方法进行简要描述。
基于内容的过滤推荐
基于内容的过滤是一种推荐系统技术,它根据物品本身的特征或属性以及用户的偏好来推荐物品。**它不依赖于其他用户的偏好**,而是分析用户过去与之互动或喜欢的物品的内容。系统会推荐与用户过去感兴趣的物品具有相似特征的物品。当有足够的关于物品及其属性的信息时,这种方法特别有用。
在在线报纸的背景下,基于内容的过滤被证明是非常有效的,因为可以从文章的内容和属性中推断出用户的偏好和兴趣。
协同过滤推荐
协同过滤是一种推荐系统方法,它依赖于一群用户的偏好和行为来做出个性化建议。它涉及分析用户互动和偏好,以识别模式并推荐相似用户喜欢或互动过的物品。
我们根据其他用户的客户旅程来推荐物品。从这个插图中,“协同”这个词应该很明显。
我们根据其他用户的购买历史来推荐物品。
重要提示 1
这两种方法并非相互排斥,并且经常结合使用以创建混合推荐系统。
重要提示 2
协同过滤需要一些历史数据才能应用,而基于内容的过滤可以在早期阶段使用。这种现象被称为冷启动问题。
在本系列中,我们将只探讨基于内容的过滤,但那些渴望深入了解协同过滤的人可以参考这本书。
聚焦我们的路线图
现在已经确定并解释了基本概念,是时候深入探讨这个主题了。如前所述,我们将实现基于内容的过滤,并将其应用于一系列新闻文章,这些文章可在此处找到。这是一个关于赫芬顿邮报上的一些文章的数据集,我们的目标将是为每一篇文章推荐 5 篇相关文章。
我们的数据集包含 5000 多篇文章,格式如下。请注意,有些文章是西班牙语,我们需要考虑到这一点。
每篇文章都有各种属性,例如标题、URL、简短描述等。乍一看,仅从这份文件中手动猜测要推荐什么内容是完全不明显的。
第一种方法
在我们的数据集中,每篇文章都具有各种重要的属性,包括表示物品一般主题的标签。虽然一种方法可能涉及根据这些标签对文章进行分组,并为给定文章推荐同一组中的物品,但这种方法有其局限性。它的实现相对简单,但由于几个原因,可能有些过于简单化。首先,标签可能为空或不准确。其次,它没有考虑文章的实际内容。最后,它没有在特定组内提供排名,从而留下了问题:在同一主题的 20 篇文章中,哪 5 篇最相关?
在我们的例子中,一篇文章的标签是“computer, elderly, fifty
”。虽然“computer
”可能是一个通用且合适的标签,“elderly
”和“fifty
”可能过于具体,并且可能无法准确定义这篇文章。
此外,**此技术需要手动干预,因为我们需要手动为每篇文章打上相应的属性标签**。这个过程可能非常耗时且缺乏自动化,因此我们应该采用其他技术。
第二种方法
我们将介绍备受推崇的 tf-idf
算法,该算法解决了之前提到的几乎所有问题。您可以在此处找到本文的后续内容。
历史
- 2023 年 12 月 2 日:初始版本