对搜索功能进行拆分,由流程框架到实现方法

本文希望将“搜索”这一功能点进行拆分,尽可能深入阐释本人对它的理解。同时,本文宗旨在于交流,若其中有不足或不准确的地方,欢迎读者批评指正。

对搜索功能进行拆分,由流程框架到实现方法

搜索流程框架

1. 产品视角

“搜索”功能对于前端用户仅是点击+输入+搜索,三步操作。但如何通过这三步,在海量内容中精准定位用户需求,是“搜索”功能的本质。

对搜索功能进行拆分,由流程框架到实现方法

基于本质需求的搜索功能扩展,其实可以很形象得概括为:如何满足以下几类用户的搜索需求。他们对于搜索功能的需求层级是如此完成深入递进的。

  • 用户1:我知道自己想要什么信息;
  • 用户2:我知道自己大概想要的是什么信息;
  • 用户3:我想要信息,但不确定具体哪方面;
  • 用户4:我现在不想要信息,但可以随便看看;
  • 用户5:什么都不想要,我也不会点进去的,别打扰我,谢谢。

2. 技术视角

满足并实现上述需求,光从产品视角拆分完全不够,更需要从技术角度理解搜索功能。我们可以将上图的几步继续拆分,具体的拆分流程框架可以参考下图。

对搜索功能进行拆分,由流程框架到实现方法

之后篇幅会按照这张搜索流程框架图的脉络一步步进行讲解。

点击搜索框

点击搜索框约等于在产品中找到搜索功能的位置,而搜索功能的位置主要是取决于产品本身对于搜索的依赖程度。由于相关交互的讲解,有大量成熟且优秀的输出,这里我就简单带一下。

比较常见的搜索入口设计方式有如下几种:

1. 位于页面顶部,导航栏中

搜索框为与页面顶部的导航栏中间,除了搜索框本身外,往往还有搜索ICON+暗文提示词+拍照或语音ICON。此类设计适合信息量较大,用户对搜索有强依赖需求的产品。

下图展示的产品分别为:拉钩、大众点评、携程

对搜索功能进行拆分,由流程框架到实现方法

2. 位于导航栏中,精简为放大镜ICON

精简过后的搜索入口相较于搜索栏弱化了不少,适用于已推荐为主搜索为辅的产品。此外,精简后省下的空间,可以放置其他功能模块入口,页面布局更加灵活。

下图展示的产品分别为:支付宝财富、人人都是产品经理、脉脉

对搜索功能进行拆分,由流程框架到实现方法

3. 位于页面底部单独的搜索模块

效果类似于导航栏中的搜索ICON,但较之有更重的业务侧重。将搜索与底部标签放在一起,强化用户对于搜索推荐页独立存在的认知,同时给到此页面承载复杂功能的心理预期。

在此页面内,往往会将搜索与推荐、筛选、信息流等功能点结合在一起。

下图展示的产品分别为:拼多多、绿洲、微博

对搜索功能进行拆分,由流程框架到实现方法

输入关键词

设计输入框或搜索页面时,核心思想就是帮助用户更快更好完成输入操作,其次是保留一定的运营能力或业务引导能力。

现在已有较为成熟的设计方案,可在用户输入关键词的过程中,通过微交互来达到目的。

1. 搜索栏内的引导暗文

现在采用通知栏搜索框中置设计的产品,往往都会在搜索栏中添加引导暗文。

它的作用主要有两种:其一,教育新用户可以搜索哪些关键词,熟悉搜索框的操作;其二,承担运营推广职能,将业务需要的内容置于搜索栏内,可有效提高用户的触达率。

下图展示的产品分别为:拉勾网、今日头条

对搜索功能进行拆分,由流程框架到实现方法

2. 搜索历史

搜索历史是用户之前手动输入并搜索过的关键词的汇总,点击后可直接跳转,普遍按照用户搜索的时间顺序进行排序。因为用户往往会重复搜索同一关键词,搜索历史功能可帮助用户更高效地完成操作。

由于在使用了一段时间产品后搜索历史可能较多,在超过了一定数目后便会收纳展示,或仅展示最近搜索的几个结果。同时搭配上搜索历史删除功能,一般有一键全部删除和逐条删除两种交互方式。

下图展示的产品分别为:天猫、微博、今日头条

对搜索功能进行拆分,由流程框架到实现方法

3. 热门搜索

热门搜索是一种辅助用户搜索的方式,当用户需求并不明确时,可以起到很好的引导效果。

一般热门中展示的内容可分为两部分:一部分为高频搜索词,便于用户决策;一部分存在一定的运营职能,将活动或是商品关键词作为热搜,提升曝光机会。

因此在设计时需要考虑到:

  1. 热搜是否具备运营能力;
  2. 运营位与真实热搜位的个数或占比;
  3. 热搜榜的排序规则;
  4. 是否需要增加其他交互元素(TAG、TAB、查看更多)。

下图展示的产品分别为:华为应用超市、微博、网易云音乐

对搜索功能进行拆分,由流程框架到实现方法

4. 限定范围的搜索

由于部分产品的业务线十分庞大,导致搜索结果内容的命中效果不佳。因此有些产品会选择在搜索动作之前完成筛选,这就是限定范围的搜索。

下图展示的产品分别为:马蜂窝、微信

对搜索功能进行拆分,由流程框架到实现方法

Query分析

用户输入关键词(Query)的过程中,系统会对用户输入的关键词进行分析,做出一系列操作,例如:纠错、改写、补全、近义词、模糊或实时搜索等。

这不仅能够帮助到用户高效完成搜索内容的正确输入,更对自然语言转化机器语言及信息索引提供了便利,对搜索结果的覆盖率和相关性至关重要。

以下介绍几种常见的Query分析方式。

1. Query纠错

根据用户输入的关键词(Query),搭配一些其他的可用信息,由算法判断用户输入的内容是否为错误关键词。

若判断为输入错误,则通过噪声信道模型猜测正确的关键词。将用户输入的关键词做模型输入,输出后得到猜测后的关键词。在前端提示用户选择或直接按照正确关键词进行检索。

纠错的场景主要可以分为:

  1. 同音纠错;
  2. 形似字纠错;
  3. 多字、少字、顺序错误;
  4. 模糊音纠错。

Case1:

用户输入<JOJOdeqimiaomaoxian>,在同音纠错角度发现可能用户想搜索的是<JOJO的奇妙冒险>,因为你都是英文字母所以不存在形似字,少字角度可以是<JOJO的奇妙冒险故事>。

这些猜测汇聚为候补集,通过噪声模型推分数最高的关键词。
对搜索功能进行拆分,由流程框架到实现方法

Case2:

用户输入<今月头条>,同音纠错好像没什么联想空间,形似字纠错角度可能是<今日头条>,少字角度猜测可能是<这个月的新闻头条>。我们都知道用户想搜的肯定是<今日头条>。

对搜索功能进行拆分,由流程框架到实现方法

Case3:

也是一样的道理,根据用户输入的上一句,对出下一句。

对搜索功能进行拆分,由流程框架到实现方法

2. Query改写

关键词(Query)改写是通过分析原始关键词,生成一系列与原始关键词相关的信息,作为补充,与原始关键词一起参与搜索,从而得到更加准确的搜索结果。

自然语言中存在大量的一词多义现象,比如<苹果>,用户想要的可能是水果也可能是手机等电子产品;比如<西红柿>和<番茄>,同一物体有不同的表达方式;又比如搜索<酒店>,实际的需求并不是了解酒店信息而是预订酒店客房。这些场景语义不确定的场景均可以通过关键词改写的方式来解决。

关键词改写的常用方法主要有:

  1. 基于关键词的内容;
  2. 基于关键词的点击行为;
  3. 基于语义信息的标签及标注。

Case1:

用户输入<男士衬衫>,算法基于关键词内容和平台自身属性,猜测用户的真实需求是购买衬衫。不再在原关键词的框架内进行联想,而是对关键词进行了扩充改写,增加了<长袖><商务免烫><长袖条纹>等维度,帮助用户确定搜索需求。

对搜索功能进行拆分,由流程框架到实现方法

Case2:

用户输入<高达>,但由于用户的历史操作中点开过包含<高达模型>的SKU,因此算法对关键词进行了改写,优先推荐和<高达模型>有关的关键词给到用户。

这里可以看到前十个改写结果中有7个和高达模型相关,且排序优先级很高。

对搜索功能进行拆分,由流程框架到实现方法

切词

用户在选择好关键词后,后台开始搜索,需要将关键词与词库中的内容或商品进行匹配,这一步叫做检索或索引。

词库有限,但关键词无限。如何将无限的关键词索引到有限的词库,就需要用到切词。切词的本质即是将关键词按照字符进行拆分,重组为几个字符串的集合。

以下介绍处理文本时主要涉及到的几个问题:

1. 文本词条化

主要任务是将一段连续的文本序列拆分成多个子词条,由于语言本身的差异,处理文本的方式也不尽相同。

由于中文本身含义紧凑且多歧义的特性,一般需要借助NLP对特征进行抽取甚至人工标注,生成对应的词典后利用分词器完成分词。

2. 停用词过滤

某些情况下,一些常见的词条对于搜索结果匹配的价值并不太大(例如“的”“了”),这些词往往属于超高频词汇,在自然语言中经常会被用到。但被使用的频率越高,它本身的价值也就越小。

这类没有价值的词条就被称为停用词,需要在检索时自动忽略,可以大大减少索引库产生的压力。

现有的停用词表从200-300词的大停用词表到只有几个词的小停用词表应有尽有。但近年来的趋势是不再使用停用词,通过利用语言的统计特性来更好的处理常见词问题。

3. 词条归一化

在完成上述两步后,一段文本被分为了多个有效词条。但往往检索时,这些词条还是不能和索引库一一对应,此时就需要词条归一化。它的实质是指将看起来不完全一致的多个词条归纳成同一个等价类的过程。

在实际场景中,主要包括特殊符号的过滤、大小写归一、繁体转简体、全角转半角等操作。

Case:

<Air-conditioner>-<Air-conditionor>

4. 词干提取

词干提取是英文语料预处理的一个步骤,中文并不需要。本质是去除单词的前后缀得到词根的过程。一些常见的前后缀有<第三人称单数>、<进行式>、<过去式>等。

Case1:

<Ran>、<Running>、<Run>,词干均可提取为<Run>

词干提取在实现方法上,主要利用规则变化进行词缀的去除和缩减,将词转化为词干,达到词的简化效果。但并不是所有输出的词干都是有意义的。

比如<revival>提取词干后,输出的是<reviv>,它本身并没有含义,解决上述问题需要依赖词形还原。

5. 词形还原

词形还原是基于词典,将单词的复杂形态转变为最基础的形态。它不像词干提取,只是简单地将前后缀去掉,而是会根据词典将单词进行转换。

Case:

<Happier>、<Happily>、<Happiset>都可以转换为<Happy>

词形还原在原理上与词干提取的缩减不同,而是采取了转化的方法。需要对词形进行分析,不仅要进行词性识别,还要进行词缀转化,词性标注的准确率直接影响到转化的准确率。

更重要的是,词形还原后的关键词是具有一定意义、完整的词汇,解决了词干提取后词根无意义的问题。

倒排索引

索引类似于一本书的目录,倒排索引是索引技术中的一种,基于关键词主题的属性值进行构建。

现代的搜索引擎绝大多数都是基于倒排索引来构建,这是因为用户在搜索时往往只会输入主题的某一部分关键词。

Case:

下图展示了正向搜索与倒排索引两个流程之间的逆推关系。用户通过搜索<高达模型>,得到了一个具有如下属性的召回结果。

逆推过来,用户也可以通过搜索这些属性,召回<高达模型>。大大加快了检索速度和而效率,也提高了准确度。

对搜索功能进行拆分,由流程框架到实现方法

经过倒排索引召回的结果即可称为候补集,再对候补集进行排序操作后,即可输出结果集。结果集就是用户在前端亲眼见到的内容。

排序

结果集的排序直接影响到搜索结果质量,越往前的结果就越容易得到用户的点击。好的搜索功能不只是召回结果,还要把最有吸引力的内容优先给到用户。

搜索排序的基础逻辑如下:用户输入关键词形成多个有效词条,系统会根据数据库中内容是否包含这些词条来决定是否展示,同时根据词条和内容的相关性给要展示的内容一个分值,最后根据分值进行排序。

Case:

对搜索功能进行拆分,由流程框架到实现方法

上面这个例子,用户输入关键词<高达>,显然优先推送<内容1>。不仅因为标题中出现了关键字,还因为业务数据表现要远远好于<内容2>。

其实,最终影响到排序的,就是取决于文本和业务数据所赋予的权重。这两组数据影响了最终的排序,而如何安排这两组权重,即是搜索引擎对业务的理解。

但实际情况下,排序算法要面对的场景比距离要复杂得多,有更多维度的数据需要考虑。

评估结果集效果

对于最终前端展示的内容,如何评估最终推荐的效果呢?在与策略相关的产品功能(搜索、排序、推荐)中,往往都涉及到机器学习算法,因此评估推荐效果就转化为评估机器学习算法模型的好坏。

我们一般使用性能度量来量化模型的性能指标。在引入各种率之前,需要先了解它们的本质,也就是混肴矩阵。

1. 混肴矩阵

如果我们使用的是一个二分类模型,可以将预测情况与实际情况分别分为“真”“假”两种情况,两两混合即可得到四种情况,由这四种场景组成了混肴矩阵。

对搜索功能进行拆分,由流程框架到实现方法

为了增强可读性,更清楚分辨预测结果是否正确,我们对上述混肴矩阵进行一定的变形。P(Positive)代表预测为真;N(Negative)代表预测为假;T(True)代表预测与实际相同,预测正确;F(False)代表预测与实际不同,预测错误。

转化后的混肴矩阵如下图(注意:列标题由“实际情况”变为“预测结果”)。

对搜索功能进行拆分,由流程框架到实现方法

转化后矩阵的阅读方式应先看“预测结果”,再看“预测情况”,即可推测出真实情况。

  • TP:预测正确,预测情况是P,因此真实情况也是P
  • FP:预测锁雾,预测情况是P,因此实际情况是N
  • FN:预测错误,预测情况是N,因此实际情况是P
  • TN:预测正确,预测情况是N,因此实际情况也是N

2. 召回率、精确率、准确率

(1)召回率(Recall)

召回率又叫查全率,它是针对原样本而言的,它的本质是:在实际为P的样本中被预测为P的概率,其公式为:召回率=TP/(TP+FN)

  • Case1:若样本集中有100个P,通过模型预测出有40个P,那么召回率为40%;
  • Case2:在实际应用场景中可以以网贷违约率为例。我们更关心N类用户,他们会造成违约导致公司损失严重。因此我们需要强调召回率,召回率越高,代表实际预测出来的N类用户概率越高,为此不惜牺牲一些P类用户。

(2)精准率(Precision)

精准率又叫查准率,它是针对预测结果而言的,它的含义是在所有被预测为P的样本中实际为P的样本的概率,其公式为:精准率=TP/(TP+FP)

Case:若通过模型预测的结果集中有100个P,而其中实际有60个P,则精准率为60%。

(3)准确率(Accuracy)

准确率是最常见的评估方式,它的本质是:预测正确的结果占总样本的百分比,其公式为:准确率=(TP+TN)/(TP+TN+FP+FN)

虽然准确率可以判断总的正确率,但若样本集中P、N样本极度不平衡,准确率结果回含有很大的水分,基本失去参加价值。

Case:样本中P占90%,N占10%,我们将模型设置为所有样本均预测为P的策略,则准确率有90%那么高,但实际上毫无实际意义。

(4)总结

在实际项目中,单方面追求精准率或召回率都是不正确的,理想情况是做到两者都高。

但鱼和熊掌不可兼得,精准率高了召回率就会低,召回率高了精准率就会低。如果是做搜索,应该优先保证召回率的前提下提升精准率。

3. F值

通过上面的公式,可以看到召回率和精准率的分子是相同的,但分母不同。因此对于同一策略模型,同一阈值,可以统计出一组确定的精准率和召回率。

遍历0-1之间的所有阈值,就可以画出每个阈值下的关系点,从而得到一条曲线,称之为P-R曲线。

对搜索功能进行拆分,由流程框架到实现方法

得到了曲线,我们当然希望可以找得到一个精准率和召回率都很高的情况,但实际上很难做到,最好是可以找到二者之间的平衡点。

这时候就需要用到F1分数,为F分数的特殊情况。F1分数的本质是当召回率与精准率权重相同时,寻找二者能达到的最佳平衡。

F1的公式:F1=2*P*R/(P+R)

F的公式:F=(1+β^2)*P*R)/(β^2*P+R)

图中的“平衡点”即是通过F1计算得出的。

但往往我们对召回和精准率的权重要求是不同的,因此也往往使用F2或F0.5来评价策略,两者分别表示更重视召回率和准确率。

4. ROC、AUC

前文介绍了F值,但大家可以发现它仅能评估单点的效果而无法表示策略的整体效果。这里介绍的ROC/AUC是一套成熟的整体策略评估方法。

(1)真正率(TPR)/假正率(FPR)

但是在正是介绍ROC(Receiver Operating Characteristic)之前,需要先引入两个指标,这两个指标是ROC/AUC可以无视样本中P、N不平衡的原因。

真正率(TPR)=TP/(TP+FN)

假正率(FPR)=FP/(FP+TN)

大家可以看到这里又需要用到之前介绍过的转化后混肴矩阵,以防大家忘记我再贴一次图。

对搜索功能进行拆分,由流程框架到实现方法

(2)ROC(Receiver Operating Characteristic)

ROC的主要分析方法是一条ROC曲线,曲线中的每个点的横坐标是FPR、纵坐标是TPR,每个点都描绘了在某一确定阈值下模型中真正的P和错误的P之间的关系。

因此我们可以遍历0-1的所有阈值,绘制一条连续的曲线,这就是ROC曲线。

对搜索功能进行拆分,由流程框架到实现方法

那么如何通过ROC曲线来判断一个模型性能的好坏呢?回归到我们的目的,当然是尽可能得提高模型预测正确的概率,降低预测错误的概率。

也就是TPR越高FPR越低,模型性能越就强。对ROC曲线而言,即曲线越陡,越接近坐标左上角,性能越强。

(3)AUC(Area Under Curve)

如果我们想绘制出ROC曲线上的点,就需要遍历阈值,多次回归模型,这种做法效率非常低。因此我们可以用另外一种方法来代替ROC,即AUC,计算曲线下面积。

如上图虚线,若我们将对角线连接,它的面积正好是0.5,代表模型完全随机判断,P/N概率均为50%。若ROC曲线越陡,AUC就越接近正方形,面积越接近1。AUC的值一般都介于0.5-1之间。

5. 其他评估方式

除了上述提到的ROC/AUC,还有一些其他的评估方式,各有各的优点。

Prec@k和MAP:除了考虑召回结果整体准确率之外,还会考虑召回结果的排序

CG/DCG/nDCG:之前的指标都是将目标值分为P和N两种情况,但用这种算法可以用更多维度的指标来评估。比如可以将目标值分为Good、Fair、Bad三类,也可以按照评分。

本文由用户@广告闲人发布于新媒体运营,未经许可,禁止转载。

题图来自Unsplash,基于CC0协议。

本文由 新媒体运营 作者:广告闲人 发表,其版权均为原作者所有,文章内容系作者个人观点,不代表 新媒体运营 对观点赞同或支持,未经许可,禁止转载,题图来自Unsplash,基于CC0协议。
2

发表评论