关键词推荐是来公司的第一个项目,虽然时间不长,但是时隔四年回头看看,有很多东西还是历历在目,作为总结的第一篇文章,写到这里就能想起海波、幼乐对我的指导,感慨万千;
主要从三个方面来讲,背景、业务还有架构来说:
背景:
为什么要有关键词推荐?首先需要解释关键字是什么?举个例子:小明(网民)要买鲜花送个自己的女朋友作为情人节礼物,但是他上班没办法去选花,所以他上了百度,搜索“张江鲜花快递”(关键字),找到一家合适的鲜花店(广告主),买了花送给了女朋友,在这个过程中,小明足不出户满足了自己的需求,获取了便利性;鲜花店获得了小明这个用户,卖出了一束鲜花,获取了利润;同时支付一定的报酬给百度,百度作为平台来说,方便了大家也获取了利润,这是一个三方共赢的系统,而在这个系统中,关键字作为桥梁,发挥了重要的作用;
因为网民和广告主的背景差异巨大,网民的述求成千上万,而广告主不可能也没有必要了解网民的所有述求,所以需要一个系统帮助广告主能够快速方便有效的找到他所需要的关键词,这个系统就是关键词推荐;
业务:
从业务逻辑来看,关键词推荐分为主动推荐和被动推荐;
被动推荐是什么?
被动推荐表示推荐方式不是和这个广告主相关,是通用的推荐策略,主要的策略可以分为:字面推荐和网页推荐,说简单的前者就是输入一个词然后给一堆推荐词,后者就是输入一个url给一堆的推荐词;
字面推荐
字面推荐主要是根据词来进行推荐,既有包含关系的推荐也有语义关系的推荐,举个例子:从字面来看,张江鲜花快递和鲜花快递是字面相关的,因为这是个包含关系,从语义来看:丈夫和老公是语义相关的,这些都是通用的,因为不管在哪种情况下,这些都是可以成立的,字面推荐是基础模块,主要是算两个词的相关性,是所有推荐策略中最基础和最核心的;
协同推荐
协同推荐主要是通过搜索关系来进行推荐,就是最著名的哪个啤酒和尿布的故事,搜了啤酒的人往往也会搜索尿布,通过算关键词的网民相似性,将相似性较强的关键词进行聚类,从而得到相关性词表,同时还得到了权重;
网页推荐
网页推荐的方式类似,只是不是纯粹根据字面来进行分析,会把网页抓取下来,获取核心区域,切词再根据权重获取最重要的词来进行推荐,(dom树解析、切词等以后再讲),其实目标还是根据广告主的网页来获取词,然后直接推荐这些词,因为网页上代表的信息往往是最能代表客户需要的,只要去掉高频词留下的一般都是还不错的词语;
其他一些被动推荐
其他还有一些,比如:词群,词群有很多种聚类方法,举个例子,所有网民都有一个搜索序列,比如小明搜索了“鲜花”,在搜索“鲜花快递”,再搜索“张江鲜花快递”,我们将搜索序列进行聚类,搜索的位置就是优先级,最后就会得到一个最简单的词包,搜索了鲜花的人,下一步最有可能搜索哪些词语,这就是一种推荐方式;
主动推荐做些啥?
主动推荐不需要输入关键词,也不需要输入url,因为这些系统都是系统里面有的,主动推荐根据广告主来自动推荐:
按竞争激烈程度来进行推荐:
主要是为了解决资源利用不足的情况,因为广告主的知识面是有限的,所以他们的选词策略会导致热门资源利用率特别高,但是大部分的词都是利用率不高,通过计算不同关键词的出广告条数长度,将出广告条数少的关键词优先推荐给广告主,会保证平均的出广告条数增加,从而提升整体的利用效率,这个是根据广告主的自身条件来出的,如果广告主自身的预算不足,那么可以将钱都花在刀刃上,用于这些词上;
交叉推荐:
这里主要是指按购买关系来推荐,我们假设广告主的知识背景不一样,某些广告主的能力很强,大部分广告主的能力都是中等偏下,这个时候能力强的同学总能很快很好的找到想要的关键词,我们也不能不帮助后进的同学吧,怎么做了?在历史经验上,我们去分析两个广告主的小四度,包括搜索词,包括账户结构,我们认为具有较高相似性的两个账户或者计划或者单元,在新的行为上也是类似的,如果一个账户买了一些新的词,这些新的词,对他类似的账户也有很好的借鉴性,这个就是交叉推荐;算相似性最简单的办法,用plsa来计算就好了;
行业推荐
行业推荐和一般的主动推荐不一样,算是一个组合推荐策略,主要分为行业识别、行业推荐、相关性排序:行业识别主要是根据广告主的历史信息包括一些已购词、广告主的网页信息、广告主的主动输入来判断广告主的细分行业,中间包括网页解析、切词、行业识别等一些基础服务;行业推荐主要是推荐策略,一般是构建体系表、标注数据、多分类训练生成模型、对有价值词表(高pv,高消费或者一些其他的属性)跑模型,生成推荐词表(以后文章会具体讲行业相关的);过滤筛选主要是考虑到行业细分的不够细,所以通过语义相关性分析(如plsa),对推荐的词和广告主的历史词进行相似性排序,并根据阈值进行截断,从而得到一些相关性较好的关键词;
业务还要讲两个,一个是初始的策略,一个是结束的策略,初始的策略主要是指如何将检索的行为如何进行分拆或者抽象,结束的策略主要指的是如何将结果按照最好的效果返回:
初始策略:
初始策略主要是指将长的检索词进行切词以提取更多特征,获取地域信息、时间信息,出广告策略(精确、短语、广泛),这些是用来做推荐的前提条件,是基础;
过滤策略:
在所有词获取之后,要通过一些常用的过滤策略,将不好的词过滤掉,较常见的过滤包括:黄反毒、PV、消费、地域过滤等;
系统架构:
这是第一个系统,系统的常用设计策略基本都展现在里面,分层,分模块:
最上面是一个switch,可以将请求进行转发,通过这个可以自由的扩展系统同时还可以设置小流量实验;
然后是主程序:包括上面说的初始策略、推荐策略、过滤策略,多线程,然后是串行结构,不同的初始策略、过滤策略、推荐策略通过adpater的方式实现,通过配置来实现不同adpter的开关;
下面是各个模块,每个模块单独部署,如果性能不够就部署多台;
总结:
主要的问题当时觉得性能优化,因为各种策略很多,而且是个串行的结构,依赖的外部模块太多,导致整体的逻辑比较长,会导致一次访问比较慢,中间还做了一次主动推荐优化,就是将实时的查询变成静态的数据查询来提升性能,总的来说,学到了挺多东西,来百度之前,面试最常见的问题就是大规模数据查询,我的答案就是分而治之,这个项目做完,基本上能够明白具体分而治之是怎么做了,也了解和明白了大部分的策略是怎么做的,算上打了一个还不错的基础;