0. 前面的瞎扯淡
互联网从开始出现,如果就信息获取方面的话,到现在经历了三个大的时期,最开始是人工信息的分类时期
,作为一个上了岁数的人,是经历过那个时期的,那个时期如何来找信息呢?我们来看看几张图,下面这张图是1999年1月的搜狐主页,中间那一片就是人工整理出来的分类。
如果我们点击其中的科学与技术
,将看到下面这张图,这张里面就有跟多的细分类了
如果我们继续点击计算机科学
,可以看到下面这个网页,这里就是一个一个的网站了,你看,一共才22个,可见那时候的信息量多么缺乏。
这些都是人工整理出来的,这也是上个世纪和本世纪初最初的互联网了,大家都是在这种人工整理的网站中通过分类找到自己想要的信息。
后来,搜索引擎出现了,出现了第二个时期,那就是通过关键字在全网检索信息时期了
,这种分类的检索方式自然就淘汰了,我想所有人都经历着这个时期吧,典型的就是谷歌和百度了。
再到现在,已经是一个信息过载的时代了,搜索已经不能很好的找到信息了,更多的是需要机器帮我们发现我们感兴趣的信息了,于是出现了搜索将死,推荐上位的论调,这个时期就是信息发现时期了
,主要靠推荐引擎来帮助我们发现信息了,特别和移动端一结合,之前双手啪啪啪
的打击键盘检索信息,变成了大拇指唰唰唰
的刷新手机屏幕了。
好了,上面扯了这么多,今天我们要说的主角---相关搜索
,就是一个在搜索系统下的推荐系统技术了。
1. 什么是相关搜索
还是老路子,什么是相关搜索,很简单,下图这个是相关搜索,我搜索分形
的时候给我的推荐词
2. 相关搜索有什么作用
相关搜索的作用也很明显,可以提高用户的搜索体验,当你通过一个关键词无法找到你想要的东西的时候,相关搜索很可能能帮到你,和搜索提示不同,搜索提示主要用的前缀匹配的模式,关注的是你还没有点击搜索键的时候猜测你想搜什么,而相关搜索是你点击搜索键以后猜测你可能还想搜什么,所以相关搜索更加类似于一个推荐系统。
相关搜索的点击率还是比较可观的,如果相关搜索做得好,通过相关搜索的一些引导,可以帮用户更准确的找到想要的东西。
3. 如何来考虑相关搜索
如果我直接告诉你相关搜索
的技术栈和算法,然后告诉你都用什么架构来实现,那没什么意思,特别是与算法有点关系的系统,为什么要用这些东西,通过一种什么思路来考虑能得到这个算法和架构,这才是设计一个系统所必须的,我们一步一步来看看如何设计一个相关搜索
的系统。
3.1 系统的输入输出
很简答,相关搜索系统的输入为用户的搜索词,而输出是一堆与这个词相关的其他词。
3.2 输入和输出之间的关系
从我们上面图看到的情况和大家自己脑子想的情况,最基本的情况是,输出的词最好是输入词的近义词,这是大家都能考虑到的,但这远远不够,首先要想想相关搜索的作用,是让用户更多的点击推荐出来的词,如果仅仅是近义词点击率肯定上不去,再扩展一点,就是要通过用户输入的词为基准,帮用户发现更多的和他的意图相关的词
。
3.3 如何来找到输入输出的关系
要找到输出的词和输入的关系,我们先要看看我们有什么数据,没有数据啥都干不了,首先,如果是近义词的匹配,我们有词典,但是这东西然并卵,没有什么用户输入的词正好在你的词典中,即便有,词典中的近义词也少得可怜。我们还有什么呢?还有的就是用户行为了,包括用户的搜索记录和点击记录,浏览记录,OK,在这上面大有文章可做。
通过用户数据,我们可以做以下简单的考虑。
首先,从人的角度来考虑,如果你搜索一个词,发现没有你想要找的东西,你首先想到的就是换一个词,这个词可能是近义词,可能是个更复杂的词,比如你搜索
苹果电脑
,你发现结果不怎么好,你自己会把搜索词改成apple笔记本电脑
,然后找到你需要的东西,这个apple笔记本电脑
就是你这次搜索行为中苹果电脑
的后继词
了,所以这种行为是我们可用的,这相当于让用户帮你找近义词。还有,从搜索词本身来考虑,如果某些词搜索出来的结果有很多交集,那么这些词很可能也是有关系的。
再有,从搜索结果集来考虑,如果某个搜索结果(比如一个网页或者一个商品)出现在了不同的搜索词的结果集中,那么这些个搜索词很可能是相关的,如果这个搜索结果在不同的搜索词下都被点击了,那么这些个词的相关性就更高了。
除了上述的几个办法,还有很多其他的办法找到相关搜索词,这里我们就不深入了,大家可以自己想一想还有什么其他办法来找输入和输出的关系。
好了,上面我们已经想到了几种办法来找到输入和输出之间的关系,下面我们来一个一个来看看如何进行实现。
4. 确定算法模型
既然已经确定了找相关词的思想,那么我们接下来看看如果来实现这些个算法吧,下面说的东西都是很基础的,没有涉及什么数学原理,实际的工作中还是有一些技巧的。
4.1 纯后继词
后继词是一次用户的搜索行为产生的,那么如何定义一次搜索行为
呢?很简单的办法就是我们把用户在5分钟内输入的搜索词定义为一次搜索行为
,这也很好理解,你搜索一个词,发现没找到你要的东西,你换词一般也在一分钟之内,你不太可能搜了一个词,然后冥思苦想了半个小时,再换一个词,那得多蠢的人才能干出来啊。
有了搜索行为的定义,那么把搜索日志拉出来,搜索日志一般长成这样子
key:搜索词 time:搜索时间 cookie:用户cookieid result:a,b,c,d,e(前5个搜索结果)
首先按照用户进行分类,然后按照搜索的时间间隔(5分钟)进行数据的清理,把搜索日志整理成这样子了,表示某个用户的搜索后继词,三个数组表示多次搜索行为,每个数组的第一个词就是当次搜索行为的第一个搜索词。
cookie:用户cookieid keys:[A1,A2.....] [B1,B2.....] [C1,C2.....]
光有了这个还不够,因为对于单个用户来讲,搜索后继词的准确性还是不够的,因为你有可能上一秒搜索的苍老师
,后一秒发现老板站你后面了,立刻把搜索词改成了社会主义核心价值观
,你说这两个词能有相关性么?所以我们还需要把多个用户的后继词合并起来,加入一点统计规则,去掉一些杂质,比如某个词B只有出现在5个用户的相同的搜索词A的后继词中才算一个A的后继词,还有其他的一些规则,这么下来,日志就变成了。
key:A succeed:A1,A2,A3.....
好了,至此,就完成了原始日志到后继词表的转换了,很简单把,就是几个hadoop作业一跑就搞定了,如果日质量不大的话(20G以内),单机跑都没问题,如果是python,代码估计不超过100行,就是这有100行代码,你已经完美的运用了大数据
了,呵呵。
通过这种算法,比较容易找出这样的后继词出来,因为用户的后继搜索词基本上是前一个搜索词对应的长尾词
史记 : 史记中华书局 | 史记白话版中华书局 | 史记文言文白话对照 。。。。
4.2 加点用户的料
你再仔细想想,如果我们的搜索日志足够多,那么可以把相同搜索记录的用户聚合起来,变成类似下面的数据格式
某些用户:三国志 后继词:资治通鉴 | 三国志 白话版 | 二十四史
某些用户:史记 后继词:资质通鉴 | 史记 白话版
某些用户: 二十四史 后继词:资治通鉴 | 中国历代政治得失
如果出现了上面的情况,就变成了一个用户的协同过滤算法了,那么可以给史记
推荐中国历代政治得失
了,具体协同过滤算法看文章最后的链接。
4.3 从搜索词来考虑
上面是从用户的行为来考虑问题,如果我们从搜索词来考虑问题的话,如果某些搜索词有着相同的搜索结果,那么我们认为这些搜索也是相关的,如何来确定相关性呢?我们还是从搜索日志来入手。
key:搜索词 time:搜索时间 cookie:用户cookieid result:a,b,c,d,e(前5个搜索结果)
这次,我们只用key和result两项,稍微处理下来以后就变成了
key:搜索词A result:a,b,c,d,e(前5个搜索结果)
key:搜索词B result:a,f,c,g,m(前5个搜索结果)
如果我们把每一行数据的result想象成一篇文档,result里面的每个结果集想象成一个词语,那么这其实就是求两个文档之间的相似性了,从头到尾过一遍就可以找到每一行数据和它最相似的数据了,而每一行可以用当行的搜索词表示,这么一算下来数据就变成这样子了,后面的括号里面是两个词的相似度,如果想知道文本的相似性如何计算,可以参考我之前的文章,本文最后有链接。
key:搜索词A succeed:搜索词B(0.8) 搜索词C(0.6).....
key:搜索词B succeed:搜索词A(0.8) 搜索词E(0.7).....
有了上面这个数据,拍一个阈值(比如0.7)卡一下,就得到最后的相关搜索的结果了。
这个计算相似性的方法的计算量比较大,而且阈值没有卡好的话容易出现不相关的结果,在实际工程应用中使用得不多,下面这个方法使用得更多点,相当于这个的加强版。
4.3 从结果集考虑
如果某个搜索结果(比如一个网页或者一个商品)出现在了不同的搜索词的结果集中,那么这些个搜索词很可能是相关的,如果这个搜索结果在不同的搜索词下都被点击了,那么这些个词的相关性就更高了。
点击的加成是很强大的,而且在数据量巨大的情况下,我们可以只考虑点击的情况,还是拉出搜索日志,不过这次是搜索点击日志了,拉出来处理一下就变成下面这个样子,每行就是某个搜索词下点击的商品
key:搜索词A click:结果A 结果B 结果C
这个样子和上面第二种方法最后出来的样子基本一样,不过这次是点击数据,相关性可比直接的搜索结果要好很多了,因为搜索结果取决于你的搜索算法,而这种点击数据是来自用户的,人的可靠性可高了不少,所以说这个是上一个的加强版。
我们可以按照上一个的方法按文本相似性的方法进行处理,但是计算量也比较大,如果再仔细看看这个数据的样子,如果我们把相关搜索系统想象成豆瓣
,搜索词看成豆瓣的用户
,搜索结果集看成是豆瓣的电影
,那么相关搜索就变成了一个豆瓣的猜你感兴趣的人
,也变成了一个协同过滤的推荐系统了(协同过滤算法可以参考文章最后的链接),上一节的协同过滤算法的数据是词和后继词
,这里是词和点击结果
,虽然数据集不同,但是可以用一样的算法,所以,搜索和推荐技术其实是密不可分的,既然这样,完全可以用协同过滤算法进行推荐了。
协同过滤的算法,简单版本整体不会超过200行,很容易实现的。
通过这样的方式,容易推出意思相近的词,同样也容易推出看似完全不相关但仔细想想还是靠谱的词,就像下面这样,他们虽然不见得近义词,但是很可能会点击到同一个结果上。
分形 : 分形理论 | 分形图像 | 分形数学
机器学习 :吴恩达 | 数据挖掘 | 机器学习 周志华
林心如 :霍建华 | 任重 | 何润东 .......
4.4 机器学习
既然上面提到了一下机器学习,其实还有更高端一点的算法,就是用机器学习了,呵呵。我们如果把上面的结果key:搜索词A click:结果A 结果B 结果C
处理一下,变成下面的样子,表示每个结果集对应的搜索词。
结果A : 搜索词A 搜索词B 搜索词C....
结果B : 搜索词B 搜索词A 搜索词D.....
变成上面这个样子难度不大吧,就是做个倒排就行了,好了,我们把一行看成一篇文档,每个搜索词看成一个词,不就是求各个词的相似性嘛,祭出神器Word2Vec
,直接计算每个搜索词的词向量
,然后计算各个词向量之间的相似性,就可以算出每个词应该推荐的词了。
在这里,我们使用了当前最火的机器学习
哦,如果用word2vec
的库来实现的话,代码同样不超过20行,呵呵,word2vec
我之前的文章也有说过,可以看看底部的链接
4.5 还有其他吗
上面说了4个方法进行相关搜索的推荐,还有其他的吗?只要你肯想,那必然还有啊,比如有些搜索词很长尾,像龙门书局高中物理习题黄冈小状元
这种词估计没什么人搜吧,给他做推荐就比较难了,那么如果给他做相关推荐呢?可以找出中心词来,这里的中心词应该算是高中物理习题
吧,相当于把这种长尾词按中心词去推荐,如果找中心词呢?这又是一个话题了。
所以别看一个小小的相关搜索系统,要考虑的东西还是很多很多的。
5. 模型MIX
上面说了四种模型,如果使用呢?呵呵,相关搜索不是有很多词嘛,很简单拉,每个模型分几个词,看看哪个模型效果好,哪个模型出来的词用户点得多再调整呗,我们看看京东,搜索资治通鉴
的时候他们的相关搜索如下。
我估计啊资治通鉴 中华书局
,资治通鉴 柏杨
这种就是第一种模型推出来的,就是后继词部分推荐出来的,而史记
,二十四史
这类应该就是通过协同过滤推荐出来的,至于是哪种协同过滤就不好推测了。
6. 总结
总的来说,相关搜索
一类结果是为了更准确的找结果
一类是为了扩展搜索,找到更多的东西。
既然这样,就会出现两类相关的技术,当第一类需求,为了更准确的找结果,可以用到搜索系统的query分析上,也可以用来影响搜索结果的排序,为了更好出搜索结果,让搜索系统不断进化。
二第二类属于query的扩展,可以用在搜索广告系统中,广告的结果集一般是没有搜索那么大量级的,所以同样的搜索词,很可能有搜索结果但是没有广告结果,这怎么能忍,如果我们能把搜索词多扩展一点,同样可以推出相关的广告,虽然相关性没有那么强,但至少出来了,出来了就有人点,有人点就有收入啊。
一个小小的相关搜索,用到了不少推荐技术,而进一步把相关搜索做好,可以反馈给搜索系统本身,也可以用来提升广告系统的效果,所以说搜索,推荐,广告永远是分不开的,不管是底层的技术,还是底层的数学模型,还是上层的技术产出,都是可以共用的。
本篇就到这里,后面还会继续相关搜索,主要就是聊聊相关搜索的技术架构和实现方式了,本篇所说的算法模型都是最最基础的,并且在实现的过程中并没有我上面说的那么容易,好像几百行代码就能搞定似的:)实际上相关搜索要是做还是可以做得很深入的。
如果你觉得不错,欢迎转发给更多人看到,也欢迎关注我的公众号,主要聊聊搜索,推荐,广告技术,还有瞎扯。。文章会在这里首先发出来:)扫描或者搜索微信号XJJ267
或者搜索西加加语言
就行
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。