新闻资讯

新闻资讯 通知公告

如何使用 Python 构建推荐引擎?

编辑:005     时间:2020-08-28

其实,多年以前,我写了一个很小的应用程序,尝试根据葡萄酒的等级来推荐葡萄酒。这是一个小应用,我只分享给了几个好友,他们中有些人与我有相似的品味,而有些人则有不同的品味。

最初,我主要是为了研究如何编写推荐引擎,但如果能够顺便找到一些喜欢的新酒,那就是意外之喜了。事实证明,尽管只有少数几种葡萄酒的评分,但这款应用的推荐依然超出了我的预期。

另外,我也很喜欢 Postgres(不奇怪吧),最近我一直在想为什么我不能直接在 Postgres 中研究机器学习呢。没错,我们有 madlib,但是我想编写自己的推荐引擎。于是,我做了简单的尝试,结果发现我可以在 Postgres 中做很多事情。下面就让我来介绍一下如何在 Postgres 内快速构建一个推荐引擎。

从现有代码着手

首先,我快速浏览了 Python 推荐的一些示例引擎。为了简单起见,我想建立一款更小巧、更简洁的应用,我并不介意使用其它库。后来,我找到了一个简洁的rec-engine(https://github.com/scottfitzcodes/rec-engine-example)示例,该示例利用了 Pandas 和简单的数据模型大幅降低了构建推荐引擎的难度。

设置初始表结构

我抽取了该实例应用程序使用的数据集,并将其转换为SQL进行加载:


加载DataFrame

该 Python 示例直接从 CSV 加载了 DataFrame。但我想在 Postgres 中构建应用。通过上面一步,我将所有数据都存储在了表中,但是如今将其放入DataFrame中……我不是很想再解析成CSV格式。

解决这个问题的方法有很多种(比如创建 JSONB 对象、创建自定义类型等),但我选择了一种非常简单而且很容易实现的方法:将两个数组按照相同的方式排序,然后利用这两个数组创建DataFrame。

为此,我定义了一个函数,并导入了pandas:


注意:首先你需要在 PostgreSQL 数据库安装 plpython3u。

你可能注意到,我并没有用一个数组或一个字典传递订单而是传递了两个数组,后面的产品也是两个数组。为了将数据传递到SQL函数中,我创建了如下查询:



接下来,我就可以将订单数据加载到 DataFrame 了:


下一组数据与嵌入到PostgreSQL函数中的Python示例(

https://github.com/scottfitzcodes/rec-engine-example/blob/master/engine.py)相同:


产品部分的处理与订单相同:创建字典,然后加载 DataFrame。最后,将结果集作为 JSONB 对象返回。两部分结合到一起,完整的函数如下所示:


运行推荐引擎

直接在 SQL 中调用该函数,就可以获得推荐结果:


对于 Plpython3u 和 Pandas 来说,每天使用 pg_cron 运行上述代码可能是一个更简单的解决方案。


本内容属于网络转载,文中涉及图片等内容如有侵权,请联系编辑删除

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

回复列表

相关推荐