召回模塊:構建雙畫像(用戶畫像和物品畫像)

日萌社

人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度學習實戰(不定時更新)


2.2 泛娛樂畫像圖譜存儲

學習目標

  • 目標
    • 知道雙畫像的設計
  • 應用
    • 應用完成用戶與帖子標籤的數據庫導入

2.2.1 畫像圖譜存儲

前面介紹的Web業務當中,需要進行實時推薦,那麼我們需要從neo4j圖譜數據中找到某個用戶的推薦結果推薦出去。所以我們會把產品中歷史的所有用戶、帖子以及它們之間的關係進行導入到neo4j中。

  • 用戶、帖子的標籤當做neo4j圖數據庫中的節點標籤以及屬性
    • SuperfansUser
    • SuperfansPost
  • 用戶與帖子的行爲關係名稱當做neo4j圖數據庫的邊的關係類型、屬性

2.2.1 什麼是雙畫像

  • 雙畫像是指: 用戶畫像和帖子畫像
  • 設計標籤體系:
    • 標籤分類:
      • 靜態標籤: 用戶/帖子中不能/很少變動的屬性,如用戶暱稱,帖子發佈時間
        • 包括用戶暱稱,年齡,星座,所持設備類型,價格,個性簽名等。
      • 動態標籤: 用戶/帖子可能一直處在變動狀態的屬性,如用戶的主動點贊次數,帖子被評論的次數
        • 最近瀏覽的明星,最近登陸時間,主動點贊次數,主動評論次數,主動轉發次數等。
      • 業務關注類標籤:業務部門可能對某些標籤特別感興趣,如用戶的付費情況
        • 比如用戶付費情況, 購買和消費情況。
      • 挖掘類標籤:有些標籤不能直接通過打點直接獲得,而是需要使用一些數據挖掘方法,比如從個人評論內容中識別他的興趣愛好
        • 將用戶的個性簽名和歷史評論內容使用標籤化系統進行興趣傾向預測,獲得對應標籤。
    • 標籤更新週期:隨APP版本更新迭代.
    • 你選擇的標籤要儘可能的和推薦目標有關,同時與數據打點和採集工程師討論標籤設計的合理性.

2.2.2 泛娛樂推薦雙畫像設計

2.2.2.1 畫像來源與存儲設計

  • 用戶與帖子標籤數據的確定

與業務數據部門進行溝通,確定所需要的用戶與帖子標籤數據,然後要求他們導出到CSV文件到固定目錄,我們將其放入到neo4j安裝的import目錄。我們放入 /home/neo4j/import/,在虛擬機當中已經包含了所有的數據導入到了neo4j中。

2.2.2.1 用戶標籤

  • 用戶畫像:用戶ID,設備信息,評論數量,使用系統,關注數量,最後登錄時間,喜歡帖子數量,匿名,發表帖子數量回覆帖子數量,uid

2.2.2.2 帖子標籤

  • 帖子靜態標籤:帖子的靜態標籤體系:包括帖子關聯明星,發佈時間,title,帖子來源,發佈的明星等。

  • 帖子動態標籤:用戶的動態標籤體系: 最近被瀏覽的次數,被點贊次數,被評論次數,被轉發次數等。

  • 挖掘類標籤:將帖子title和評論內容使用標籤化系統進行興趣傾向預測,獲得對應標籤。

每一列分別代表:pid, 發佈時間戳, 涉及的明星列表, 被贊評轉的次數,圖片/視頻地址, 攜帶的文本信息

614540,1514897310,[25, 32,321],37,2,0,https://p.upcdn.pengpengla.com/star/p/u/2018/1/2/59d50372-222b-4482-af34-1fbf3c1fc558.jpg,羨慕你身邊的所有人,也想和你一起生活,嫉妒使我更加喜歡你,2018願你擁有好運氣❤
614544,1514901161,[423, 1,2],2,0,0,https://p.upcdn.pengpengla.com/star/p/u/2018/1/2/84dbb033-b240-45c9-81b6-9ef6b06c8d29.jpg,第一天!哈哈哈哈哈哈哈,才知道有這個功能唉
614552,1514906051,[234],6,0,1,https://p.upcdn.pengpengla.com/star/p/u/2018/1/2/de4082ab-9b82-403e-a60d-5b31a96b5458.jpg,陽光少年🐒️哈哈哈
614566,1514984023,[3,2,1],3,0,0,https://p.upcdn.pengpengla.com/star/p/u/2018/1/3/e0b07d44-0b66-4cec-ba90-383d7f59197f.png,一直喜歡你❤❤❤
614570,1514995252,[234,3,4],0,0,0,https://p.upcdn.pengpengla.com/star/p/u/2018/1/4/1cc2e223-504f-4a11-bfcc-801a3e22d1df.jpg,就是愛你麼麼噠

2.2.2.3 標籤體系的計算與存儲

標籤體系按照定義進行計算,並每週進行一次更新,存儲方式採用雙層存儲模式,Hbase將會記錄所有歷史標籤數據,以便計算產生基於此的新標籤。Neo4j會存儲所有最新的標籤數據,並負責將雙標籤體系融合。

對數據可視化和推薦的可解釋性產生重要影響

  • 雙層存儲
    • 數據合集存於能擴展存儲的分佈式數據之中, 如:Hbase, 最新/使用數據存在利於快速查詢的數據庫之中,如:neo4j
  • 用戶、帖子標籤當做節點以及標籤
  • 用戶與帖子的關係,關注,評論等當做圖中的關係邊

用戶與帖子屬性數據導入neo4j

  • 用戶、帖子節點以及標籤的導入:

使用LOAD CSV FROM導入CSV文件數據,

## User Node Import
LOAD CSV FROM
'file:///dm_user_profile_3000.csv' AS line
CREATE (:SuperfansUser {uid: toInteger(line[0]), nickname: line[1], device_model:line[2], device_system:line[3], follow_stars_list:split(line[4], ","), publish_posts_num: toInteger(line[5]), like_posts_num: toInteger(line[6]), comment_posts_num: toInteger(line[7]),forward_posts_num: toInteger(line[8]), report_posts_num: toInteger(line[9]), last_signin_time: toInteger(line[10])})

# Post Node Import
LOAD CSV FROM
'file:///dm_dynamic_profile_10_3000.csv' AS line
CREATE (:SuperfansPost {pid: toInteger(line[0]), publish_time: toInteger(line[1]), related_stars_list:split(line[2],","), liked_num:toInteger(line[3]), commented_num:toInteger(line[4]), forwarded_num: toInteger(line[5]), iv_url: line[6], text_info: line[7]})

2.2.2.4 用戶與帖子關係批量導入實現

比如關係csv文件:以點贊csv文件爲例:

123123,1233
53543,3411
6456456,32513
23123,623421

歷史用戶與帖子的關係,我們需要進行批量導入到neo4j,所以建立一個導入的Python腳本import_relation.py

from neo4j.v1 import GraphDatabase
NEO4J_CONFIG = dict({    
    "uri": "bolt://192.168.19.137:7687",
    "auth": ("neo4j", "itcast"),
    "encrypted": False
})
driver = GraphDatabase.driver(**NEO4J_CONFIG)

# 寫入關係到數據庫
def wirte_relationship(relationship_csv_path, relationship_type):
    # 讀取CSV文件
    uid_and_pid = pd.read_csv(relationship_csv_path, header=None).values
    with driver.session() as session:
        def wr(uid, pid):
            # 用戶ID讀取
            record = session.run("MATCH(a:SuperfansUser{uid:%s}) return a.uid" %uid)
            result = list(map(lambda x: x[0], record))
            if not result:
                return
            # 帖子ID讀取
            record = session.run("MATCH(a:SuperfansPost{pid:%s}) return a.pid" %pid)
            result = list(map(lambda x: x[0], record))
            if not result:
                return
            # 關係寫入
            session.run("MATCH(a:SuperfansUser{uid:%s}) MATCH(b:SuperfansPost{pid:%s}) with a, b MERGE(a)-[r:%s]-(b)" %(uid, pid, relationship_type))
        # 輸入用戶ID和帖子ID進行關係寫入
        list(map(lambda x: wr(x[0], x[1]), uid_and_pid))

進行CSV文件加載

if __name__ == "__main__":
    """
    relationship_type = "publish"
    relationship_csv_path = "/var/lib/neo4j/import/recommend_post_operation_3000.csv"
    wirte_relationship(relationship_csv_path, relationship_type)
    """
    """ 
    relationship_type = "like"
    relationship_csv_path = "/var/lib/neo4j/import/recommend_like_operation_3000.csv"
    wirte_relationship(relationship_csv_path, relationship_type)
    """
    """
    relationship_type = "comment"
    relationship_csv_path = "/var/lib/neo4j/import/recommend_comment_operation_3000.csv"
    wirte_relationship(relationship_csv_path, relationship_type)
    """
    """
    relationship_type = "share"
    relationship_csv_path = "/var/lib/neo4j/import/recommend_share_operation_3000.csv"
    wirte_relationship(relationship_csv_path, relationship_type)
    """
    relationship_type = "report"
    relationship_csv_path = "/var/lib/neo4j/import/recommend_report_operation_3000.csv"
    wirte_relationship(relationship_csv_path, relationship_type)

3.2.3 小結

  • 用戶、帖子的畫像內容、存儲設計
  • 完成用戶、帖子的標籤歷史數據導入

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章