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

article/2025/9/18 12:32:14

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://chatgpt.dhexx.cn/article/L2Vlii02.shtml

相关文章

基于机器学习的搜索推荐系统

目录 一. 引言 1 二. 准备 2 一. 软件工程语言选择 2 二. 服务器的选取 2 三. 搜索服务 5 一. 搜索服务软件目录结构 5 二. 搜索服务功能 6 三. SPARQL语句分析 7 四. 经…

超好用的搜索引擎推荐

搜索引擎是我们信息资料搜集的最重要的渠道之一,用搜索引擎查找信息资料需要使用恰当的关键词和一些搜索技巧。目前国内主要的搜集引擎有如下10个,近期还有较多行业 型搜索冒出来,需找专业型行业资料可以使用行业型搜索引擎。 由于每个搜索引擎都有一定的局限性,可以把要…

搜索推荐相关

搜索算法 Learning to Rank方法: 1、单文档方法:根据query判断每个item的相似度 2、文档对方法:确定文档对的前后顺序 3、文档列表法:确定所有文档的先后顺序 Item:垂域、意图、语义相似性、item的热度、用户的搜索日…

推荐一个搜索引擎

yandex是一个俄罗斯搜索引擎。 https://yandex.com/ 最近很忙,月更。 水下文章。

ES-搜索推荐

1. 概述 搜索一般都会要求具有“搜索推荐”或者叫“搜索补全”的功能,即在用户输入搜索的过程中,进行自动补全或者纠错。以此来提高搜索文档的匹配精准度,进而提升用户的搜索体验,这就是Suggest。 ##四种Suggester 2. term sugge…

ul, li, a怎么用

<style type"text/css"> *{margin:0; padding:0;font-size:14px} body{padding-top:20px} ul,li{list-style: none} ul{background: yellow;} li{float:left; width:60px; height:50px;}//width:60px后加,不然ie li会比a宽 a{display:inline-block;padding:0 3…

html用ul li制作导航条

制作的导航条如图所示&#xff1a; 当鼠标滑过每个导航的时候&#xff0c;背景会变换颜色。技术点&#xff1a;将超链接a标签&#xff0c;转换成block标签&#xff0c;从而设置鼠标滑过时的背景色。代码如下所示&#xff1a; <html ><head><meta charset"…

HTML中的列表ol ul

<!DOCTYPE html> <html lang"en"> <head><title>列表</title> </head> <body><h3 style"background-color: rgb(102, 165, 165);">畅销图书榜</h3><hr/><!-- 有序列表 ol --><ol>…

ul及ol标签list-style-type介绍

ul及ol标签list-style-type介绍 1.ul/ol标签样式介绍 a.不设置ul中标签类型&#xff08;默认&#xff09;&#xff1a; 不设置ol中标签类型&#xff08;默认&#xff09;&#xff1a; b.设置方法代码&#xff1a; 在html中设置或者在CSS样式中设置 <style>#kl{list-s…

ul li 实例

之前使用过很多次的 ul li&#xff0c;不过都怎么规范&#xff0c;今天学习到一个整合“p、span、a”等标签的ul li实例&#xff0c;防止忘记&#xff0c;记录一下。 html代码 <span style"white-space:pre"> </span><li><h2>发明专利</h…

html中列表标签ul、ol、 dl的使用和介绍

一、UL列表介绍 ul 是无需列表&#xff0c;li列表里面的一条值&#xff0c;例如 <ul><li>中国</li><li>四川</li><li>成都</li></ul> 效果如下&#xff1a; 可以改变前面li的样式&#xff0c;通过给ul添加样式&#xff0c;其…

ul好看的li列表样式

以下是实际效果截图&#xff1a; 示例代码如下&#xff1a; <!DOCTYPE html> <html> <head> <style> .other-item-title{margin:10px 20px;padding:5px;line-height:30px;font-weight:400;border-bottom:1px solid #e8e9e7;color:#383937;position:re…

ul和ol的区别以及经验总结

一.ul是无序列表 网页中最为常见的列表&#xff0c;各个列表项之间为并列关系&#xff0c;没有顺序级别之分&#xff0c;如导航栏&#xff0c;新闻话题展示区等。 默认示例表现为&#xff08;默认带有实心圆&#xff09;&#xff1a; <ul><li>无序列表项1</li&g…

ul元素的使用

为了使网页更易读、排序有序、条理清晰&#xff0c;所以我们要学会ul元素——无序列表 效果图&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>元素的使用</title> </head&g…

为什么我们需要带上类型后缀?U/UL/ULL/L/LL

类型后缀 给变量赋值的时候分两个阶段。 第一步&#xff0c;如果没有指定字面量的类型&#xff0c;C99会找到一个能容纳字面量值的最小的带符号类型&#xff08;int / long int / long long int&#xff09;。 第二步&#xff0c;转换成左边变量类型并赋值。 long i 0xffff;…

IMX6ULL与IMX6UL异同(主要是优化了其成本:安全功能减低,优化功耗EMC SIM模块删除等与但和I.MX6UltraLite芯片是PIN-2-PIN兼容的)

I.MX6ULL相对于I.MX6UltraLite来说&#xff0c;主要是优化了其成本。与I.MX6UltraLite芯片是PIN-2-PIN兼容的&#xff0c;使的I.MX6ULL很容易在IMX6UL上重用&#xff0c;主要更改如下。 1. 增加了EPD显示支持与EPDC/PXP的低端电子阅读器&#xff0c;相对于6sl7d系列也是一个低…

论文阅读笔记(1)——《Ultra-Low Latency (ULL) Networks: The IEEE TSN and IETF DetNet Standards and Related 5G》

《超低延迟 (ULL) 网络&#xff1a;IEEE TSN 和 IETF DetNet 标准及相关 5G ULL 研究》 DOI&#xff1a;10.1109/COMST.2018.2869350 前言 IEEE 802.1 时间敏感网络 (TSN) 标准和相关研究旨在为 ULL 网络提供链路层支持&#xff0c;而新兴的 IETF 确定性网络 (DetNet) 标准则…

机器学习十大算法简介

本文对机器学习的常用算法进行常识性的认识&#xff0c;介绍这些算法是什么以及如何应用&#xff08;主要是针对分类问题&#xff09;以及对单个算法的理解的简介。本文要介绍的十大算法如下&#xff1a;①决策树&#xff1b;②随机森林&#xff1b;③逻辑回归&#xff1b;④SV…

常见的机器学习算法与人工神经网络

目录 1. 邻近算法K-NearesNeighbor (KNN) 1.1 KNN算法核心思想 1.2 KNN算法步骤 1.3 KNN预测分类 2. 图神经网络Graph Neural Networks (GNN) 2.1图的基本定义 2.2 图神经网络模型 3. 卷积神经网络Convolutional Neural Network (CNN) 3.1 CNN的结构 3.2 卷积 3.3 卷…

【KELM预测】基于粒子群算法改进核极限学习机(KELM)分类算法 matlab源码

一、核极限学习机 本文将介绍一种新的SLFN的算法&#xff0c;极限学习机&#xff0c;该算法将随机产生输入层和隐含层间的连接权值和隐含层神经元的阈值&#xff0c;且在训练过程中无需调整&#xff0c;只需要设置隐含层的神经元的个数&#xff0c;便可以获得唯一最优解&#x…