搜索系统(一)
创始人
2025-05-31 14:34:02
0

爬虫

索引建立

正排:由key查找实体,拿url查找web page(title,anchor,content)

倒排:由term查询key,拿term查找 url list

rank打分排序

召回

倒排拉链后,过最小堆,然后算基础相关性 & 权威性 & 时效性,拟合得到score,筛选后,透传结果给粗排

粗排

拿到召回结果后,综合各类特征做一个简单的筛选后,透传给精排

精排

针对粗排结果上复杂NN模型算score

rerank

结合业务特点,对精排结果做筛选

人工先验:以先验知识为主,构建特征,设计排序算法

优点:业务迭代周期和效果非常清晰,可控

缺点:过度依赖于对于业务系统认知 & 人工拟合方式泛化能力不行,属于原始社会阶段

机器学习:结合特征工程用l2r替代排序算法拟合特征

优点:整个搜索迭代框架非常简便,根据不同目标拆解到不同team,各个team根据自己的目标喂特征进l2r

缺点:业务边界导致不同team对于搜索业务理解片面,很快进入瓶颈期,因为人工特征也有镜头,且一味喂特征进入,往往是换汤不换药,容易造成系统过早陷入瓶颈

深度学习:标注数据喂入NN模型,end to end解决问题

优点:结合深度学习泛化能力强的优点,通过大规模训练NN模型,帮助搜索彻底解决语义理解难题。

缺点:标注语料要求整体具有区分度,数据一旦有偏,整个模型就跪掉

编辑切换为居中

添加图片注释,不超过 140 字(可选)

1.需求侧:与搜索词分析交互,分析当前搜索词是否包含特殊要求(地域扩展、相关搜索)

2.调度侧:根据搜索词需求分析结果,调度下游(搜索中控、搜索广告、阿拉丁模块、知识图谱)

3.混排侧:合并结果(相关检索、特殊需求),进行去重、排序和调整,返回

4.提供纠错交互信息与相关检索词

1.调度:是否要查重 or 穿透小库去查大库

2.需求识别:配合查询词分析做需求识别,为检索查询和组合调序提供数据

3.在线特征统计

4.统一调权:以相关性为主干,叠加url级别的特征,进行队列内排序

5.组合调序:多队列结果做merge

6.风控:对merge结果进行屏蔽和升降权

7.整体控制和调度

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

  1. 漏斗中每个层按照时效性为多个库种:实时、小时、天级

  2. 每台服务器的承载能力有限,所以网页集合会分成shard存储,一次查询并行发给这些shard,在上有汇聚结果

  3. 搜索的查询流量到峰值的时候会比较大,一台服务器能装下一个shard,但却无法承担全部查询流量,因此可以针对每个shard复制出N个副本,每个副本承担对应shard的1/N的流量,同时副本之间还起到了容灾的作用

索引

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

网页的自身结构(url, title, content)以及anchor(前链)

逻辑上,网页可以分为多个field,url域,title域,anchor域,content域,将title与anchor打包统一叫做AT索引,title与content打包统一叫做CT索引

trunc中包含了更短的高权截断拉链,是从被截断的索引中筛选得到的,term和网页匹配得更好的倒排子集。

在建库的时候,会把term与网页的匹配划分为8档,6档以上是title/anchor精准命中;

5档是title命中或内容关键词;4档是一个分水岭,代表一个“模糊命中”2档以下是非常差的命中。高权拉链截断主要是效率和效果的平衡:

在计算资源有限,且已经召回了一些好结果的情况下,让召回过程提前终止。此处会有ACtrunc和CTtrunc两种索引

相对AT索引而言,CT索引中的content内容会更多,同一个term,CT拉链会比AT拉链更长,包含的offsets(term在网页中的位置信息)也会更多,这给召回带来很大的压力,

为了解决存储和计算双压力,CT拉链长度设定了一个上限:对于热门term,如果CT拉链的长度N超过一个阈值eta,就将匹配最好的eta个网页跳出,组成长度为eta的CT拉链;

剩下的N-eta网页,组成DIFF拉链

除去将anchor、content、title入索引之外,也会将clicked query做倒排拉链

如果线上系统没有挖掘到LOL是英雄联盟的缩写,有不少用户搜“LOL英雄联盟”点击了一个很好的游戏网站“game.tencent.com”,

该页面只包含了英雄联盟,不包含了LOL,且它的anchor中也没有LOL,这个时候可以考虑将game.tencent.com的构建入LOL的click query域,

未来其他用户输入LOL 攻略的时候,也可以将game.tencent.com召回,此外click query域还可以包含“点击次数”、“满意点击次数”等信号,

为网页和term的匹配提供了更丰富的特征

此外click query还兼有补充bigram的作用,可以更好的支持大粒度的检索,例如网页title “奥运会男单啥时候直播”,queryterm “男单直播”虽然不在title中,但在click query中

倒排索引是搜索中最核心的数据源,驱动搜索引擎在短时间内筛选一个小而准的候选网页集合

一条倒排拉链保存了对应term在当前的分域下,命中的所有网页的id,以及term在网页中的命中情况(匹配的weight,是否在title中,是否是网页关键词,是否是关键词的同义词),

这些信息会组织成64bits的结构体,一同放在倒排索引中;最后还需要保存term在网页中的命中频率和命中位置(offsets),用于query在网页中紧密度的计算

召回

AT查询 & CT查询,高级语法树,过滤结果,提前终止,省词,改写,粒度,预查询

编辑切换为居中

添加图片注释,不超过 140 字(可选)

基本功能

根据搜索中控请求检索页面拉链,归并各拉链,截断,基础特征计算

双层循环,时间复杂度O(N^2)

有序链表求交,两个指针分别指向两个链表的队首,如果相同,放入结果集,随意的移动一个指针,否则移动较小的指针,直到队尾,时间复杂度O(N)

分桶并行优化,对于链表通过分桶,将一个链表按照范围拆分成多个桶,然后采用多线程并行计算,最后做合并

采用跳表,时间复杂度O(logN)

AT & CT查询

编辑切换为居中

添加图片注释,不超过 140 字(可选)

原始query: 苏炳添亚洲记录 site: sports.sina.cn

多个SubQuery共同描述用户查询需求

多个QuerySyntax组成逆波兰式,描述不同SubQuery之间的关系

SubQuery包含at_query和ct_query,分别查询AT索引和CT索引. AT索引和CT索引是或的关系,如果一张网页同时被AT索引和CT索引召回,

将会取最好的命中返回,AT索引和CT索引一起查询主要是性能优化的原因,如果AT索引已经满足很好了,就没有必要费大力气去查CT索引了

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

高级语法树

编辑切换为居中

添加图片注释,不超过 140 字(可选)

奥运会赛程|奥林匹克运动会赛程-国乒赛程 site: sina.com

提前终止

通过减少树弹出的接过数,降低索引召回的cpu负载,减少响应时间,我们将其视为“有损”的性能优化,也叫做折中截断

原则

根据经验指定一些静态规则,对刚建完的树进行裁剪

在结果数或者好结果达到一定阈值后,开始减少召回(内在逻辑:系统已经有了令人满意的好结果,那么后面就可以少做一些工作)

做法

用轻量级的指标,预测一张网页的相关性得分,筛掉那些“没有希望进入topk的网页结果”,topk是信息检索领域的经典问题,如果能召回N个网页

理想状态,不需要省词的概念,命中了任何一个query的term的网页都应该被召回(高级语法那都是或)

从效率角度出发,过大的召回量给整个系统后端带来了非常大的压力,且除个别长尾query之后的大多数查询都无需在如此大的集合中挑选,

从相关性角度看,控制“省词转义”是非常难的事情;如果能从召回层面直接打击省词过度的结果,对相关性来说也非常好

在一个查询中标注若干“不可省词”,要求它们必须在结果网页中共现,倒排索引交运算能快速缩小候选集合,一般来说,不可省词越多,对于召回系统越友好,当然结果越少

如果整体策略对于不可省词的识别有误,将会对召回造成极大的伤害,例如 “澳大利亚xx村庄大火”,如果不可省词是“澳大利亚 xx村庄 大火”,有可能损失 “澳大利亚 大火”的好结果,因此我们在查询变换链条的最后一个环节,会有激进省词的逻辑,激进省词诉求是尝试更多的“不可省词”组合,试图召回几条好结果

自然语言的表达方式往往是灵活多样的,常常有多个词能够表达同一事物,因此用户在搜索框中输入query,

不一定就是最匹配的网页所选用的词汇,尽管他们说的是同一件事情(浓眉哥篮球水平,浓眉哥也叫做戴维斯),

我们早已不满足寻求字面匹配的结果,而是试图召回和用户诉求相关的结果,由此,改写应用而生

改写手段:

同义词(帝都旅游门票,帝都->北京,门票-> 套票、票、年票、通票、订票)

片段改写(美国总统访华 -> 拜登访华)

关联和扩展(刘德华 -> 刘德华电影,刘德华演唱会,扩展主要是通过session log的句对来挖掘共现,依赖于用户行为)

中文nlp处理离不开分词,而分词方案的选取有一定灵活性,对于同一份文本,我们可以输出不同的分词粒度,

例如 “中办”已经是大家的共识的term,但是“篮球门票”是大粒度,“篮球 门票”是小粒度

更小的粒度代表更高的召回率,消耗更多的性能,但是不容易出召回case(配合正确的省词策略)

更大的粒度代表损失召回率,但是对于性能更友好(倒排拉链),天然把term链接在一起(连续飘红),从召回层面帮助相关性控制了“散乱命中转义”问题

预查询机制的初衷,是通过搜索中控的全局视角,自上而下的指导召回模块进行早召回终止,使得召回模块在尽量不损失好结果的情况下,减少召回,节省性能。

召回模块中的折中截断基于自身shared产出的局部数据,由一些静态规则和阈值控制;搜索中控的预查询能够看到全局结果子集,

利用基于统计的人工规则,对“索引截断”,“省词”,“相关词”,“粒度”进行统一的指导

做法10%的优质索引库

根据预查询结果集合进行决策,调整影响召回网页数的指导意见,目前覆盖:索引截断/省词/相关词

正式查询剩下的90%的优质索引库

自动补全

编辑

添加图片注释,不超过 140 字(可选)

编辑

添加图片注释,不超过 140 字(可选)

搜索建议(query suggestion),也就是我们常说的搜索下拉框提示,也可以认

为是搜索下拉推荐,在学术上有一个名字叫做QAC(query autocompletion)

本质上是指搜索引擎系统根据用户当前的输入,自动提供一个query候选列表供用

户选择,这些推荐query一般从从query log中挖掘出大量的候选query,并且保

持前缀相同,然后依据某种法则给候选query计算一个分数,最后选择出top 10个

作为最终结果

基于全量日志的自动补全

• 按照query的pv进行排序

• 按照query的pv、ctr、长播、cvr(如果是电商场景)构建融合公式

• 将query的pv,ctr,长播,停留时长等作为feature输入到模型中,拟合出最终的分

• 基于时间敏感的自动补全(用户检索行为会随着时间而变化)

• 时间趋势、季节性、周期性的查询词,将大大提升用户搜索效率和用户搜索满意

度。主要的方法是应用时间序列进行预测

• 基于用户信息的自动补全

• 根据用户的行为,识别用户的意图,对用户进行分析建模

• 基于上下文的自动补全

• 依赖于query session,query session内的query通常是相关的,将用户的上下文

和候选query映射到同一空间,然后计算每个初始选择的query和上下文的相似度,

越相似的query,越能表征当前用户的搜索意图,那么分数越高,这个时候就排名

越靠前

• 用户开始输入了'耐克球鞋'

,我们计算出耐克球鞋和阿迪达斯球鞋的相关性最高,那

么用户在下一个query中输入阿迪达斯应该提示阿迪达斯球鞋

编辑切换为居中

添加图片注释,不超过 140 字(可选)

离线候选,召回,排序,规则系统,敏感词过滤,相关性过滤

离线候选

搜索日志挖掘

实时流:搜索日志、用户信息更新流

离线流:天级别更新

query数据生成

有一些热点需要主动去发现和创造,针对互联网大量的文本,用户在没有query出现的时候,需要借助一些文本生成的方式去生成一些query帮助倒流

召回

前缀召回

类型

query,拼音(jpinyin,xpinyin,开源,多音字解决不行),中文混合拼音

耗存储

按照前缀建的倒排拉链

平均一个query有70个左右的前缀

赵丽颖

中文前缀: 赵,赵丽,赵丽颖

拼音前缀:z,zh,zha,zhao,zhaol,zhaoli,zhaoliy,zhaoliyi,zhaoliyin

中文英文混合前缀:赵l,赵li,赵liy,赵liyi,赵liyin,赵丽y,赵丽yi

为什么要保留拼音以及中文混合拼音

后台监控,纯中文也就占60%左右

term based召回

常见基于倒排索引的方式来做qq匹配

针对qq匹配结果,算一个简单的相关性分数(bm25)

向量化召回

基于embedding的语义召回

句子向量来源

预训练词向量(word2vec、fasttext),求平均、最大值、最小值

直接学句子向量(Doc2Vec、skip thought vector)

预训练模型(bert、gpt2、ELMO),通过下游任务喂入qq、qt相关数据,得到句子的cls向量

召回做法(facebook FAISS)

KNN(Kd tree,ball tree)

HNSW

PQ

基于图的召回

构建query与query的图表示,根据图路径召回候选

看后搜:观看一个文章或者视频后,搜索的query

搜后搜:搜索一个query后,继续搜索的query

关注关系召回:召回 关注/好友 搜索的query

排序

粗排

通过静态分的方式,构建一个简单的lr模型,通过输入特征pv,ctr,vv,停留时长构建一个静态分,刻画整体候选对于系统带来的增益,

将召回的不同结果通过统一的目标拉平筛选出靠谱结果进入精排,干掉一些作弊或者质量不好的候选

精排

训练一个流式的ctr模型(ffm or deepfm),类似于推荐模型

独特问题:

模型大小:由于原query是用户输入的前缀,所以取值非常多,百亿接近千亿,如果直接抽象成embedding会导致模型非常大

长尾预估问题:对于越长尾的query,往往全局点击率比较高

对于sug推出的query,用户往往还是选择自己输入

解法:

模型太小:去掉id特征,增加单字特征

规则系统 & 敏感词过滤 & 相关性过滤

规则系统

中文前缀匹配置顶

搜索历史置顶

密集、多样性打散

敏感词 & 相关性过滤

敏感词检测、黄/反/涉政检测

在线检测候选query与原query的相关性

评估指标

在线指标

使用率 = sug / (sug + 手动输全)

sug点击量

用户输入长度

sug词的点击位置

人工指标

评估内容

质量

安全

相关性

评估方式

与竞品对比评估

编辑

添加图片注释,不超过 140 字(可选)

在使用搜索引擎,输入一个关键词之后经常在页面底部或者右侧出现相关搜索提示,例如搜索苏炳添后,会提示“9秒83”、“4*100米奥运第四”

为了更准确的找到结果

帮助用户更快速的找到想要的东西,提升用户体验

为了扩展搜索,找到更多的东西

能够帮助搜索引擎做倒流,具有引导作用,当通过一个关键词找不到想要的结果时,会推荐8个关键词

不只是输入query的近义词,通过用户输入的词为基准,帮助用户发现更多和他的意图相关的词

指导思想

如果输入一个query,没有发现要找的内容,这个时候有可能变换query,这个query有可能是一个近义词,

也可能是一个更复杂的表述(原q是 耐克球鞋,结果无法满足要求,就会变成扩展query nike耐克足球鞋,然后就能找到需要的东西,扩展q就是原q的后继词)

从搜索本身来考虑,如果不同的query出来的结果有很多交集,那么这些query有可能是相关的

如果某个搜索结果出现在了不同搜索词的结果集中,那么这些query是相关的,如果这个搜索结果在不同的query下也都被点击了,那么这些词的相关性就更高了

具体细节

召回

后继词召回

user-based召回

item-based召回

url-based召回

排序

过滤

后继词召回

一次搜索行为:用户在5分钟内输入的搜索词定义为一次搜索行为,这也很好理解,搜索一个query,

如果结果不满意,换query行为基本上是在1分钟之内,不可能等半个小时以上,非常的愚蠢

搜索日志: query/time/cookie/result_list

详细做法:

按照用户进行分类,同时刻画到搜索行为定义中,即按照5分钟时间间隔对数据进行清理,

通过整理最后可以变成: cookie: [a1,a2,a3], [b1, b2, b3], [c1, c2, c3]

结果清洗,因为换q不一定是真的没有好结果换的,需要把多个用户的后继词合并起来,

加入一些统计限制(某个词b只有出现在3个用户的相同的搜索词a的后继词,才能算一个a的后继词),去掉一些脏数据

基本上几个mr任务离线跑一下,就可以拿到候选

user-based召回

将相同搜索记录的用户做聚合:

uid1: 苹果 后继词: apple | ipad | macbook air

uid2: 笔记本 后继词: apple笔记本电脑 | macbook pro

uid3: macbook air 后继词: apple | 苹果笔记本电脑

采用基于用户的协同过滤算法,可以给笔记本推荐苹果笔记本电脑

item-based召回

如果query有着相同的搜索结果,那么搜索也是相关的

原始日志: query/time/cookie/result_list

聚合:(可以即将每一行的result list当成一个doc,具体的结果当成doc中的word,当前问题变成了query1和query2的相似度,

就是求类似于文本的相似度,卡一个threshold就可以得到最终结果)

query1 [a, b, c, d, e]

query2 [a, f , c, g, k]

计算相似度:

公式: res1 & res2 / (res1 | res2)

query1 query2(0.25)

url-based召回

如果某个搜索结果出现在了不同搜索词的结果集中,那么这些query是相关的,

如果这个搜索结果在不同的query下也都被点击了,那么这些词的相关性就更高了,

当前策略采用点击日志来做,详细的做法可以参考user-based召回,只不过把后继词变成了点击的url

评估手段

离线

质量

安全

相关性

在线

pv

ctr

有点比

停留时长

知识图谱

编辑切换为居中

添加图片注释,不超过 140 字(可选)

知识图谱是由一些相互连接的实体和他们的属性构成的,换句话说,知识图谱是由一条条知识组成,每条知识表示为一个SPO(Subject-Predicate-Object)三元组,

知识图谱是一种语义网络

多关系网络,由多种类型的节点和多种类型的边组成(企查查、百度知识图谱、搜狗智立方)

常见的是由一种类型的节点和一种类型的边构成的图

编辑切换为居中

添加图片注释,不超过 140 字(可选)

将结构化、非结构化、半结构化的数据通过统一的范式进行规约,变成具有明确结构层次的知识,并精准刻画实体与实体之间的关系

给搜索倒流,帮助搜索更好的理解用户的诉求,使得整体索引结果可解释性更强

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

命名实体识别

姚明出生于上海,从NBA回国后去中国篮协任职

ORG:NBA、中国篮协

PER:姚明

LOC:上海

明天晚上从北京到上海的高铁 (通过slot filling就可以搞定)

Time: 明天、晚上

LOC:北京、上海

TRAN:高铁

关系抽取

自定义模板

bootstrap

监督学习

无监督学习

实体消歧

实体统一

序列标注

HMM

CRF

LSTM/BiLSTM

BiLSTM-CRF

BiLSTM-Bert-CRF

基于规则(泛化能力不行)

正则

时间

邮箱

电话

词典

地点词典

人名词典

基于规则(金融、医疗类)

总结规则(A出生于B,A的出生地是B,A出生时住在B,B是A的出生地)

优点:

可控,数据量少,冷启动

缺点:

不容易写出来,不容易维护

数千万的模板

可扩展性弱

监督学习

准备条件:定义好所有的实体类型和关系类型,以及标注好的语料库

模型: f(实体1特征,实体2特征) = R1(概率),R2(概率),R3(概率)

特征:NER类型、bag of words、词性、steam特征、两个实体之间单词个数

半监督/无监督

bootstrap(准确率太低)

只有很少的一些模版,根据模板,构建三元组,然后将对应的三元组信息放入,回头遍历的时候再次遇到相同实体,中间关系不一样,就可以将关系抽取出来入库

关系抽取

微软的总部是在西雅图

SPO(微软(ORG),总部,西雅图(LOC))

亚马逊的总部是在西雅图

SPO(亚马逊(ORG),总部,西雅图(LOC))

微软,西雅图(实体库里面存在)

微软新建新的总部在西雅图

SPO(微软(ORG),新建新的总部,西雅图(LOC))

实体消歧

今天苹果发布了一款新的手机

苹果:水果中的一种

苹果:美国一家高科技公司,经典的产品由macbook pro,iphone

消歧

针对同一个词,不同的描述,构建不同的向量

针对当前需要确定的sentence的向量表示,去和上述不同的词向量进行距离计算,筛选得到最终的意思

预训练(上下文词向量模型),如bert、ELMO

实体归一

给定两个实体,判断是否指向同一个实体

edit distance(entity1, entity2)

基于规则(百度=百度网讯科技有限责任公司,北京百度科技有限责任公司,设计规则)

有监督

有label的数据,构建二分类模型

基于图的实体统一

从图里面生成对应的特征,构建模型来识别

A和B是否属于同一个东西,feature_a = f(自有特征,出度,入度,一阶相邻信息,二阶相邻信息【关系特征】)

similiaty(feature_a, feature_b)

指代消歧

杜兰特在今天的奥运会男篮决赛中,拿下30分10篮板,比队友利拉德多得到更多的分,他成为了奥运历史得分王

他是 杜兰特?利拉德?

最简单方法:最近实体,他是杜兰特,最近的是利拉德,badcase有点多

学术圈还在研究,未被解决,需要借助一些有监督的方法来解决,和判断两个实体之间是否有关系一样,

只不过变成了代词和对应的实体词,f(杜兰特,他) = 1,f(利拉德,他) = 0,feature(杜兰特,他)= {杜兰特和他之间所有的字符串,他右边的字符串,转化为向量}

为什么要分词

在中文自然语言处理中,词是最小的能够独立活动的有意义的语言成分。汉语是以字为基本书写单位,词语之间没有明显的区分标记,因此进行中文自然语言处理通常是先将汉语文本中的字符串切分成合理的词语序列,然后再在此基础上进行其它分析处理。

中文分词是中文信息处理的基础,只有解决了中文分词才能进一步数据信息挖掘,没有中文分词,其他是就无法正常进行。

解决分词的难点

核心词表问题:许多分词算法都需要有一个核心的(通用、与领域无关的)词表。凡在该词表中的词,分词时就应该切分出来。但对于哪些词应当收进核心词表,目前尚无一个标准

词的变形问题:汉语中的动词和形容词有些可以产生变形结构,如“打牌”、“开心”、“看见”、“相信”可能变形成“打打牌”、“开开心”、“看没看见”、“相不相信”等,它们可以被切出“打打/牌”,但“开开/心”就不合理;“看/没/看见”说得过去,“相/不/相信”就说不过去

词缀的问题:如“者”在现代汉语中单用是没有意义的,因此“作者”、“成功者”、“开发者”内部不能切开。依据这个标准,如“作出了巨大个人财产和精神牺牲者”、“克服许多困难而最终获得成功者”、“开发中国第一个操作系统软件者”也不能切开,但这样复杂的结构与词的定义相矛盾。又如职务名称“教育局长”,语义上理解为“教育局之长”,但切成“教育/局长”、“教育局/长”、“教育/局/长”或不予切分

典型的分词要解决的问题,边界问题要解决“结婚的和尚未结婚”-> “结婚/ 的 / 和 / 尚未/ 结婚 ”, “结婚/ 的 / 和尚 / 未/ 结婚 ”

句子分解:第33金 全红婵女子10米台跳水夺冠

第 33 金 全 红 婵 女 子 10 米 台 跳 水 夺 冠

第 33 金 全红婵 女子 10 米 台 跳水 夺冠

对于句子的分解有很多种方式,要选取最符合人直观,以及方便其他自然语言处理模块的分解方式

词典匹配

前向最大匹配(从前开始不断匹配最长的词)

陕西省委党校副校长秦国刚被开除党籍并撤职

陕西省 委 党校 副校长 秦国刚 被 开除 党籍 并 撤职

后向最大匹配(从后开始不断匹配最长的词)

央视高学历气质美女主播

央视 高学历 气质 美 女主播

双向匹配

最大概率组合

序列标注

HMM

CRF

LSTM/Bilstm

LSTM/Bilstm+CRF

前向最大匹配

最大匹配法是指从左到右逐渐匹配词库中的词语,匹配到最长的词语为止。这是一种比较粗糙的分词方法,构造反例很简单,

如果词典中有“不”、“不可”、“能”、“可能”四个词,但没有“不可能”这个词,那么“不可能”就会被切分为“不可/能”了。

虽然如此,在精度要求不高的情况下,这种分词算法还是可以接受的,毕竟速度很快

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑

添加图片注释,不超过 140 字(可选)

后向最大匹配

先设定扫描的窗口大小maxLen(最好是字典最长的单词长度),从右向左取待切分汉语句的maxLen个字符作为匹配字段。

查找词典并进行匹配。若匹配成功,则将这个匹配字段作为一个词切分出来,并将窗口向右移动这个单词的长度。

若匹配不成功,则将这个匹配字段的最前面一个字去掉,剩下的字符串作为新的匹配字段,进行再次匹配,重复以上过程,直到切分出所有词为止。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

双向最大匹配算法同时进行正向与反向最大匹配,从两个结果里启发式地选择最好的一个

比较两种分词结果分出的词的总数量,选择词语数量少的那一个;如在“中华/民族/真/伟大”与“中华民族/真/伟大”里选择后者,前者有4个词语,后者有3个词语,认为后者对词典利用得更好

如果两种分词词语数量相等,选择单字个数少的那一个;如在“中国人/真/伟/大”与“中国/人/真/伟大”中选择后者,二者都有4个词语,后者只有2个单字,而前者有3个单字,单字少的意味着两字以上的词语更多,多字词语比单字往往能表达更多含义

最大概率匹配

如果定义一个句子sentence由w1,w2,w3,.....,wn词组成,那么最大概率相当于是要求 P(sentence) = \sum w P(w1w2w3…) ,

此处p(w1, w2, w3, ......, wn) = p(w1) * p(w2|w1) * p(w3|w1, w2) * ...... * p(wn|w1, w2, ......, wn-1)来描述,为了使得结果变得更简单,

此处一般使用Unigram来近似

最终上述概率 P(w1, w2, w3, …..., wn)=p(w1)*p(w2)*p(w3)…...p(wn), 一般上述逻辑采用两边加log的方式将连乘变成连加,

最终整体公式可以变成log(P(w1w2w3) = log(p(w1)+log(p(w2))+log(p(w3))+…... + log(p(wn)),最终问题变成选择联合概率最大的组合,

相当于选取⼀条边权值和最大的路径(字是节点,词是边,词频是权值)

此处可以借助动态规划,也就是我们常说的viterbi算法对上述流程做decode,来求解

sentence = 台湾国中学生,套用上述的模板

台 湾 国 中 学 生 = log(w1)+log(w2)+…+log(w6)

台湾 国 中 学生 = log(v1)+log(v2)+log(v3)+log(v4)

台湾 国中 学生 = log(u1)+log(u2)+log(u3)

序列标注

概念

序列标注是NLP中一个重要的任务,它包括分词、词性标注、命名实体识别;用 X = {x1, x2, x3, ......, xn} 表示标注模型的输入,叫做观测序列。观测序列一般是句子, 所以也可以叫词序列。

Y = {y1, y2, y3, ......, yn}表示标注模型的输出,叫做状态序列或标记序列。将句子映射到标记序列的问题叫做序列标注问题(sequence labeling problem),或tagging problem。

(xi, yi)是训练集, (xi, yi) 是第 i个样本点。任务是从训练集学习一个函数 f,将句子映射到标记序列

做法

序列标注分为两类

生成模型,核心是为了求解 argmax p(x, y),其实针对的是一个联合概率,要求的是联合概率最大

判别模型,核心是为了求解 argmax p(y|x),其实针对的是一个条件概率,要求的是条件概率最大

序列标注变为BIES标注算法

字标注是通过给句子中每个字打上标签的思路来进行分词,通过4标签来进行标注(single,单字成词;begin,多字词的开头;middle,三字以上词语的中间部分;end,多字词的结尾,

均只取第一个字母作为label),这样,“为人民服务”就可以标注为“sbebe”了。4标注不是唯一的标注方式,类似地还有6标注,理论上来说,标注越多会越精细,

理论上来说效果也越好,但标注太多也可能存在样本不足的问题,一般常用的就是4标注和6标注

HMM

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑

添加图片注释,不超过 140 字(可选)

代码的第一部分,就是用一个字典来表示P(λk|ok),P(λk|ok)的计算是通过词典来获取的,比如将词典中所有的一字词都计入s标签下,把多字词的首字都计入b标签下,等等。计算过程中还使用了对数概率,防止溢出;

第二部分的转移概率,直接根据直觉估算的;

第三部分就是通过viterbi算法动态规划,求的最大概率路径了。对于概率估算,简单采用了加1平滑法,没出现的单字都算1次。

CRF

编辑切换为居中

添加图片注释,不超过 140 字(可选)

CRF++做分词

编辑切换为居中

添加图片注释,不超过 140 字(可选)

监督式学习:

研究 生命 的 起源

Label: 研(B)究(E)  生(B)命(E)  的(S) 起(B)源(E)

Feature: 字本身(向),字跟前一个字的组合(迈向),字跟后一个字的组合(向充)等

训练分类器:对各种特征和标注组合估计相应参数。都是0-1 Feature,参数空间取决于组合方式

不是针对一个字计算最可能的Label,而是针对一个句子计算最可能的Label组合

不依赖于词典,能自动发现新词。


编辑切换为居中

添加图片注释,不超过 140 字(可选)

本质上分词的字标注,就是保证每个一个字要遵循BIES的规则,那么对于一个分词序列的每一项,

其实都是一个四分类问题,一种简单的做法就是用lstm来对序列建模,最后连一个softmax来学四分类,

但是这种方法有一个缺点就是四分类之间应该有约束,有些字只能出现在词首,这样有了这种规约的化,

整体分词性能会有提升,CRF就是通过规则模板来去学这些序列之间的关系,也就是转义概率,那么整体就可以起到约束分类的作用,

最终的损失函数一个是分类的交叉熵,另一个就是规约的条件随机场的损失函数

新词发现

对于一些新出现的网络词汇可能不能及时识别覆盖,尤其是对于一些垂直搜索有比较多业务专名词的情况,这时候需要对这些未登录词做新词发现。

一些切词工具自带有新词发现功能,比如 Jieba 采用 HMM 进行新词发现。此外简单地,可以采用基于统计的方法来进行新词发现,

通过统计语料中的词语 tfidf 词频、凝聚度和自由度等指标来进行无监督新词挖掘,当词语的凝聚度和自由度达到一定阈值且已有分词不能切分到一起时可以人工评估后加进词库

用于衡量两个 term 共现的概率,两个 term 经常出现在一起,则可以将它们组合成一个词语整体的可能性也更大。

衡量当前 term 左右两边字集合的随机程度,如果左右字集合越随机则这个 term 独立成词的可能性也更大

对 query 进行切词后构建词之间的关系矩阵,然后进行矩阵分解,得到各个词在主特征空间的投影向量,通过投影向量计算词之间的相似度并设定相应阈值构造0-1切分矩阵,

基于该矩阵进行是否成词的判断

可以将新词发现转化为序列标注问题,训练 BiLSTM-CRF、BERT-CRF 等模型预测成词的起始、中间及结束位置,或者转化为 ngram 词在给定句子语境中是否成词或不成词二分类问题

常见中文分词包

IKAnalyzer: 正向迭代最细粒度切分算法

正向最大匹配+细粒度。

结巴分词: Language Model + HMM

Ansj: 参考并简化了Ictclas,没有重新训练,补充了词典

斯坦福分词(Stanford NLP)

CRF, 四标注,能发现新词,但使用了词典作为特征。

中文分词比赛top3

Java实现,但优化的不够好,⽽且CRF本身就速度慢。

只用CRF做分词,稳定性不够,同样的词,有的句子中能分对,有的句子中分不对

中科院分词 (ICTCLAS)

输出多条可能路径

根据其他信息重新计算路径值

能识别新词,嵌入的模型主要是HMM

我的看法:过于复杂,弄巧成拙

在搜索中的 query 分词一般会做粒度控制,分为细粒度和粗粒度两个级别,比如 query "下载深海大作战"按粗粒度切分可以为"下载 深海大作战",

按细粒度切分为"下载 深海 大 作战"。在进行召回时可以优先用粗粒度的切词结果进行召回能得到更精准相关的结果同时减少多个 term 拉链合并的计算量。

当粗粒度分词进行召回结果不够时,可以采用拆分后的细粒度分词进行二次重查扩召回

纠错

用户在使用搜索过程中,可能由于先验知识掌握不够或输入过程引入噪音 ( 如:语音识别有误、快速输入手误等 ) 输入的搜索 query 会存在一定的错误。

如果不对带有错误的 query 进行纠错,除了会影响query分析其他模块的准确率,还会影响召回的相关性及排序的合理性,最终影响到用户的搜索体验

经过统计,搜索引擎中6%左右的query需要纠错

编辑切换为居中

添加图片注释,不超过 140 字(可选)

强制纠错产品形态,要求绝对准确,会给NDCG评估带来显著正向收益,但是如果准确率不行,那么对于NDCG是一个灾难

NDCG(Normalized Discounted Cumulative Gain)是一种评估信息检索系统(如搜索引擎)和推荐系统效果的指标。它衡量的是系统返回结果的相关性和排序质量,即结果的质量与顺序的组合。

在计算NDCG时,首先要了解DCG(Discounted Cumulative Gain)。DCG的计算方法是将每个检索结果按其相关性得分(通常用二进制或者多级评分表示)乘以一个递减函数(通常为对数函数)。这样,排名靠前的相关结果对DCG贡献更大,而排名靠后的相关结果对DCG贡献较小。公式如下:

DCG@k = Σ (rel_i / log2(i + 1)),其中 i 从1到k,rel_i表示第i个结果的相关性得分。

为了消除不同查询返回结果数量的影响,需要将DCG标准化。这就是NDCG。计算NDCG时,需要将DCG除以理想情况下的最大DCG(IDCG,Ideal Discounted Cumulative Gain)。这样,NDCG的值会介于0到1之间,其中1表示检索结果的相关性和排序质量最佳。NDCG计算公式如下:

NDCG@k = DCG@k / IDCG@k

NDCG的计算过程中,通常会设置一个截断值k,以便只考虑排名在前k个的结果。例如,NDCG@10表示只考虑前10个检索结果的相关性和排序质量。

总之,NDCG是一个综合评估检索结果相关性和排序质量的指标,适用于信息检索和推荐系统场景

编辑切换为居中

添加图片注释,不超过 140 字(可选)

建模思路

基本借鉴都是统计机器翻译的套路,采用噪声信道模型来做为主模型

详细框架

挖掘候选

召回

排序

应用

编辑切换为居中

添加图片注释,不超过 140 字(可选)

P(I)代表是语言模型

P(O|I)代表是纠错模型

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

采用噪声信道模型作为最终纠错的主模型,对于原始query分词后,每个term都有对应的候选,

那么最终纠错的目标就是从n * m的路径中找到一条最优的路径,此处的n表示整个query分词后的长度,m表示每个term后的候选

我们还可以尝试深度学习模型来充分挖掘搜索点击行为及搜索 session 进行纠错候选召回,

如采用 Seq2Seq、Transformer、Pointer-Generator Networks 等模型进行端到端的生成改写,通过引入 attention、copy 等机制以及结合混淆词表进行受限翻译生成等优化,

可以比较好地结合上下文进行变长的候选召回。

另外结合 BERT 等预训练语言模型来进行候选召回也是值得尝试的方向,如在 BERT 等预训练模型基础上采用场景相关的无监督语料继续预训练,

然后在错误检测的基础上对错误的字词进行 mask 并预测该位置的正确字词。Google 在2019年提出的 LaserTagger 模型则是另辟蹊径将文本生成建模为序列标注任务,

采用 BERT 预训练模型作为 Encoder 基础上预测各个序列位置的增删留标签,同样适用于 query 纠错这种纠错前后大部分文本重合的任务

在搜索引擎中,term(词项)是查询和文档表示的基本单元。词项的重要性体现在以下几个方面:

查询表示:用户通过输入关键词(term)来表达他们的信息需求。搜索引擎需要理解这些词项并将其与相关文档进行匹配。

文档表示:搜索引擎通常会将文档表示为一个由词项组成的集合。这种表示方法有助于搜索引擎根据查询词项快速找到相关文档。

索引:搜索引擎使用倒排索引(inverted index)来加速查询处理过程。倒排索引是一个数据结构,将词项映射到包含该词项的文档列表。这使得搜索引擎可以根据词项快速找到相关文档。

相关性评估:在计算查询和文档之间的相关性时,词项的重要性是核心因素之一。TF-IDF(Term Frequency-Inverse Document Frequency)是一种常用的权重计算方法,用于衡量词项在文档中的重要性。TF表示词项在文档中出现的频率,而IDF表示词项在整个文档集合中的逆文档频率。TF-IDF值较高的词项在文档中具有较高的重要性。

查询扩展:搜索引擎通过查询扩展技术,对用户输入的词项进行同义词、近义词等相关词的扩展,以增加查询和文档的匹配程度,提高检索质量。

评分和排序:根据词项在查询和文档中的重要性,搜索引擎会为每个文档分配一个评分。然后根据这些评分对检索结果进行排序,以确保用户看到的结果是最相关的。

综上所述,词项在搜索引擎中具有重要作用。它们在表示用户查询、文档表示、索引构建、相关性评估、查询扩展以及评分和排序等方面发挥着关键性作用。

term重要性方法

其中 item 内容侧的 term 重要性可以采用 LDA 主题模型、TextRank、tf*idf 等方法来挖掘

query 侧的 term 重要性,比较容易想到的方法就是把它视为分类或回归问题来考虑,通过训练 svm、gbdt 等传统机器学习模型即可进行预测。

模型样本的构造除了进行人工标注还可以通过用户的搜索点击日志来自动构造。

大概做法是将某个 query 对应搜索结果的用户点击频次作为同时出现在 query 及搜索结果 title 中相应 term 的重要性体现,首先通过共同点击信息或二部图方法对 query 进行聚类,

再将一个 query 对应有不同点击 title 以及同一 term 在簇内不同 query 中的点击 title 频次结果加权考虑起来,

同时排除掉一些搜索 qv 比较不置信的 query 及 title 对应的结果,最后将累计频次进行归一化及分档得到样本对应 label。

至于特征方面,则可以从词法、句法、语义、统计信息等多个方向进行构造,

比如:term 词性、长度信息、term 数目、位置信息、句法依存 tag、是否数字、是否英文、是否停用词、是否专名实体、是否重要行业词、embedding 模长、删词差异度、前后词互信息、左右邻熵、独立检索占比 ( term 单独作为 query 的 qv / 所有包含 term 的 query 的 qv 和)、iqf、文档 idf、统计概率、短语生成树

删词重要性

删词差异度的做法是先训练得到 query 的 embedding 表示,然后计算移除各个 term 之后的 query 与原 query 的 embedding 相似度差值用于衡量 term 的重要性,如果移除某个 term 之后相似度差异很大,代表这个 term 比较重要

短语生成树

短语生成树的做法是通过从搜索 session 序列及搜索点击行为中挖掘出 query 之间的相关关系按 query 长度降序自顶向下进行构造得到,其中树的边和结点均有一定的权重。

这里假设在一定共现关系情况下越短的 query 越是整体意图的核心表达,所以和越下层结点连接越多的 term 重要性越大,仅和较上层或根结点有连接的 term 重要性相对较小,通过用 iqf 等初始化叶子结点,然后自底向上进行结点分值计算并进行多轮迭代使得 term 权重相对稳定

编辑切换为居中

添加图片注释,不超过 140 字(可选)

根节点是原始的query

叶子节点是term

中间节点是部分叶子节点组成的sub query

term 初始权重 为 iqf * idf

sub query的term的权重为 不同term的初始权重归一化后结果

分类回归的方法很好地利用了用户的点击行为反馈,通过精细的特征工程往往能得到比较好的结果。

还有的方法就是利用深度学习模型来学习 term 重要性,比如通过训练基于 BiLSTM+Attention 的 query 意图分类模型或基于 eq2Seq/Transformer 训练的 query 翻译改写模型得到的 attention 权重副产物再结合其他策略或作为上述分类回归模型的特征也可以用于衡量 term 的重要性

term紧密度

query中有一些短语,专名等语块,表达的是一个完整含义,但网页中经常转义命中,例如一个query叫做“万达影城上映”,排序上来某结果title = [万达广场开幕],这种转义命中的形态,大部分可以通过要求片段紧密来解决

主要用于衡量 query 中任意两个 term 之间的紧密程度,如果两个 term 间紧密度比较高,则这两个 term 在召回 item 中出现的距离越近相对来说越相关。以相邻的两个 term 为例,由于分词工具本身存在准确率问题,某两个 term 可能不会被分词工具切分到一起,但它们之间的关系比较紧密,也即紧密度比较高,如果在召回时能将在 item 中同时出现有这两个 term 且出现位置挨在一起或比较靠近的 item 进行召回,相关性会更好

解决思路

用好用户行为数据,的点击数据可以帮助我们做一些挖掘工作

做好数据挖掘(pattern挖掘),解决冷门query片段下点击等用户行为数据稀疏的问题

统计用户点击数据,将用户每一次点击都记录下来,形成对,简称QT对,此处QT数据的有效性基于这样一个假设:用户点击过的title和其检索的query是同义的,如果query里面含有高紧密片段AB,那么点击title里AB也应该是紧密命中的

给定任何一个ngram和所有的QT对,如果该ngram连续紧密出现在query中,nclick += 1;

如果该ngram同时连续命中该query对应的点击title,则ntight += 1,最后点击紧密度 tight = ntight/ nclick

致现在奋斗的自己

There is no smooth road to science

Only those who are not afraid to climb along the steep mountain road can hope to reach the brilliant summit

科学的道路并不平坦.只有不畏劳苦沿着陡峭山路攀登的人,才有希望登上光辉的顶点

相关内容

热门资讯

最新或2023(历届)关于丧假... 关于丧假请假条模板【篇一】  尊敬的领导:  你好,由于我xx去世,需要回家料理后事,特请批假x天。...
最新或2023(历届)丧假请假... 最新或2023(历届)丧假请假条范文一:  尊敬的领导,您好: 因***不幸去世,本人需要赶回家安抚...
最新或2023(历届)关于男方... 男方陪护假请假条【篇一】  尊敬的领导:  您好,我妻子下月即将生产,需家人陪护照料,现特向单位请假...
最新或2023(历届)关于单位... 最新或2023(历届)单位请假条模版【篇一】  尊敬的领导:  本人出生年月为____年____月_...
最新或2023(历届)关于婚假... 婚假请假条范本推荐最新或2023(历届)【篇一】  尊敬的____经理:  我和女友_____商定于...
最新或2023(历届)男士陪护... 最新或2023(历届)男士陪护假请假条【篇一】  尊敬的领导:  因本人妻子生产无人照顾,特此请护理...
最新或2023(历届)关于结婚... 最新或2023(历届)结婚的请假条范文【篇一】  尊敬的学校领导:  本人于____年____月__...
最新或2023(历届)机关单位... 机关单位公休假请假条【篇一】  标题(居中):请假条  上款(顶格写部门的名称或领导人的名字):  ...
最新或2023(历届)清明祭祀... 清明祭祀请假条范本最新或2023(历届)【篇一】  部门  职务  姓名  请假类别  □休假(或 ...
最新或2023(历届)女士产假... 女士产假请假条模板【篇一】  尊敬的领导:  因本人已孕9个月,预产期为XXX年XX月XX日,现需要...
最新或2023(历届)公务员公... 公务员公休假请假条【篇一】  xx领导:  本人现工作不忙,特申请xxxx年年休假,从xxxx年xx...
最新或2023(历届)关于单位... 不能出席会议请假条【篇一】  尊敬的领导:  由于我4月29日中午十二点四十五分需到副院长处,进行学...
最新或2023(历届)教师产假... 最新或2023(历届)教师产假请假条格式范文一:  尊敬的学校领导:  因本人有孕在身,预产期为12...
最新或2023(历届)幼儿园请... 最新或2023(历届)幼儿园请假条范文【篇一】  幼儿园x老师:  您好!  班 宝宝,因 原因,特...
最新或2023(历届)关于休年... 最新或2023(历届)休年休假请假条【篇一】  尊敬的xx:  我因工作已满一年,想要申请年假5天。...
课堂不讲话的保证书 课堂不讲话...   x老师:  开学几个星期以来,我多次在课堂上讲话,之前,x老师已经批评过我了。今天,在自修课上,...
学生实习安全保证书范文 中专实...   范文一:  在外实习期间,我清楚知道我既是实习单位的员工又是学校的学生,具有双重身份;我在外实习...
大学防火安全保证书范文 施工期... 为贯彻《机关、团体、企业、事业单位消防安全管理规定》(公安部第61号令)和《集美大学消防安全工作管理...
最新或2023(历届)教师事假... 教师事假请假条最新或2023(历届)一:  尊敬的陈主任:  您好!我是*****09级XX(专业名...
最新或2023(历届)最新产品... 篇一:  xx公司自成立以来,一直将产品质量定位为公司参与市场竞争的核心,正是这个成功的定位和xx公...