数据处理之搜索如何命中?
本文主要讲解了用户在搜索的时候,是怎么命中的,enjoy~
通过本文你可以了解到:
- 了解搜索过程的基本原理:如何根据关键字匹配内容,如何返回搜索结果,如何将结果展示给用户;
- 在搜索场景下更合理的划定搜索范围(输入内容命中哪些字段),提高用户搜索效率,提高数据搜索基线;
- 提高日常工作中搜索的效率,更快更准地搜到自己想要的东西。
用户搜索的过程:用户输入关键词,系统根据用户输入的内容筛选出系统认为用户感兴趣的信息,然后按照系统所设定的规则进行排序。整个过程可拆解为三步:分词、筛选、排序。
在了解分词前先看下搜索的存储原理:在系统词库和索引库之间建立关联,通过用户输入的关键词去匹配词库,然后拉取索引库内容展示给用户。
以在美食网站搜索“北京最大的火锅店”为例,索引库中内容为系统内所有店铺,每个店铺包含的字段有店名、位置、月销量、评论量、评分等等;词库中内容为系统内的词条,只要用户输入的内容能够匹配到词条,就可以快速找到词条对应的索引内容,无法匹配到词条时就没有返回结果。每个系统都有自己的词库,搜索的很多优化都是集中在词库的优化上。
一、分词
分词是对用户输入的信息进行解读,是自然语言处理的重要步骤。同机器学习原理一样,分词将非结构化的数据转化为结构化数据,结构化的数据就可以转化为数学问题了,解决数学问题正是计算机之所长。
1.1 分词的原因
搜索系统的词库无论如何优化、完善都是有限的,但用户的输入是没有限制的。那么如何把用户无限制的输入对应到有限的词库并返回结果呢?
这就需要引入一个新的概念——分词。简单说就是:系统在对用户输入的内容无法精确匹配时,会将内容进行切分,使切分后的词能够匹配到系统的词库。仍以上图为例,如果用户输入“北京最大的火锅店”,系统中并没有这个词,精确匹配的情况下没有任何结果,此时会将输入内容进行切分,于是
“北京最大的火锅店”——> “北京”、“最大”、“的”、“火锅店”。
拆解后每个词就匹配到了相应的内容,排序后就会返回结果。并不是所有的词都会返回有价值的结果,比如案例中的“的”,几乎所有的信息里面都会含有这个字,因此在系统分词时会被直接忽略掉。
1.2 分词的种类、区别
分词有两种,中文分词和英文分词,二者有着本质的区别。
区别1:分词方式不同,中文分词更难更复杂
英文有天然的空格作为分隔符,但中文没有,如何将一段中文进行拆分是一个难点,切分时断点不同,造成的结果也不同(即歧义识别),如“我们三人一组”就可以有两种分词方式:“我们三人/一组”和“我们/三人一组”。还有一个难点是新词识别,即识别未在词典中收录的词。
区别2:英文单词有多种形态
英文单词存在着丰富的变形和变换,如复数形式,过去式、正在进行式等,为了应对这些复杂的变换,在处理英文时会进行词形还原和词干提取。
词形还原:does、did、done、doing会通过词形还原转化为do;
词干提取:cities、children、trees会通过词干提取转化为city、child、tree。
区别3:中文分词需要考虑分词粒度的问题
分词粒度不同,返回的结果也不同,如“北京科学技术研究院”就有多种分法:“北京科学技术研究院”、“北京/科学技术/研究院”、“北京/科学/技术/研究院”。粒度越大,表达的意思就越准确,但是返回的结果也就越少,因此在分词是要根据不同的场景和要求选择不同的分词粒度。
1.3 分词的方法
① 基于词典分词
基于词典匹配是最早的分词方法,比较典型的有:正向最大匹配法、逆向最大匹配法、双向最大匹配法。
(1)正向最大匹配法
step1:匹配时从前往后取词,取前m个字(m为词典里最长的词的字数)开始扫描;
step2:若这m个词扫描有结果,则匹配成功,将m个词切分出来,语句中剩下的词继续进行切分;
step3:若这m个词扫描无结果,则取前m-1个字继续扫描,每次减一个字,直到词典命中或剩下1个字;
step4:重复以上步骤,直至语句全部匹配完成。
(2)逆向最大匹配法
匹配时从后往前取词,其他逻辑和正向相同。
(3)双向最大匹配法
由于正向最大匹配法和逆向最大匹配法都有其局限性,因此产生了双向最大匹配法。即按照正向和逆向分别进行切分,然后进行对比,选取其中一种分词结果输出。
对比原则:①如果正反向分词结果词数不同,则取分词数量少的那个;② 如果词数相同且结果也相同,返回任意一个,如果词数相同但结果不同,取单字数量较少的那个(单字越少越准确)。
上面提到的几种切分方法是从不同的角度来处理歧义问题,每种方法只能解决有限类别的歧义问题。随着词典的增大,词与词之间的交叉更加严重,歧义带来的负面影响也更加严重。同时,上面提到的切分方法对于新词的切分是完全无能为力的。
② 基于统计分词
基于统计分词有两类,第一类是统计取词法(或无词典分词法),把每个词看做是由字组成的,如果相连的字在不同文本中出现的次数越多,就证明这段相连的字很有可能就是一个词。
举例:比如词a出现的概率为P(a),词b出现的概率为P(b),a+b这个词组出现的概率为P(a+b),如果P(a+b)>P(a)*P(b),则能证明a+b不是一个随机出现的组合,要么是一个新词,要么是个词组或者短语。
但这种方法也有一定的局限性,会经常抽出一些共现频度高、但并不是词的常用字组,例如“这一”、“之一”、“有的”、“我的”、“许多的”等,并且对常用词的识别精度差,成本大。在实际应用中通常结合词典分词的方法使用,既发挥了词典分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。
另一类是基于统计机器学习的方法,在给定大量已经分词的文本的前提下,利用统计机器学习、模型学习词语切分的规律(称为训练),从而实现对未知文本的切分。这种方法的缺点就是需要有大量预先分好词的语料作支撑,而且训练的成本也很高。比较经典的是N元文法模型(N-gram)。
N元模型(N-gram)切词
基于N元模型的切词策略是:一段文本存在多种可能的切分结果(切分路径),将训练好的N-gram模型进行路径计算得到最优切分路径并返回结果。
举例:对“他说的确实在理”进行切词。
在N-gram模型的算法中,每个路径上的边都是一个N-gram的概率,于是得到如下概率路径有向图:
可能的切分路径有:他说/的确/实在/理 、他说的/确实/在理、 他说的/确/实在/理、 他/说/的确/实在/理、 他/说的/确/实在/理……
假设随机变量S为一个汉字序列,W是S上所有可能的切分路径(如上图所有从头至尾的不同路径)。对于分词,实际上就是求解使条件概率P(W∣S)最大的切分路径W*,P(W∣S)即为每条路径的衡量标准。
至此,分词任务就转变成了一个数学问题。
③ 基于序列标注分词
基于序列标注分词是把分词过程视为字在字串中的标注问题(例如将字标注为“首字中间字尾字”或者其他标注方式),当这些标注完成的时候切词也就自然完成了。这种策略能够平衡地看待字典词和新词(未收录到词典的词)的识别问题,大大简化了使用门槛,并得到一个相当不错的切词结果。如条件随机场(CRF)、隐马尔科夫模型(HMM)、最大熵算法、神经网络分词模型等。
隐马尔科夫模型(HMM)切词
将文字序列按照词首、词中、词尾、单字词进行标注。
举例:研究生说的确实在理
当每个字的标注都得出的时候,切词也就顺理成章得完成了。
二、筛选
将用户输入的信息进行切分后,对引库中的内容进行匹配筛选。判定用户想要的结果是否被筛选出来,一般会从精确率(Precision)、召回率(Recall)和F1(F1-Measure)值三个维度进行衡量,这也是搜索优化中是关键性指标,涉及到人工打分和更高级的优化。
精确率:所有搜到的内容里面,相关的内容的比例。
召回率:所有应该搜到的内容里面,真正被搜出来的比例。
举例:假设此时有7个桔子和3个苹果放在一起,我想筛选出所有的桔子,系统最终筛选出了6个,其中有4个桔子。那么精确率P=4/6,召回率R=4/7。
F1值:精确值和召回率的调和均值, 也就是:
Q:为什么会有F1值的存在呢?有精确率和召回率不够吗?
A:答案是:不够!正常情况下我们是期望精确率和召回率越高越好,但这两者在某些情况下是相互矛盾的。仍以桔子苹果为例,如果系统只筛选出了1个桔子,那么精确率就是100%,召回率是1/7就会很低;如果系统一次筛选出了10个,那么召回率就是100%,精确率就只有70%。
除此之外,还有一个比较容易混淆的概念:准确率(Accuracy),即判断正确的数目与总数目的比值,其中判断正确的数目包含筛选出的符合要求的和未筛选出的不符合要求的。
仍以桔子苹果为例,准确率A=(4+1)/10=50%,即系统正确筛选出的水果(正确识别了4个桔子+正确识别了1个苹果)与总数的比值。
准确率一般不用于搜索召回的衡量,原因是若上例中苹果数量为100万个,桔子7个时,那么不管怎么筛选,准确率都是99.99%+,显然这是不符合要求的。
三、排序
排序影响着搜索的结果质量,越往前的结果越容易获得用户的点击。好的搜索不仅仅是把应该搜索的内容尽可能的搜索出来,同时还要考虑把最容易吸引用户的内容展示在前面,因此这里就涉及到两个因素:文本数据和业务数据。
3.1 文本数据
文本数据即文本的相关性分数乘以权重。关于如何计算文本的相关性,市面上已经有成熟的开源解决方案,如Lucene算法。然后根据文本类型给出相应的权重,比如系统中有标题、描述和正文三种文本,根据重要性分别赋予不同权重:标题权重为10,导语权重为5,正文权重为1。
3.2 业务数据
业务数据即数据的分数乘以权重。关于数据的分数是数据具体的值。然后根据业务类型给出相应的权重,比如系统中有评论量、分享数、阅读量三种数据,根据重要性分别赋予不同权重:评论数权重为10,分享数权重为20,阅读量权重为1。
举例:以基于Lucence的Solr系统为例,得分公式如下:
其中Nx为文本分数权重,Mx为文本数据相关性分数,Ky为数据分数权重,Ly为数据分数。
由此可以看出,对文本数据和业务数据赋予的权重直接影响最终的排序结果,如何赋值、赋予何值需要基于对业务的理解和认知,这也是一个搜索系统设计最核心的部分。
作者:墨白,公众号:UED_family
本文由 @墨白 原创发布于人人都是产品经理。未经许可,禁止转载
题图来自Unsplash,基于CC0协议
这篇文章的目标人群大部分是我们从业者,一般人可看不下去呢。
前辈 搜索的逻辑在需求文档如何去描述呢,只需要说是完全匹配还是模糊匹配,返回相关度最高的结果吗
想问下 文中提到的文本相关性分数是匹配的时候框架计算好给的吗
赞👍虽然算法部分看不懂🤪
没进来之前,以为是教大家如何命中搜索流量的… 看了前1/3发现原来是讲搜索背后的原理的,但还挺有趣… 再往下看1/3,看到数学公式开始发出“卧槽,这是什么”的感慨… 最后1/3我没看,直接划到评论,和大佬问声好
➡ ➡
有用!