作者:漢朝,阿里云數據庫算法專家
背景信息
互聯網時代個性化推薦已經滲透到人們生活的方方面面,例如常見的“猜你喜歡”、“相關商品”等。互聯網能夠對用戶投其所好,向用戶推薦他們最感興趣的內容,實時精準地把握用戶興趣。目前很多成功的手機App都引入了個性化推薦算法,例如,新聞類的有今日頭條新聞客戶端、網易新聞客戶端、阿里UC新聞客戶端等;電商類的有拼多多、淘寶、天貓等。分析型數據庫PostgreSQL版推出的向量分析「鏈接」可以幫助您實現上述個性化推薦系統。
個性化推薦系統概述
以個性化新聞推薦系統為例,一篇新聞包含新聞標題、正文等內容,可以先通過NLP(Neuro-Linguistic Programming,自然語言處理)算法,從新聞標題和新聞正文中提取關鍵詞。然后,利用分析型數據庫PostgreSQL版向量內置的文本轉換為向量函數,將從新聞標題和新聞正文中提取出的關鍵詞轉換為新聞向量導入分析型數據庫PostgreSQL版向量數據庫中,用于用戶新聞推薦,具體實現流程如圖1所示。
圖1.推薦算法整體框架
整個新聞推薦系統由以下步驟實現:
- 構建分析型數據庫PostgreSQL版向量庫,得到用戶特征向量。通過分析用戶歷史瀏覽數據,構建相應的用戶畫像,建立用戶偏好模型,得到用戶特征向量。新聞推薦系統可以從用戶的瀏覽日志中得到用戶歷史瀏覽新聞詳情,再從每條歷史瀏覽新聞中提取關鍵詞,建立用戶畫像。例如,某用戶瀏覽了多條NBA(National Basketball Association,美國職業籃球聯賽)季后賽新聞,這些新聞中包含了NBA、籃球、球星、體育等關鍵詞,通過這些關鍵詞可以得出該用戶是一個NBA球迷。通過分析型數據庫PostgreSQL版向量將這些文本關鍵詞轉換為向量并導入到分析型數據庫PostgreSQL版向量庫中,得到用戶特征向量。
- 根據分析型數據庫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:邏輯回歸模型學習中各個屬性的權重。