关于新闻个性化推荐你不能不知道的4个部分

关于个性化推荐,我的理解是:按照每个人的喜好,在合适的时间、合适的场景、把合适的内容以合适的形式呈现在用户面前,满足用户的需求。那么这里就涉及到了三部分,用户—

关于个性化推荐,我的理解是:按照每个人的喜好,在合适的时间、合适的场景、把合适的内容以合适的形式呈现在用户面前,满足用户的需求。那么这里就涉及到了三部分,用户——算法和策略——内容。

下图是一个简单的新闻推荐组成部分:

新闻推荐简图

我们的“人”和“物”都是复杂的,需要用我们理解的符号去把他们描绘出来,让我们的程序理解。

一、内容画像

1.1 新闻文章来源

做新闻,我们首先要有文章源。文章的来源,一般有三部分:

  1. 机器在各个资讯网站抓来的文章。
  2. 公司编辑自己写的文章。
  3. 入驻作者写的文章。

1.2 内容分类体系介绍

有了文章,我们需要把文章分门别类的放在一个内容池子里。

那么该如何分门别类呢?这里就涉及到了内容分类体系。

在我们逛淘宝的时候,会有各种物品的分类,比如家居,比如图书,比如衣服。

同样的,文章也会有分类。当我们打开一个资讯app,比如头条吧,就可以看到导航栏有:“军事”“历史”“时政”等等。

结构化分类体系

知识图谱

1.3 常见问题和分类原则

  • 一级分类=二级分类的情况:如美食,宠物的一级二级分类名称相同。
  • 二级分类不够全或分的较粗:如历史被分为“古代史,近代史,现代史”。
  • 一些分类较杂:如“科学探索”分类下可能各种内容都有。
  • 一些二级分类归属不够合适:在有一级分类“职场”的情况下,“职业培训”被放在了“教育”。
  • 一些文章没有好的归属,如办公软件的学习类文章没有归属。
  • 人工智能分类下的文章有一些是玩偶。

在做分类的时候我们会遵循一些原则,这里我来说一下结构化分类体系搭建的原则。

  1. 相互独立:各分类间内涵应当相互独立。
  2. 完全穷尽:各分类应当完全穷尽列举,下一级分类可以组成上一级分类的全集。
  3. 命名应当短小易懂。
  4. 命名应当准确无歧义。
  5. 命名具有内容代表性。
  6. 分类粒度应当适合,不能较粗或较细。
  7. 每个分类下三级分类不能过于庞大。
  8. 释义应当相对简单明了,不应长篇大论太过专业。应当从c端用户角度考虑,使标注的人可以一下子理解分类的内涵,而非必须具有专业知识才可分辨,否则不符合用户思维习惯。

1.4 构建分类体系

那么接下来我们该如何去做分类体系呢?有两个思路:

1)让程序根据站内用户浏览记录,抓取出浏览比较多的一些关键词,我们按照这些关键词去整合分类。

但从实际操作来看,用户的兴趣分层是:(一二三级)分类——主题——兴趣点——关键词的层级,

举个例子:科技(一级)——互联网(二级)——人工智能(三级)——智能办公(主题topic)——语音助手(兴趣点poi)——小爱(关键词)

如果我们根据关键词往上汇合分类,会比较难实施。

2)人为的定义出一二三级分类。具体操作步骤如下:

  • 了解每个一级分类内涵,查阅大量相关网站,如搜索历史垂类网站,查看网站内容和分类。②根据网站分类,逐一列举,从日常用户兴趣角度出发列举三级分类粒度的分类词。
  • 从三级分类合并二级,以及从二级分类拆分三级分类双向进行整理。
  • 对分类给出释义和边界,以便标注人员区分。

那么我们如何保证三级分类下的文章充足?以及如何保证人工分类的准确性呢?

我们采取了两个措施:

  • 针对问题1:我们把三级分类词,如“人工智能”放到研发的文章召回系统,进行搜索——可以看到以“人工智能”为关键词可以召回的文章内容及数量,以此来判断此三级分类是否文章充足,进行调整。
  • 针对问题2:因为一部分的文章首先要经过标注团队的人工标注,在标注的时候,标注员会反馈具体某个三级分类存在的问题以及不合理性。此环节产品,运营,编辑都会介入,对于不合适的三级分类会进行修改。

1.5 人工标注和机器学习

当分类体系完成后,接下来是标注环节。

标注团队标注一定数量的文章,算法团队的工程师会用算法对人工标注的样本,进行有监督的机器学习,把剩余的文章用程序给它标上对应的分类。

负责这部分工作的工程师,会用多种方法来对文章进行机器学习,比如有ABC三种。用三种方法对新的文章样本进行分类。

然后让标注员对算法标分类的文章进行校验,从而得出三种方法为文章分类的准确性,公式如下:

标注员分类和机器分类相同的文章数量/总的文章数量=机器标注准确率

之后算法工程师会对标注不准确的文章继续进行学习,不停的迭代优化算法。

针对外部抓取的文章,算法工程师也会用这套方法对他们标记分类。到这里,我们的文章就可以分门别类的被放在内容池的不同地方了。

二、用户画像

2.1 什么是用户画像

当有了内容的画像,我们也需要用户的画像。那什么是用户画像呢,我认为是对用户这个客观实体的描募。

比如我对自己进行一个总结:男,175cm,65千克,产品经理,26岁,月薪25k,无车……等等。

这就是我的用户画像。

那么为什么做推荐需要用户画像呢?

是因为只有当我们了解了一个人,才能把她最想要的给她。

用户画像

2.2 用户画像要基于业务存在

做用户画像第一步要基于业务,也就是说用户画像是要对具体业务场景来服务的。

比如个性化推荐,精准营销,数据分析,活动运营等等。

所以第一步需要了解业务场景以及各岗位的同事对画像的需求。

2.3 搭建用户画像体系

在了解之后,我们会开始搭建画像特征的体系,这里说明一下,特征是一点点获取、建立和利用的;但特征体系在一开始需要搭建出来,尽可能的囊括各业务场景的需要。

虽然某些特征可能在初始阶段还没有建立,但需要根据业务需求先列举出来;以便在做画像平台功能框架搭建的时候,不会因为没考虑到某类特征,而使后期画像平台的功能框架无法兼容。

以下我从:基本信息、兴趣爱好、行为特征、社交和心理、消费与模型这5个方面做了一个简单的新闻资讯用户画像体系。

一般来说在建立特征体系的时候,应该包含以下表头:一级特征分类、二级特征分类、特征描述、特征字段、特征值类型、特征来源、特征时效、最近更新内容、特征示例。

资讯用户画像体系

2.4 画像特征介绍

用户画像主要有两块:事实特征和模型特征。

事实特征是用户的基本信息,以及他在app内产生的行为:如用户的设备信息,地理位置,主动填写的性别,年龄,以及在客户端浏览文章中产生的点击行为等等。

模型特征是我们基于用户的事实特征,制定一些规则建立的:如用户流失等级,用户消费等级,用户满意度等。

从时效性上来划分,画像特征分为长期,短期,实时。

长期特征如:用户基本信息里面的一部分特征,性别,年龄,生日,账号,设备等等。

短期特征如:用户的兴趣爱好和行为特征,当然这里要说明用户的兴趣爱好也分为长期和短期,但这个是相对的,兴趣爱好仍然被我放在短期特征内。

实时特征如:用户的实时地理位置,实时网络状态等等

2.5 画像特征获取

那么画像的特征数据要怎么获取呢?

①事实特征里的一部分,是我们通过用户主动填写或埋点来获得的,比如用户主动填写的性别,比如埋点获得的用户浏览时长。

②另一部分是根据业务指标来对事实特征进行复合计算,如:用户文章平均阅读时长=用户阅读的总时长/用户阅读的总文章数。

如果用户没有填写某些信息,或者我们获取不到怎么办呀?

一般我们有两种方式:

  1. 引入第三方数据补全用户画像特征。
  2. 算法工程师会把填写了性别的用户作为样本,按照男女分别进行有监督的机器学习,从而对性别特征不完整的用户进行模型训练,得出这部分用户的性别,但这里是一个概率值,比如A用户性别:男70%,女30%。

说完了事实特征,我们来说模型特征。

模型特征则需要我们去制定一些规则,为我们的业务场景服务,比如用户流失等级,运营可以针对不同流失等级的用户上不同的运营策略。我们规定:

  • 3天未打开新闻客户端的用户,流失等级为A;
  • 7天未打开新闻客户端的用户,流失等级为B;
  • 15天未打开新闻客户端的用户,流失等级为C;
  • 30天未打开新闻客户端的用户,流失等级为D;
  • 60天未打开新闻客户端的用户,流失等级为E;
  • 90天未打开新闻客户端的用户,流失等级为F(流失了)。

2.6 用户画像平台

搭建好用户画像特征体系之后,我们需要有个可视化的平台,用户画像平台。在功能上一般应分为四部分。

  1. 群体画像:我们可以通过特征圈选人群。比如用性别这个特征,分男女去看,不同的用户群体,喜好的文章一级分类有什么区别。
  2. 单用户画像:当我们输入用户的id,可以看到这个用户所有特征的详细信息,同时也需要有个用户画像丰满度的总评分。
  3. 场景赋能:比如我们可以圈选一部分目标用户,对他们进行广告投放,看这批用户后期在每一个环节的转化。
  4. 权限和特征管理:画像平台应当对不同岗位的员工设置不同的权限,同时也需要对用户画像的特征进行管理,支持增删改查的操作。

三、召回和排序

3.1 什么是召回

首先我来解释一下什么是召回,通俗易懂的理解就是:根据用户的一些“条件”把符合这些“条件”的文章从广阔的内容池里召唤出来,放到一个小的池子里。

3.2 文章的信息抽取

在召回前我们会做一些准备工作。

第一步是信息的抽取,文章是由html语言编写的,有有<head>有<body>,是成对出现的,都是半结构化的数据。</p> <p>程序对文章进行信息抽取的时候,也是按照这样的结构,用深度优先遍历,按照栈结构先进后出的特点来抽取的。</p> <p><strong>深度优先遍历</strong>这里我来说一下,如果是学计算机的同学,在《数据结构》这门课程中会学到。</p> <p>如下图是一个树结构,我们需要把每个节点都走一遍,“深度优先”顾名思义就是纵向最深,那么我们按照从左到右深度优先的规则,走一遍。</p> <p><strong>得出的顺序就是:A-B-E-F-C-G-D-H-I。</strong></p> <p>那么为什么抽取文章信息的时候,要用深度优先遍历呢?</p> <p>就是因为上文提到的文章的结构是有标题有正文,在html语言中代表标题和正文的标识在每个部分的前后出现,相互一层层嵌套,采用深度优先遍历,抽取出的信息结构不会混乱。</p> <p><img src="https://image.imspm.com/2023/1030/2000/97688_8d8741273456459292c560457f31899c.png" /></p> <p>树</p> <p>抽取后,程序需要识别出哪些是正文,哪些是广告。对于我们人来说,可以轻易辨别;但是对于程序而言,需要一些规则去让程序识别出来——<strong><br /> 比如我们用投票方法来对文章文本块进行打分。</strong></p> <p>规定文本块的位置:在页面中间的为3分,在页面左右两端的为1分,在页面底部的为2分。</p> <p>再比如我们规定文本块的长度:不同的长度给不同的分值。</p> <h3>3.3 文章的分词</h3> <p>抽取信息之后,我们要对文章内容进行分词,对于我们人来说,我们可以根据学习经验对文本进行断句,但机器却并不知道。</p> <p>所以这里我们也有一些方法,下面来介绍3种。</p> <p><strong>1)字典-最大前缀</strong></p> <p>首先我们有一个字典集,这个里面包含我们所有的词语,当机器“读”一句话的时候,例如“个性化推荐真好玩”</p> <p>按照字典里面存在的词语去从左到右进行匹配,“个性”是一个词,做个记录,继续往下。“个性化”又是一个词,再做个记录。“个性化推”不是一个词语,继续向下“个性化推荐”是一个词语。</p> <p>直到找到最大的词组。</p> <p><strong>2)N-gram分词</strong></p> <p>这个N代表的就是对这句话用几个字去拆分,比如N=3,原句就会被拆分为“个性化”“性化推”“化推荐”……。</p> <p><strong>3)基于统计学的分词</strong></p> <p>如贝叶斯,根据语料库的历史信息,分析当一个汉字出现时,另一个汉字出现在它后面的概率,从而进行分词。</p> <p><img src="https://image.imspm.com/2023/1030/2000/97688_62091def77c94ba0bd6e3e8e05ec1bf0.png" /></p> <p>字典-最大前缀树</p> <p><img src="https://image.imspm.com/2023/1030/2000/97688_93d58e46a156426e8dae10dae69033a8.jpg" /></p> <p>贝叶斯公式</p> <h3>3.4 文章的过滤与排重</h3> <p><strong>分词后我们会进行一波过滤:敏感词过滤、低质过滤、排重。</strong></p> <p>敏感词过滤:会根据既定的一些敏感词列表,把包含这些敏感词的文章过滤掉。</p> <p>低质过滤:会根据机器学习的历史低质文章算法,加标注人员标注的低质文章,对文章进行过滤。</p> <p>排重:这里要对相似度较高的文章进行去重。我们来介绍两种方法:</p> <p><strong>1)I-Match算法</strong></p> <p>假设有A和B两篇文章,分词后,我们首先统计出两篇文章的高频,中频,低频词。去掉高频和低频词。比较A和B两篇文章中频词汇表的相似度,卡一个相似度的阈值。</p> <p><strong>2)Shingle算法</strong></p> <p>假设有A和B两篇文章,A是:我困了晚安我睡了,B是:我累了晚安我睡了。</p> <p>shingle会把A文章拆分为“我困了,困了晚,了晚安,晚安我,安我睡,我睡了。”;B文章拆为“我累了,累了晚,了晚安,晚安我,安我睡,我睡了。”</p> <p><strong>两篇文章的相似度=重复词汇量/(A文词汇量+B文词汇量-重复词汇量)=4/(6+6-4)=50%,卡一个相似度的阈值。</strong></p> <p>对相似度达到阈值的文章进行过滤,仅留一篇,比如按照发表的先后顺序留,或者按照文章质量的判定留等等。</p> <h3>3.5 文章的召回</h3> <p><strong>召回</strong></p> <p><strong>1)基于人口属性的召回。</strong></p> <p>如根据用户的地理位置召回的文章。</p> <p><strong>2)基于用户兴趣的召回</strong></p> <p>如根据用户对各分类文章的兴趣程度进行召回。举个例子:我们选取用户近7天内点击的文章所属的三级分类下的文章,按照当下点击数由高到低的选取30篇文章进入这路召回的集合。</p> <p><strong>3)基于用户行为特征的召回</strong></p> <p>如根据用户在站内的行为特征来进行召回。举个例子:我们规定用户对文章有以下行为就代表了用户的行为特征,对某篇文章点赞(1分),评论(2分),转发(3分)。</p> <p>我们选取出这个用户近7天内,得分最高的5篇文章,所在的三级分类下的30篇新文章,进入这路召回的集合。</p> <p><strong>4)基于协同的召回。</strong></p> <p><strong>空间向量模型</strong>在说协同之前,我们先介绍一个空间向量模型。</p> <p>我们把每个用户表达成了一个个的标签特征,我们想象每个标签就是一个坐标轴,每个特征的分值,就是这个特征在坐标轴上的长度。这样我们可以在一个多维坐标轴上,用一个向量来描述一个用户,代表不同用户的两个向量的夹角越小,就表示两个用户越相似。</p> <p>两篇不同文章的相似度计算也是一样。具体的公式如下:</p> <p><img src="https://image.imspm.com/2023/1030/2000/97688_964bf2c48d58441db27e78717e5605a8.png" /></p> <p>余弦相似度公式</p> <p><strong>协同</strong></p> <p><strong>1)基于用户的协同</strong></p> <p>比如A用户和B用户向量化后很相似,那么我们认为B用户喜欢的东西,A用户也会喜欢,于是我们把B用户喜欢的东西推荐给了A用户。</p> <p><strong>2)基于内容的协同</strong></p> <p>比如A用户喜欢甲文章,甲乙文章向量化后很相似,那么我们认为乙文章A用户也会喜欢,于是我们把乙文章推荐给了A用户。</p> <p><strong>3)基于整体的协同</strong></p> <p>比如有ABC三个用户,A用户喜欢甲乙文章,B用户喜欢甲乙丙文章,C用户喜欢甲文章,于是我们认为喜欢甲文章的用户都会喜欢乙文章,于是把乙文章推荐给了C用户。</p> <h3>3.6 文章的排序</h3> <p>每路召回形成的是一个基于每个用户的文章集合,我们需要把多路集合作为输入集灌入到我们的排序模型中。</p> <p>排序模型会通过模型对用户和文章的众多特征,每个特征的权重进行计算。</p> <p><strong>常用的排序模型有:LR(逻辑回归),GBDT(决策树),FM(因子分解机)等以及他们的复合变种。</strong></p> <p>经过排序之后,对于每个用户,会输出一个新闻的信息流按照排序的规则(由高到低)。</p> <h2 >四、推荐策略</h2> <p>下面我们来说一下重排序,也就是上产品策略的阶段。</p> <h3>4.1 常见策略</h3> <p>我接触过的部分策略如下:</p> <ol> <li>新用户兴趣试探策略</li> <li>兴趣打散策略</li> <li>本地化推荐</li> <li>网络状态推荐</li> <li>分时段推荐策略</li> <li>搜索行为策略</li> <li>负反馈策略</li> <li>分场景策略</li> <li>热点事件策略</li> <li>通勤场景策略</li> <li>季节性策略</li> <li>流失召回策略</li> </ol> <h3>4.2 策略的目标</h3> <p>在工作中,我们都会有一个目标,为一个目标服务。比如:新闻的个性化推荐看重,uv点击率,次日留存率,用户的平均阅读时长等。</p> <p>对于新用户来说:我的理解是要尽快发现他们的兴趣,把他们留下来,然后提升点击。</p> <p>对于老用户来说:我的理解是要发掘他们更多的兴趣,提升他们的点击和阅读时长,减少流失。</p> <h3>4.3 策略案例</h3> <p>这里来分享1个案例:分网络状态推荐策略。</p> <p>需要说明的是:这里只进行思路简述,实际策略方案会比这个更加严谨和复杂。</p> <p><strong>4.3.1 猜想与调研</strong></p> <p><strong>猜想</strong></p> <p>从实际体验出发,当我们在无线网络下,会更肆无忌惮的去点视频图文观看,而在有线环境下会更少一些。</p> <p>如果用户的行为符合这个猜想,那么在不同的网络状态调整不同类型文章的占比,可以提升用户的点击。</p> <p><strong>调研</strong></p> <p>为了验证这个猜想,我们可以做一个竞品调研。比如我们的新闻客户端是A,调研BCD三家新闻客户端在有线和无线状态下,前100条资讯,首页信息流中纯视频的数量(广告除外)</p> <p>假设我们得到的结果如下图。我们发现竞品确实也做了这样的策略,那么我们需要做个ABtest来看下效果:</p> <p><img src="https://image.imspm.com/2023/1030/2000/97688_b5a0cf8e90e7456fa1217c223c1eda19.png" /></p> <p><strong>4.3.2 实验设计</strong></p> <p><strong>1)网络状态:</strong></p> <p>实验组和对照组按照要求处在不同网络状态下。</p> <p><strong>2)人群划分:</strong></p> <p>圈选20w人群,多维度均匀选取等量分为4组,使4组用户同质。</p> <p><strong>3)变量控制:</strong></p> <p>只有首页信息流视频出现的比例不同这一个变量。</p> <p><strong>4)用户要求:</strong></p> <p>每个组的5w用户,只有当此用户当日有分别在有线和无线网络下浏览新闻的行为,才会被计入统计。</p> <p><strong>对照组1:</strong>5w用户保持线上逻辑,有线和无线网络状态,首页信息流推荐视频比例相等。</p> <p><strong>对照组2:</strong>5w用户保持线上逻辑,有线和无线网络状态,首页信息流推荐视频比例相等。</p> <p>(说明:AAtest,保证实验组和对照组的变化,不是由于人群包切分或其他因素造成不同。)</p> <p><strong>实验组1:</strong>5w用户在无线网络下推荐视频比例与对照组相同,有线网络状态下首页信息流降低5%比例的视频。</p> <p><strong>实验组2:</strong>5w用户在无线网络下推荐视频比例与对照组相同,有线网络状态下首页信息流降低10%比例的视频。</p> <p><strong>实验组3:</strong>5w用户在无线网络下推荐视频比例与对照组相同,有线网络状态下首页信息流降低15%比例的视频。</p> <p><strong>4.3.3 实验结果评估</strong></p> <p><strong>1)观测指标</strong></p> <p>各个分组(按日):人均曝光量,人均点击量,人均点击率,人均阅读时长,次日留存率等。</p> <p><strong>2)实验数据观测</strong></p> <p>亲自体验线上情况,同时观测每个对照组和实验组的数据表现。</p> <p><strong>3)策略复盘</strong></p> <p>实验设计是否合理,是否引入了其他变量,策略是否在线上生效,数据是否符合预期,用户对此需求的真伪,策略总结。</p> <h3>#作者#</h3> <p>大鹏,公众号:一个数据人的自留地。《数据产品经理修炼手册》作者。</p> <p>本文</p> <!-- Inline Paywall (Embedded in flow) --> </div> <!-- Copyright Notice --> <div class="m-article-copyright-notice"> <h3 class="m-copyright-title">版权声明</h3> <p class="m-copyright-text"> 本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 <a href="https://shimo.im/forms/N2A1gvJRpPh7K9qD/fill" target="_blank" rel="nofollow" class="m-copyright-report-link">举报</a> 进行投诉反馈! </p> </div> <!-- Publisher Card --> </div><!-- End m-detail-container --> </div><!-- End m-detail-content-wrap --> <!-- Footer Zone (Gray Background) --> <div class="m-detail-footer-wrap"> <div class="m-detail-container"> <!-- Related Articles --> <div class="m-related-section"> <div class="m-related-header"> <h3 class="m-related-title">推荐阅读</h3> </div> <ul class="m-related-list"> <li class="m-related-item"> <a href="/chanpinjingli/758249.html" class="m-related-link"> <span class="m-related-item-title">从原型到代码:AI如何重塑产品经理工作流</span> <span class="m-related-item-meta"> <span class="m-related-date m-time-ago" datetime="1770107238" data-time="1770107238">2026-02-03</span> </span> </a> </li> <li class="m-related-item"> <a href="/chanpinjingli/757595.html" class="m-related-link"> <span class="m-related-item-title">我眼中的产品 & 产品经理</span> <span class="m-related-item-meta"> <span class="m-related-date m-time-ago" datetime="1738402105" data-time="1738402105">2025-02-01</span> </span> </a> </li> <li class="m-related-item"> <a href="/chanpinjingli/755007.html" class="m-related-link"> <span class="m-related-item-title">Axure原型案例实战分享:如何改造后台产品架构及如何迭代更新升级现有的产品?</span> <span class="m-related-item-meta"> <span class="m-related-date m-time-ago" datetime="1725267192" data-time="1725267192">2024-09-02</span> </span> </a> </li> <li class="m-related-item"> <a href="/chanpinjingli/754903.html" class="m-related-link"> <span class="m-related-item-title">从入门到精通:产品经理的需求分析进阶之路</span> <span class="m-related-item-meta"> <span class="m-related-date m-time-ago" datetime="1724895066" data-time="1724895066">2024-08-29</span> </span> </a> </li> <li class="m-related-item"> <a href="/chanpinjingli/754891.html" class="m-related-link"> <span class="m-related-item-title">定制项目有多可怕?</span> <span class="m-related-item-meta"> <span class="m-related-date m-time-ago" datetime="1724732152" data-time="1724732152">2024-08-27</span> </span> </a> </li> </ul> </div> <!-- Comments --> <!-- Comments (Hidden temporarily) --> </div> <!-- Site Footer (Detail Page Only) --> <!-- Site Footer --> <footer class="m-site-footer"> <div class="m-footer-container"> <div class="m-footer-content"> <div class="m-footer-links"> <a href="/p/aboutus.html" target="_blank" class="m-footer-link">关于网站</a> <a href="/contactus.html" rel="nofollow" target="_blank" class="m-footer-link">联系我们</a> <a href="https://beian.miit.gov.cn" target="_blank" rel="noopener">浙ICP备14026978号-4</a> </div> </div> </div> </footer> </div> <!-- Teleport Template for Topbar Actions --> <div id="detail-actions-tpl" class="m-hidden"> <!-- Like --> <a href="javascript:;" class="m-btn-action m-btn-like btn-like has-count" data-action="vote" data-type="like" data-id="97688" data-tag="archives" title="点赞"> <i class="fa-regular fa-thumbs-up"></i> <span class="m-btn-action-count"></span> </a> <!-- Collection --> <a href="javascript:;" class="m-btn-action m-btn-collection addbookbark" data-id="97688" data-aid="97688" data-type="archives" data-action="/addons/cms/ajax/collection.html" title="收藏"> <i class="fa-regular fa-star"></i> </a> <!-- Comment --> <!-- Comment (Hidden temporarily) <a href="#comments" class="m-btn-action m-btn-comment has-count" title="评论"> <i class="fa-regular fa-comment"></i> <span class="m-btn-action-count"></span> </a> --> <!-- Share --> <a href="javascript:;" class="m-btn-action m-btn-share" title="分享"> <i class="fa-solid fa-share-nodes"></i> </a> <!-- Back to Top --> <a href="javascript:;" class="m-btn-action m-btn-totop" title="回到顶部"> <i class="fa-solid fa-chevron-up"></i> </a> </div> <!-- Hidden Share Content Template --> <div id="share-content-wrapper" class="m-hidden"> <div class="m-share-modal-body"> <div class="m-share-icons-wrapper"> <a href="javascript:;" data-url="https://private-origin.imspm.com/AIrengongzhineng/97688.html" data-title="关于新闻个性化推荐你不能不知道的4个部分" data-id="wechat" class="m-share-item m-share-wechat" title="分享到微信"><i class="fa-brands fa-weixin"></i></a> <a href="javascript:;" data-url="https://private-origin.imspm.com/AIrengongzhineng/97688.html" data-title="关于新闻个性化推荐你不能不知道的4个部分" data-id="weibo" class="m-share-item m-share-weibo" title="分享到微博"><i class="fa-brands fa-weibo"></i></a> <a href="javascript:;" data-url="https://private-origin.imspm.com/AIrengongzhineng/97688.html" data-title="关于新闻个性化推荐你不能不知道的4个部分" data-id="qq" class="m-share-item m-share-qq" title="分享到QQ"><i class="fa-brands fa-qq"></i></a> <a href="javascript:;" data-url="https://private-origin.imspm.com/AIrengongzhineng/97688.html" data-title="关于新闻个性化推荐你不能不知道的4个部分" data-id="link" class="m-share-item m-share-link" title="复制链接"><i class="fa-solid fa-link"></i></a> </div> <div class="m-share-modal-tip">点击图标分享</div> </div> </div> <!-- Page Specific Scripts --> <script src="/assets/addons/cms/js/typezen/article.js?v=1.0.57"></script> <!-- SEO: Structured Data (JSON-LD) for Article --> <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Article", "headline": "关于新闻个性化推荐你不能不知道的4个部分", "image": [ "https://private-origin.imspm.com/assets/addons/cms/img/noimage.jpg" ], "datePublished": "2023-07-23T07:41:19+08:00", "dateModified": "2023-07-23T07:41:19+08:00", "author": [{ "@type": "Person", "name": "超级产品经理", "url": "https://private-origin.imspm.com/u/0" }], "publisher": { "@type": "Organization", "name": "超级产品经理", "logo": { "@type": "ImageObject", "url": "/assets/img/imspm_logo.svg" } }, "description": "关于个性化推荐,我的理解是:按照每个人的喜好,在合适的时间、合适的场景、把合适的内容以合适的形式呈现在用户面前,满足用户的需求。那么这里就涉及到了三部分,用户—" } </script> <!-- Prism.js Scripts --> <script src="https://registry.npmmirror.com/prismjs/1.29.0/files/components/prism-core.min.js"></script> <script src="https://registry.npmmirror.com/prismjs/1.29.0/files/plugins/autoloader/prism-autoloader.min.js"></script> <script src="https://registry.npmmirror.com/prismjs/1.29.0/files/plugins/toolbar/prism-toolbar.min.js"></script> <script src="https://registry.npmmirror.com/prismjs/1.29.0/files/plugins/line-numbers/prism-line-numbers.min.js"></script> <script src="https://registry.npmmirror.com/prismjs/1.29.0/files/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script> <!-- Prism Config --> <script> document.addEventListener('DOMContentLoaded', function() { // Force line numbers and language class for FastAdmin/EditorMD consistency var pres = document.querySelectorAll('pre'); pres.forEach(function(pre) { // Add line-numbers class if missing pre.classList.add('line-numbers'); // If code doesn't have class, default to plaintext or try to detect // EditorMD usually puts inside code, checking... var code = pre.querySelector('code'); if(code && !code.className && !pre.className.includes('language-')) { code.classList.add('language-markup'); // Fallback } }); }); </script> </div> </main> <!-- Right Sidebar --> </div> </div> <!-- Scripts --> <script src="/assets/libs/jquery/dist/jquery.min.js"></script> <script src="/assets/libs/bootstrap/dist/js/bootstrap.min.js"></script> <script src="/assets/libs/fastadmin-layer/dist/layer.js"></script> <script src="/assets/libs/art-template/dist/template-native.js"></script> <script src="/assets/addons/cms/js/jquery.autocomplete.js"></script> <script src="/assets/addons/cms/js/cms.js"></script> <script src="/assets/addons/cms/js/common.js"></script> <script src="/assets/addons/cms/js/typezen/theme.js?v=1.0.57"></script> <!-- Mobile Nav --> <!-- Mobile Bottom Navigation --> <nav class="m-mobile-nav" role="navigation" aria-label="移动端导航"> <!-- Home --> <a href="/" class="m-mobile-nav-item "> <svg class="m-mobile-nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path> <polyline points="9,22 9,12 15,12 15,22"></polyline> </svg> <span class="m-mobile-nav-label">首页</span> </a> <!-- Search --> <a href="/s.html" class="m-mobile-nav-item"> <svg class="m-mobile-nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <circle cx="11" cy="11" r="8"></circle> <line x1="21" y1="21" x2="16.65" y2="16.65"></line> </svg> <span class="m-mobile-nav-label">搜索</span> </a> <!-- Categories (Trigger for Mobile Menu usually, linking to channel index for now) --> <a href="/[:diyname].html" class="m-mobile-nav-item"> <svg class="m-mobile-nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <line x1="8" y1="6" x2="21" y2="6"></line> <line x1="8" y1="12" x2="21" y2="12"></line> <line x1="8" y1="18" x2="21" y2="18"></line> <line x1="3" y1="6" x2="3.01" y2="6"></line> <line x1="3" y1="12" x2="3.01" y2="12"></line> <line x1="3" y1="18" x2="3.01" y2="18"></line> </svg> <span class="m-mobile-nav-label">栏目</span> </a> <!-- User / Profile --> <a href="/index/user/index.html" class="m-mobile-nav-item"> <svg class="m-mobile-nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"></path> <circle cx="12" cy="7" r="4"></circle> </svg> <span class="m-mobile-nav-label">我的</span> </a> </nav> </body> </html>