前提条件

目标集群为云原生数据仓库AnalyticDB MySQL版 2.0

背景信息

互联网时代个性化推荐已经渗透到人们生活的方方面面,例如常见的“猜你喜欢”、“相关商品”等。互联网能够对用户投其所好,向用户推荐他们最感兴趣的内容,实时精准地把握用户兴趣。目前很多成功的手机App都引入了个性化推荐算法,例如,新闻类的有今日头条新闻客户端、网易新闻客户端、阿里UC新闻客户端等;电商类的有拼多多、淘宝、天猫等。分析型数据库MySQL版推出的向量分析可以帮助您实现上述个性化推荐系统。

个性化推荐系统概述

以个性化新闻推荐系统为例,一篇新闻包含新闻标题、内容等内容,可以先通过NLP(Natural Language Processing,自然语言处理)算法,从新闻标题和新闻内容中提取关键词。然后,利用分析型数据库MySQL版向量内置的文本转换为向量函数,将从新闻标题和新闻内容中提取出的关键词转换为新闻向量导入分析型数据库MySQL版向量数据库中,用于用户新闻推荐,具体实现流程如下图所示。

整个新闻推荐系统由以下两个步骤实现。

  1. 构建分析型数据库MySQL版向量库,得到用户特征向量。

    通过分析用户历史浏览数据,构建相应的用户画像,建立用户偏好模型,得到用户特征向量。对于新闻推荐系统而言,可以从用户的浏览日志中得到用户历史浏览新闻详情,再从每条历史浏览新闻中提取关键词,建立用户画像。例如,某用户浏览了多条CBA(China Basketball Association,中国男子职业篮球联赛)季后赛新闻,这些新闻中包含了CBA、篮球、球星、体育等关键词,通过这些关键词可以得出该用户是一个CBA球迷。通过分析型数据库MySQL版向量将这些文本关键词转换为向量并导入到分析型数据库MySQL版向量库中,得到用户特征向量。

  2. 根据分析型数据库MySQL版向量数据库和逻辑回归预测模型,将用户感兴趣的新闻推荐给用户。

    通过分析型数据库MySQL版向量数据库,可以从互联网检索出前500条用户没有浏览过的新闻,但是这500条新闻却是该用户最感兴趣的新闻。然后,从这500条新闻中提取每条新闻的创建时间和点击率,最后,根据逻辑回归预测模型(该模型来自于用户以往的浏览的历史记录中),将用户感兴趣的新闻推荐给用户。

分析型数据库MySQL版内置的文本转换为向量函数采用BERT(Bidirectional Encoder Representations from Transformers)模型,同时支持中文和英文两种语言。该模型基于大量的语料进行训练,其中包含了语义信息,而且其查询精度比简单的TF-IDF(term frequency–inverse document frequency)算法高。

个性化推荐系统中数据库表结构设计

上图是个性化新闻推荐系统中分析型数据库MySQL版数据库表结构设计,包含了三张表newspersonbrowses_history,分别存储新闻信息、用户基本信息、用户浏览记录。

  • news

    news表存储新闻信息,包含新闻ID(news_id)、新闻创建时间(create_time)、新闻名字(title)、新闻内容(content)、新闻关键词(keywords)、总的用户点击数(click_times)、两个小时内的用户点击数(two_hour_click_times)、新闻向量(news_vector)。分析型数据库MySQL版根据新闻名称和内容得到新闻关键词keywords,然后,将新闻关键词转换为向量(news_vector)。向news表中插入数据时,系统自动根据关键词转换为向量,将向量和其他新闻信息一起插入news表。

      CREATE TABLEGROUP recommendation_system_group;
      CREATE TABLE news (
        news_id bigint primary key,
        create_time timestamp,
        title varchar(100),
        content varchar(200),
        keywords varchar(50),
        click_times bigint,
        two_hour_click_times bigint,
        news_vector float[768] COLPROPERTIES (DistanceMeasure='SquaredEuclidean',ExtractFrom='text_feature_extract_v1(keywords)'),
        ANN INDEX feature_index (news_vector) Algorithm=IVFPQ,
        primary key (news_id)
      )
      PARTITION BY HASH KEY (news_id) PARTITION NUM 2
      CLUSTERED BY (news_id)
      TABLEGROUP recommendation_system_group
      OPTIONS (UPDATETYPE='realtime');
  • browses_history

    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)
      )
      PARTITION BY HASH KEY (browse_id) PARTITION NUM 2
      CLUSTERED BY (browse_id)
      TABLEGROUP recommendation_system_group
      OPTIONS (UPDATETYPE='realtime');
  • person

    person表存储用户信息,包括用户的ID(person_id)、年龄(age)、星级(star)。

      CREATE TABLE person(
        person_id bigint,
        age bigint,
        star float,
        primary key (person_id)
      )
      PARTITION BY HASH KEY (person_id) PARTITION NUM 2
      CLUSTERED BY (person_id)
      TABLEGROUP recommendation_system_group
       OPTIONS (UPDATETYPE='realtime');

个性化推荐系统实施步骤

结合上述个性化新闻推荐系统中分析型数据库MySQL版数据库表结构设计,整个系统的实施步骤如下所示。

步骤一:从新闻中抽取新闻特征向量

分析型数据库MySQL版通过内置的文本转换为向量函数,抽取新闻特征向量,然后将新闻特征向量存入新闻表news中。例如,执行以下SELECT将返回文本AnalyticDB向量数据库is very good!对应的特征向量。

select TEXT_FEATURE_EXTRACT_V1('AnalyticDB向量数据库is very good!');

例如,通过以下两个步骤将新闻信息存入新闻表news表中。

  1. 提取新闻关键词。

    由于分析型数据库MySQL版暂时不支持关键词提取函数,您可以调用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(),'什么是云原生数据仓库AnalyticDB MySQL版', '云原生数据仓库AnalyticDB MySQL版是融合数据库、大数据技术于一体的云原生企业级数据仓库服务。', '数据仓库 AnalyticDB MySQL', 123, 3);
    重要 执行INSERT时,分析型数据库MySQL版自动将新闻关键词转换为新闻特征向量,并将其存入向量库。
步骤二:提取用户特征向量
  1. 提取用户浏览关键词。

    根据用户的新闻浏览日志,我们很容易得到用户的浏览关键词。例如,执行以下SELECT得到用户person_id9527的浏览关键词。

     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

    将用户浏览关键词全部提取出来之后,就可以得到用户总的浏览关键词 。例如,用户person_id9527浏览了关键词为CBA 体育总决赛上海广州的新闻。然后通过文本转换为向量函数,将用户person_id9527浏览的关键词转换成向量。

  2. 将用户浏览关键词转换为用户特征向量。
     select TEXT_FEATURE_EXTRACT_V1 ('CBA 体育 总决赛 上海 广州')
步骤三:根据用户特征向量获取新闻推荐结果
通过用户特征向量,到新闻表news中查询相关的新闻信息。例如,执行以下SELECT将返回和用户相关的前500条新闻,同时系统也会过滤掉用户已经阅读过的文章。
select id, title, content, ((now()-create_time)*w1 + click_times/(now()-create_time)*w2 + two_hour_click_times/(now()-create_time)*w3 + ann_distance * w4) as rank_score
from ANN (News, news_vector,TEXT_FEATURE_EXTRACT_V1 ('CBA 体育 总决赛 上海 广州'), 500)
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:逻辑回归模型学习中各个属性的权重。

    获取新闻推荐结果之后,应用就可以将用户感兴趣的新闻推荐给用户了。