天天看點

三步在阿裡雲上面搭建一套個性化推薦系統

三步在阿裡雲上面搭建一套個性化推薦系統

背景資訊

網際網路時代個性化推薦已經滲透到人們生活的方方面面,例如常見的“猜你喜歡”、“相關商品”等。網際網路能夠對使用者投其所好,向使用者推薦他們最感興趣的内容,實時精準地把握使用者興趣。目前很多成功的手機APP都引入了個性化推薦算法,例如,新聞類的有今日頭條新聞用戶端、網易新聞用戶端、阿裡UC新聞用戶端等;電商類的有拼多多、淘寶、天貓等。分析型資料庫PostgreSQL版推出的向量分析可以幫助您實作上述個性化推薦系統。

個性化推薦系統概述

以個性化新聞推薦系統為例,一篇新聞包含新聞标題、正文等内容,可以先通過NLP(Neuro-Linguistic Programming,自然語言處理)算法,從新聞标題和新聞正文中提取關鍵詞。然後,利用分析型資料庫PostgreSQL版向量内置的文本轉換為向量函數,将從新聞标題和新聞正文中提取出的關鍵詞轉換為新聞向量導入分析型資料庫PostgreSQL版向量資料庫中,用于使用者新聞推薦,具體實作流程如圖1所示。

三步在阿裡雲上面搭建一套個性化推薦系統

圖1.推薦算法整體架構

  1. 1.建構分析型資料庫PostgreSQL版向量庫,得到使用者特征向量。通過分析使用者曆史浏覽資料,建構相應的使用者畫像,建立使用者偏好模型,得到使用者特征向量。新聞推薦系統可以從使用者的浏覽日志中得到使用者曆史浏覽新聞詳情,再從每條曆史浏覽新聞中提取關鍵詞,建立使用者畫像。例如,某使用者浏覽了多條NBA(National Basketball Association,美國職業籃球聯賽)季後賽新聞,這些新聞中包含了NBA、籃球、球星、體育等關鍵詞,通過這些關鍵詞可以得出該使用者是一個NBA球迷。通過分析型資料庫PostgreSQL版向量将這些文本關鍵詞轉換為向量并導入到分析型資料庫PostgreSQL版向量庫中,得到使用者特征向量。
  2. 2.根據分析型資料庫PostgreSQL版向量資料庫和邏輯回歸預測模型,将使用者感興趣的新聞推薦給使用者。通過分析型資料庫PostgreSQL版向量資料庫,可以從網際網路檢索出前500條使用者沒有浏覽過的新聞,但是這500條新聞卻是該使用者最感興趣的新聞。然後,從這500條新聞中提取每條新聞的建立時間和點選率,根據邏輯回歸預測模型(該模型來自于使用者以往的浏覽的曆史記錄中),将使用者感興趣的新聞推薦給使用者。

分析型資料庫PostgreSQL版内置的文本轉換為向量函數采用BERT(Bidirectional Encoder Representations from Transformers)模型,同時支援中文和英文兩種語言。該模型基于大量的語料進行訓練,其中包含了語義資訊,而且其查詢精度比簡單的TF-IDF(term frequency–inverse document frequency)算法高。

個性化推薦系統中資料庫表結構設計

圖2是個性化新聞推薦系統中分析型資料庫PostgreSQL版資料庫表結構設計,系統包含了三張表(News, Person,Browses_History),分别存儲新聞資訊、使用者基本資訊、使用者浏覽記錄。

三步在阿裡雲上面搭建一套個性化推薦系統

圖2. 個性化推薦系統分析型資料庫PostgreSQL版表結構

我們對着三張表進行分别介紹:

• News表存儲新聞資訊,包含新聞id(news_id)、新聞建立時間(create_time)、新聞名字(title)、新聞内容(content)、總的使用者點選數(click_times)、兩個小時内的使用者點選次數(two_hour_click_times)。根據新聞的名稱和内容得到新聞的關鍵詞keywords,然後将新聞的關鍵詞轉化成向量(news_vector)。向news表中插入資料時,系統自動根據關鍵詞轉換為向量,将向量和其他新聞資訊一起插入news表。

CREATE TABLE news (
  news_id bigint,
  create_time timestamp,
  title varchar(100),
  content varchar(200),
  keywords varchar(50),  
  click_times bigint,
  two_hour_click_times bigint,
  news_vector real[],
  primary key (news_id)
) distributed by (news_id);           

• Browses_History表記錄使用者浏覽的新聞的情況,包括新聞id(news_id)、使用者id(person_id)、使用者浏覽新聞的時間(browse_time)。

CREATE TABLE browses_history (
  browse_id bigint,
  news_id bigint,
  person_id bigint,
  browse_time timestamp,
  primary key (browse_id)
) distributed by (browse_id);           

• Person表記錄使用者資訊,包括使用者的id(person_id)、使用者的年齡(age)、使用者的星級(star)。

CREATE TABLE person(
  person_id bigint,
  age bigint,
  star float,
  primary key (person_id)
) distributed by (person_id);           

三步實作一個個性化推薦系統:

1.從新聞中抽取新聞特征向量

分析型資料庫PostgreSQL版通過内置的文本轉換為向量函數,抽取新聞特征向量,然後将新聞特征向量存入新聞表news中。例如,執行以下SELECT将傳回文本“ADB For PG is very good!”對應的特征向量。

select feature_extractor('text', 'ADB For PG is very good!');           

假設新聞如下圖所示,通過以下兩個步驟将新聞資訊存入新聞表news表中。

三步在阿裡雲上面搭建一套個性化推薦系統

(1)提取新聞關鍵詞。由于分析型資料庫PostgreSQL版暫時不支援關鍵詞提取函數,您可以調用jieba結巴中文NLP系統)中的關鍵詞抽取函數(jieba.analyse.extract_tags(title + content, 3))提取關鍵詞。

(2)執行INSERT将新聞資訊(包含關鍵詞和新聞特征向量)存入新聞表news表中。

insert into news(news_id, create_time, title, content, 
                 keywords, click_times,two_hour_click_times) 
values(1, now(),'南韓軍方:北韓在平安北道一帶向東發射不明飛行物','據南韓聯合參謀本部消息,當地時間今天下午16時30分左右,北韓在其平安北道一帶向東發射不明飛行物。', '南韓 北韓 不明飛行物', 123, 3);           

2.提取使用者特征向量

(1)提取使用者浏覽關鍵詞。

根據使用者的新聞浏覽日志,我們很容易得到使用者的浏覽關鍵詞。例如,執行以下SELECT得到使用者 person_id為9527的浏覽關鍵詞。

select keywords    
from Person p, Browses_History bh, News n 
where p.person_id = bh.person_id and bh.news_id = n.news_id and p.person_id = 9527;           

(2)将使用者浏覽關鍵詞轉換為使用者特征向量。

将使用者浏覽關鍵詞全部提取出來之後,就可以得到使用者總的浏覽關鍵詞 。例如,使用者person_id為9527浏覽了關鍵詞為“NBA 體育”、“總決賽”、“熱火”、“火箭”的新聞。然後通過文本轉換為向量函數,将使用者person_id為9527浏覽的關鍵詞轉換成向量。

select feature_extractor('text', 'NBA 體育 總決賽 熱火 火箭'));           

3.根據使用者特征向量擷取新聞推薦結果

通過使用者特征向量,到新聞表news中查詢相關的新聞資訊。例如,執行以下SELECT将傳回和使用者相關的前500條新聞,同時系統也會過濾掉使用者已經閱讀過的文章。擷取新聞推薦結果之後,應用就可以将使用者感興趣的新聞推薦給使用者了。

select news_id, title, content, (extract(epoch from (now()-create_time)) * w1 + click_times/extract(epoch from (now()-create_time)) * w2 + two_hour_click_times/extract(epoch from (now()-create_time)) * w3 + ann_distance * w4) as rank_score
from (select *, l2_distance(news_vector, feature_extractor('textf', 'NBA 體育 總決賽 熱火 火箭')) as ann_distance from news order by ann_distance desc limit 500) S 
order by rank_score desc;           

參數說明:

• ann_distance:使用者與新聞的相關度。

• create_time:新聞的建立時間。

• click_times/(now()-create_time):新聞熱度點選率。

• two_hour_click_times/(now()-create_time):新聞近期熱度點選率。

• w1、w2、w3、w4:邏輯回歸模型學習中各個屬性的權重。

結論

詳細的AnalyticDB系統請加我們的釘釘群,歡迎大家讨論和使用。

三步在阿裡雲上面搭建一套個性化推薦系統

往期文獻:

[1] 戴口罩也能刷門禁?疫情下AnalyticDB亮出社群管理的寶藏神器!

https://developer.aliyun.com/article/745160

[2] 阿裡雲提供高效基因序列檢索功能,助力冠狀病毒序列快速分析

https://developer.aliyun.com/article/753097

[3] 三步搭建一套聲紋系統

https://developer.aliyun.com/article/765232

[4] 阿裡雲提供高效病原體檢測工具助力精準醫療

https://yq.aliyun.com/articles/761891