转载理由:去年面试的时候,被问到相关问题,之后查了一些资料,没有什么收获,今天不小心看到,挺受启发。
转自:http://www.wumii.com/topbar/mSzZftie
看到知乎有这样的问题,如何做词聚类,恰好我以前做过,但是想想内容太多,还是单独写一篇说一下。
首先,如果单纯拿出一堆词就让我分类,这个我真做不到,我不知道有没有人能做到,反正我做不到。做关键词分类,对我而言,一定有一些基础信息,基础数据作为背景。
案例1:百度商业词聚类模型
现在看新闻,大家经常讨论一个话题,百度医疗行业的收入贡献比是多少,其实,我爆个大料给大家,在2005年甚至2006年之前,百度自己都不掌握这类数据。
当时百度有一个简单的客户分类,是客服提交的,然后我们看了一下消费的行业分布,结果显示超过50%属于其他分类,这个结果基本上就没法看了。
然后我就琢磨,用商业词能不能直接聚类为行业,当时我在产品部门,合作反欺诈点击的工程师是张怀亭(此人似乎现在还在百度),这是个算法高手,他当年的毕业论文就是关联规则和聚类算法,我就去请教他,他说了一堆,我大部分没听懂,但大概要点知道了一些,然后找他要了论文看了看,也没太看明白,凭借自己粗浅的理解我就动手了,然后这个还真做成了。
出发点是 假设客户本身具有行业属性(如果这个假设不存在,那就没辙了),我认为每个客户提交的关键词,彼此是有关联的。某两个关键词如果同时被不同的客户提交,其关联性就会随之增加,这个是最基本的一个定义,叫做共同推举数。也是最容易算的一个值。
但是仅仅依赖于共同推举数有一个问题,就是会导致很多词都和热门词关联,这是不合理的,我记得当时好像是某网上书城的推荐购买那一栏,明显都是热门书籍,似乎也是基于共同推举数做的关联。
问题1:A和B有50个共同推举,A和C有30个共同推举,但是B这个词是热门词,共有2000个客户提交;而C是冷门词,只有50个客户提交,请问A和B的关联度高还是A和C的关联度高?
问题2:客户1 提交了10000个词(类似阿里,中青旅真的是这么提交的);客户2提交了20个词,客户1所提交的10000个词的彼此关联度和客户2之间提交的是否一致?
考虑这两个问题,做权值调整,(其实我记得还有一个权值,很久的事情了,搞不清了)然后计算词与词的关联值。
那么,权值怎么定? 呵呵,实话说,拍脑袋,不过拍完了要校验。
实现程序只用了不到一个下午,然后跑一遍程序大约1个小时到2个小时(那时候百度的商业词还没那么多,客户也没现在呢么多,我的程序其实效率不够好)。然后我做了一个web展示界面,就是任意输入一个词,列出其关联词及关联值,目测坏案例,分析参数的问题,然后修改参数,再跑一遍。。。 跑了n多遍,大约两三天时间,觉得结果差不多了,词与词的关联建立起来了,考虑第二步,聚类。(当时认识了很多奇葩的商业词,大开眼界,对互联网行业认识彻底改观,比如白小姐,黄大仙,咳咳、咳咳,这个领域就不能再说了)
聚类的想法极为简单,把每个行业的代表词(与很多词关联的)抽取出来,当作核心词,然后基于词的关联(延展一级关联、二级关联、三级关联,比如A与B关联,B月C关联,C与D关联,计算彼此权值衰减,得出A与D的关联)。尽可能把所有词聚合到核心词上,作成行业词表。
最开始核心词我从库里挑与其他词关联度较高的有20多个,然后多级权值衰减也是拍脑袋想的,然后跑一遍,看两个指标,第一、覆盖率是多少;第二、准确率如何,选取每个行业关联度最低的词(坏案例的密度较高,有些词会同时被两个行业核心词关联,但权值计算会出问题,导致被并入错误的行业)去看,选择没有被关联上的词去看,分析权值的问题。然后修改衰减参数,增加核心词。这个程序我也是写了一个下午,但是调试权值和增加核心词,干了一个礼拜。
然后,百度商业分析部终于可以推出,基于行业的收入报表。我自豪的说一句,百度做收入行业分布,是基于我的关键词分类算法开始的,当然,今天他们鸟枪换炮了,我的算法效率不够(初期还行,到更大的词规模和更多客户就不行了),覆盖率和准确度并不十分完美(坏案例还是一直存在的,不过尽可能控制在消费总额的10%以内,对热门词比较准,但对一些长尾控制不住)。不过、我是在产品部门干的这个活,呵呵。
后来,这个模型还用于智能起价。下面说一下智能起价的八卦。
智能起价其实是百度一个失败的商业尝试,对业务的伤害非常大,但是初期的设计理念并没有大问题,百度当时基于关键词的竞价(当时的竞价模式非常简单,别跟我说现在百度的竞价模式不这样,我明白),对商业价值的挖掘是有缺陷的,比如一些超级热门词,3毛一个点击也是卖不掉的(比如电影,小游戏)。是不是可以便宜点卖呢?对一些非常长尾但是价值很高的词,因为发现的客户少,所以起价很低,而其商业价值并不弱,比如 “最新型绿色干洗机报价” 这样的长尾词可能参与竞价的只有一两个客户,但是其商业价值不会低于“干洗机”这样的高价词。所以,智能起价真正的目的,是给热门非商业词降价,给冷门长尾商业词提价。 那么我就提出一个观点,关键词的起价应与他关联词的平均点击价格相关。然后他们拿这个模型去跟领导讲,很快就通过了。(牢骚一句,赵某童鞋去讲的,被领导问毛了,就说算法是技术部门的,他也不是很清楚,他去讲的时候明明是我提供的原型! 不过后来技术部门又做了一版,但那是后话了。) 智能起价模型失败的原因,有两个原因,第一,他们上的时候为了提高对非商业词的覆盖率,硬把关键词包含规则加上去了。导致了一些坏案例。(比如平板,平板电脑,并不是一个行业)。当时效果很不好,领导很不爽,批评我的坏案例太多,列了一堆,我挨个去查,所列的没有一个是我算法算出来的,都是词包含包进去的。其实这个问题还不算严重,词包含固然有坏案例,但是影响面极为有限;第二个问题更严重,就是领导太急迫了,这个事情我的建议是,起价权值低一点(通过算法计算每个词关联平均价格,然后关联平均价格*起价参数=该词起价,这是基本公式,起价参数全凭个人判断),看效果慢慢调整,结果领导一上来设的相当高,所以,客户极大不爽,各种擦屁股持续了几个月。百度那个季度实在可怜。
凤巢之后,智能起价终于寿终正寝。凤巢的方案更完美,更综合,这是必须承认的。
案例2:搜索词/指数词的聚类
当然,也可以基于搜索网民的提交来计算关联度,但是首先,网民的搜索行为,并不如客户提交商业词行为那样具有分类属性。其次,我当时的处理能力也搞不定这样的数据规模的关联计算。(好吧,现在也不大搞得定。)
那么基于什么呢?基于关键词+搜索量。
这事又是张怀亭帮忙,我在百度合作最多的工程师就是怀亭,当时他帮我做所有搜索记录的整理,包括汇总和反刷处理(除了一些ip,客户端标记清理外,最重要的还有一个规则,是基于渠道分布和客户端分布规则,正常的搜索词,来自于不同渠道的比例应该是遵循一个合理分布比例的,所谓渠道包括百度官网,hao123,其他联盟渠道等等,如果严重不遵守这个比例,基本就是刷指数了,但这个规则没有应用到百度指数上,至少当时没应用到,原因似乎是这样的,当时几乎所有榜单上的热门女星,似乎都有经纪公司或粉丝团的刷榜行为。)所以当时我手里有百度所有搜索词的搜索数据(清理掉刷指数的数据),而且每日更新。
那么怎么分类呢?如果做全分类,我真做不到,但是热门词是可以做的。这里有一个要点,就是每个热门关键词,都不是孤立存在的。而这些热门词的相关词(基于词包含)里,会携带一些表明其行业属性的词根,然后可以回溯这个热门词的行业属性。(对了,我上面不是说词包含有坏案例么,咳咳,这个,别求全责备。只有词和搜索量,还要做分类,有些坏案例也只能手工调整了。)
举例,
一个热门游戏,比如 神仙道, 会有大量诸如 神仙道攻略, 神仙道新服,神仙道道具,神仙道外挂 等等相关词。通过这些相关词的词根(可以对词根标记分类属性)回溯原词,以及原词所有相关词的分类。比如电视剧,常见词根有 “第**集,最新集。”,一个小说,常见词根有“第**章”,“最新章节” 等。
当然,还有一个情况,有些词是多含义的,比如典型如苹果(IT产品,电影,水果)。武林外传(电视剧,游戏)等。通过词根的分析,并基于不同词根下的搜索量加权,得到该词的搜索属性,偏向哪个领域,或各个领域的比例,是的,不是很精确,但是还是有一定价值的。
实现方法就是,针对每个未分类的热门词,去遍历包含他的所有词,然后基于预先定义的分类词根去套,对包含每个分类词根的长尾词根据搜索量加权,汇总,得到该热门词的分类属性,以及覆盖包含该热门词的所有长尾词的分类属性。
这个算法思路,不适合对长尾词挖掘(含有行业属性词根的长尾词可以覆盖,但是毕竟覆盖率不够),但是对百度热榜可以有很好的帮助,对热门词的挖掘和自动分类还是有一定把握的,当时不少人抱怨我说百度热榜更新不及时,一些新游戏都很火了也进不了热榜,我就拉着百度热榜的产品经理和技术分享过,还提供过原型代码,然后也没有然后了。
至少当时,我能不断看到网民搜索行为的分类比例(百度长尾词太多,我的模型覆盖搜索量只有50%左右),以及变化趋势,比如眼看着视频类的搜索比例快速增长。
又是一篇自吹为主的文章,那个,啥也不说了,您凑活看吧。