相关搜索 --- 搜索中的推荐

0. 前面的瞎扯淡

互联网从开始出现,若是就信息获取方面的话,到如今经历了三个大的时期,最开始是人工信息的分类时期,做为一个上了岁数的人,是经历过那个时期的,那个时期如何来找信息呢?咱们来看看几张图,下面这张图是1999年1月的搜狐主页,中间那一片就是人工整理出来的分类。python

图片描述

若是咱们点击其中的科学与技术,将看到下面这张图,这张里面就有跟多的细分类了算法

图片描述
若是咱们继续点击计算机科学,能够看到下面这个网页,这里就是一个一个的网站了,你看,一共才22个,可见那时候的信息量多么缺少。数组

图片描述
这些都是人工整理出来的,这也是上个世纪和本世纪初最初的互联网了,你们都是在这种人工整理的网站中经过分类找到本身想要的信息。微信

后来,搜索引擎出现了,出现了第二个时期,那就是经过关键字在全网检索信息时期了,这种分类的检索方式天然就淘汰了,我想全部人都经历着这个时期吧,典型的就是谷歌和百度了。cookie

再到如今,已是一个信息过载的时代了,搜索已经不能很好的找到信息了,更多的是须要机器帮咱们发现咱们感兴趣的信息了,因而出现了搜索将死,推荐上位的论调,这个时期就是信息发现时期了,主要靠推荐引擎来帮助咱们发现信息了,特别和移动端一结合,以前双手啪啪啪的打击键盘检索信息,变成了大拇指唰唰唰的刷新手机屏幕了。架构

好了,上面扯了这么多,今天咱们要说的主角---相关搜索,就是一个在搜索系统下的推荐系统技术了。app

1. 什么是相关搜索

仍是老路子,什么是相关搜索,很简单,下图这个是相关搜索,我搜索分形的时候给个人推荐词机器学习

图片描述

2. 相关搜索有什么做用

相关搜索的做用也很明显,能够提升用户的搜索体验,当你经过一个关键词没法找到你想要的东西的时候,相关搜索极可能能帮到你,和搜索提示不一样,搜索提示主要用的前缀匹配的模式,关注的是你尚未点击搜索键的时候猜想你想搜什么,而相关搜索是你点击搜索键之后猜想你可能还想搜什么,因此相关搜索更加相似于一个推荐系统。oop

相关搜索的点击率仍是比较可观的,若是相关搜索作得好,经过相关搜索的一些引导,能够帮用户更准确的找到想要的东西。学习

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或者搜索西加加语言就行

图片描述

相关连接:
基于用户的协同过滤
文本类似性计算