背景信息
互聯(lián)網(wǎng)時代個性化推薦已經(jīng)滲透到人們生活的方方面面,例如常見的“猜你喜歡”、“相關(guān)商品”等?;ヂ?lián)網(wǎng)能夠?qū)τ脩敉镀渌茫蛴脩敉扑]他們最感興趣的內(nèi)容,實時精準(zhǔn)地把握用戶興趣。目前很多成功的手機(jī)APP都引入了個性化推薦算法,例如,新聞類的有今日頭條新聞客戶端、網(wǎng)易新聞客戶端、阿里UC新聞客戶端等;電商類的有拼多多、淘寶、天貓等。分析型數(shù)據(jù)庫PostgreSQL版推出的向量分析可以幫助您實現(xiàn)上述個性化推薦系統(tǒng)。
個性化推薦系統(tǒng)概述
以個性化新聞推薦系統(tǒng)為例,一篇新聞包含新聞標(biāo)題、正文等內(nèi)容,可以先通過NLP(Neuro-Linguistic Programming,自然語言處理)算法,從新聞標(biāo)題和新聞?wù)闹刑崛£P(guān)鍵詞。然后,利用分析型數(shù)據(jù)庫PostgreSQL版向量內(nèi)置的文本轉(zhuǎn)換為向量函數(shù),將從新聞標(biāo)題和新聞?wù)闹刑崛〕龅年P(guān)鍵詞轉(zhuǎn)換為新聞向量導(dǎo)入分析型數(shù)據(jù)庫PostgreSQL版向量數(shù)據(jù)庫中,用于用戶新聞推薦,具體實現(xiàn)流程如圖下所示。
推薦算法整體框架
1.構(gòu)建分析型數(shù)據(jù)庫PostgreSQL版向量庫,得到用戶特征向量。通過分析用戶歷史瀏覽數(shù)據(jù),構(gòu)建相應(yīng)的用戶畫像,建立用戶偏好模型,得到用戶特征向量。新聞推薦系統(tǒng)可以從用戶的瀏覽日志中得到用戶歷史瀏覽新聞詳情,再從每條歷史瀏覽新聞中提取關(guān)鍵詞,建立用戶畫像。例如,某用戶瀏覽了多條NBA(National Basketball Association,美國職業(yè)籃球聯(lián)賽)季后賽新聞,這些新聞中包含了NBA、籃球、球星、體育等關(guān)鍵詞,通過這些關(guān)鍵詞可以得出該用戶是一個NBA球迷。通過分析型數(shù)據(jù)庫PostgreSQL版向量將這些文本關(guān)鍵詞轉(zhuǎn)換為向量并導(dǎo)入到分析型數(shù)據(jù)庫PostgreSQL版向量庫中,得到用戶特征向量。
2.根據(jù)分析型數(shù)據(jù)庫PostgreSQL版向量數(shù)據(jù)庫和邏輯回歸預(yù)測模型,將用戶感興趣的新聞推薦給用戶。通過分析型數(shù)據(jù)庫PostgreSQL版向量數(shù)據(jù)庫,可以從互聯(lián)網(wǎng)檢索出前500條用戶沒有瀏覽過的新聞,但是這500條新聞卻是該用戶最感興趣的新聞。然后,從這500條新聞中提取每條新聞的創(chuàng)建時間和點擊率,根據(jù)邏輯回歸預(yù)測模型(該模型來自于用戶以往的瀏覽的歷史記錄中),將用戶感興趣的新聞推薦給用戶。
分析型數(shù)據(jù)庫PostgreSQL版內(nèi)置的文本轉(zhuǎn)換為向量函數(shù)采用BERT(Bidirectional Encoder Representations from Transformers)模型,同時支持中文和英文兩種語言。該模型基于大量的語料進(jìn)行訓(xùn)練,其中包含了語義信息,而且其查詢精度比簡單的TF-IDF(term frequency–inverse document frequency)算法高。
個性化推薦系統(tǒng)中數(shù)據(jù)庫表結(jié)構(gòu)設(shè)計
下面是個性化新聞推薦系統(tǒng)中分析型數(shù)據(jù)庫PostgreSQL版數(shù)據(jù)庫表結(jié)構(gòu)設(shè)計,系統(tǒng)包含了三張表(News, Person,Browses_History),分別存儲新聞信息、用戶基本信息、用戶瀏覽記錄。
個性化推薦系統(tǒng)分析型數(shù)據(jù)庫PostgreSQL版表結(jié)構(gòu)
我們對著三張表進(jìn)行分別介紹:
News表存儲新聞信息,包含新聞id(news_id)、新聞創(chuàng)建時間(create_time)、新聞名字(title)、新聞內(nèi)容(content)、總的用戶點擊數(shù)(click_times)、兩個小時內(nèi)的用戶點擊次數(shù)(two_hour_click_times)。根據(jù)新聞的名稱和內(nèi)容得到新聞的關(guān)鍵詞keywords,然后將新聞的關(guān)鍵詞轉(zhuǎn)化成向量(news_vector)。向news表中插入數(shù)據(jù)時,系統(tǒng)自動根據(jù)關(guān)鍵詞轉(zhuǎn)換為向量,將向量和其他新聞信息一起插入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);
三步實現(xiàn)一個個性化推薦系統(tǒng):
1.從新聞中抽取新聞特征向量
分析型數(shù)據(jù)庫PostgreSQL版通過內(nèi)置的文本轉(zhuǎn)換為向量函數(shù),抽取新聞特征向量,然后將新聞特征向量存入新聞表news中。例如,執(zhí)行以下SELECT將返回文本“ADB For PG is very good!”對應(yīng)的特征向量。
select feature_extractor('text', 'ADB For PG is very good!');
假設(shè)新聞如下圖所示,通過以下兩個步驟將新聞信息存入新聞表news表中。
(1)提取新聞關(guān)鍵詞。由于分析型數(shù)據(jù)庫PostgreSQL版暫時不支持關(guān)鍵詞提取函數(shù),您可以調(diào)用jieba結(jié)巴中文NLP系統(tǒng))中的關(guān)鍵詞抽取函數(shù)(jieba.analyse.extract_tags(title + content, 3))提取關(guān)鍵詞。
(2)執(zhí)行INSERT將新聞信息(包含關(guān)鍵詞和新聞特征向量)存入新聞表news表中。
insert into news(news_id, create_time, title, content, keywords, click_times,two_hour_click_times) values(1, now(),'韓國軍方:朝鮮在平安北道一帶向東發(fā)射不明飛行物','據(jù)韓國聯(lián)合參謀本部消息,當(dāng)?shù)貢r間今天下午16時30分左右,朝鮮在其平安北道一帶向東發(fā)射不明飛行物。', '韓國 朝鮮 不明飛行物', 123, 3);
2.提取用戶特征向量
(1)提取用戶瀏覽關(guān)鍵詞。
根據(jù)用戶的新聞瀏覽日志,我們很容易得到用戶的瀏覽關(guān)鍵詞。例如,執(zhí)行以下SELECT得到用戶 person_id為9527的瀏覽關(guān)鍵詞。
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)將用戶瀏覽關(guān)鍵詞轉(zhuǎn)換為用戶特征向量。
將用戶瀏覽關(guān)鍵詞全部提取出來之后,就可以得到用戶總的瀏覽關(guān)鍵詞 。例如,用戶person_id為9527瀏覽了關(guān)鍵詞為“NBA 體育”、“總決賽”、“熱火”、“火箭”的新聞。然后通過文本轉(zhuǎn)換為向量函數(shù),將用戶person_id為9527瀏覽的關(guān)鍵詞轉(zhuǎn)換成向量。
select feature_extractor('text', 'NBA 體育 總決賽 熱火 火箭'));
3.根據(jù)用戶特征向量獲取新聞推薦結(jié)果
通過用戶特征向量,到新聞表news中查詢相關(guān)的新聞信息。例如,執(zhí)行以下SELECT將返回和用戶相關(guān)的前500條新聞,同時系統(tǒng)也會過濾掉用戶已經(jīng)閱讀過的文章。獲取新聞推薦結(jié)果之后,應(yīng)用就可以將用戶感興趣的新聞推薦給用戶了。
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;
參數(shù)說明:
ann_distance:用戶與新聞的相關(guān)度。
create_time:新聞的創(chuàng)建時間。
click_times/(now()-create_time):新聞熱度點擊率。
two_hour_click_times/(now()-create_time):新聞近期熱度點擊率。
w1、w2、w3、w4:邏輯回歸模型學(xué)習(xí)中各個屬性的權(quán)重。