新聞資訊

新聞資訊 通知公告

如何使用 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 運行上述代碼可能是一個更簡單的解決方案。


本內容屬于網絡轉載,文中涉及圖片等內容如有侵權,請聯系編輯刪除

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

回復列表

相關推薦
体彩十一运夺金规则