#P4444. 第2题-搜索广告标题与关键词相关性评分
-
1000ms
Tried: 234
Accepted: 43
Difficulty: 7
所属公司 :
华为
时间 :2025年11月5日-非AI方向(通软&嵌软&测试&算法&数据科学)
第2题-搜索广告标题与关键词相关性评分
解题思路
-
整体流程
-
将广告标题与每个关键词短语统一转成小写,并按规则分词:只保留字母、数字与连字符
-,其它符号替换为空格后再按空格切分。 -
预处理标题:长度为
n的标题,其位置权重为线性衰减:n==1时权重为[1.0];- 否则第
i个单词(0-based)的权重w[i] = 1 - i/(n-1)。
-
题目内容
在搜索广告系统中,广告主希望自己的广告能够更准确地呈现给有相关搜索意图的用户。系统会提供一个广告标题以及若干搜索关键词短语,并需要对每个搜索关键词短语计算一个相关性得分。该得分由「匹配度分」和「位置权重」两部分相乘得到。
分词规则
对广告标题和每个搜索关键词短语,统一先转为小写,再将所有不属于字母、数字或连字符 - 的字符都视为分隔符。处理后的文本按空白切分,得到若干 token。
匹配度分
设某个搜索关键词短语切分后得到 token 序列 q0,q1,…,qm−1,广告标题切分后得到 token 序列 t0,t1,…,tn−1。若一个查询 token 与某个标题 token 完全相同,则认为该查询 token 在广告标题中出现。匹配度分按以下优先级判定:
- 有序子序列:若存在下标 i0<i1<⋯<im−1,使得对每个 j 都有 tij=qj,即查询短语中的全部 token 按原顺序出现在广告标题 token 序列中(不要求连续),则匹配度分为 X1。
- 无序子序列:若不满足上述有序条件,但查询短语中的所有 token 都出现在广告标题 token 序列中,则匹配度分为 X2。
- 匹配关键词占比:若前两条均不满足,但查询短语中至少有
1个 token 出现在广告标题中,设匹配数量为 c,则匹配度分为 X3×mc。 - 其他情况:匹配度分为 X4。
系数取值为 X1=1.0,X2=0.8,X3=0.6,X4=0。
位置权重
设广告标题的 token 个数为 n。若 n=1,则位置权重列表为 [1.0];否则,从索引 0 开始,第 i 个 token 的位置权重为:
该权重从广告标题开头到末尾线性衰减。
对于某个搜索关键词短语,遍历其中的每个 token。若该 token 在广告标题中出现,则取其第一次出现位置对应的权重;将所有匹配 token 的权重相加,得到位置权重和 S。若广告标题中存在多个相同 token,只使用第一次出现的位置;若搜索关键词短语中有重复 token,则每次出现都会累加一次对应权重。
相关性得分
最终得分为匹配度分与位置权重和的乘积:
score=match_score×S.将计算结果四舍五入,并保留 4 位小数。
约束条件
检索关键词短语的个数小于 100。
输入描述
输入仅有一行,包含若干用 | 分隔的字段。第一个字段是广告标题,之后的每个字段是一个搜索关键词短语。标题和短语中可能包含空格与标点符号,解析时按上述分词规则处理。
输出描述
输出一行,包含按输入顺序排列的每个搜索关键词短语的相关性得分。每个得分四舍五入保留 4 位小数,字段之间用 | 分隔。
样例1
输入
Buy the best digital camera online|digital camera|camera digital|best camera|phone
输出
0.6000|0.4800|0.8000|0.0000
说明
标题分词后得到 token 序列 ["buy","the","best","digital","camera","online"],共 6 个 token。位置权重为 w0=1.0, w1=0.8, w2=0.6, w3=0.4, w4=0.2, w5=0.0。
对于查询 digital camera,digital 和 camera 按顺序出现在标题中,匹配度分为 1.0。位置权重和为 0.4+0.2=0.6,因此得分为 1.0×0.6=0.6000。
查询 camera digital 的 2 个 token 都出现,但顺序与标题相反,匹配度分为 0.8。位置权重和仍为 0.6,得分为 0.8×0.6=0.4800。
查询 best camera 中 best 位于索引 2,camera 位于索引 4,顺序正确,匹配度分为 1.0。位置权重和为 0.6+0.2=0.8,得分为 1.0×0.8=0.8000。
查询 phone 没有出现在标题中,匹配度分为 0,最终得分为 0.0000。
样例2
输入
Camera|camera|camera camera|phone
输出
1.0000|1.6000|0.0000
说明
标题分词后只有 1 个 token ["camera"],因此位置权重列表为 [1.0]。
查询 camera 与标题完全匹配且有序,匹配度分为 1.0。位置权重和为 1.0,得分为 1.0×1.0=1.0000。
查询 camera camera 的 2 个 token 都出现在标题中,但标题中只有 1 个 camera,无法按顺序匹配两个,匹配度分为 0.8。2 个 token 每次出现都累加权重 1.0,位置权重和为 2.0,得分为 0.8×2.0=1.6000。
查询 phone 未出现,匹配度分为 0,最终得分为 0.0000。
样例3
输入
red blue green|red yellow|green blue|red blue green|green
输出
0.3000|0.4000|1.5000|0.0000
说明
标题分词后的 token 序列为 ["red","blue","green"],共 3 个 token。位置权重为 w0=1.0, w1=0.5, w2=0.0。
查询 red yellow 中 red 出现,yellow 未出现,匹配数量为 1,占比为 1/2,匹配度分为 0.6×21=0.3。位置权重和为 w0=1.0,得分为 0.3×1.0=0.3000。
查询 green blue 的 2 个 token 都出现,但 green 在标题中的位置为 2,blue 为 1,顺序不递增,匹配度分为 0.8。位置权重和为 w2+w1=0.0+0.5=0.5,得分为 0.8×0.5=0.4000。
查询 red blue green 的 3 个 token 按标题顺序全部出现,匹配度分为 1.0。位置权重和为 w0+w1+w2=1.0+0.5+0.0=1.5,得分为 1.0×1.5=1.5000。
查询 green 出现在标题最后一个位置,匹配度分为 1.0,但该位置权重为 w2=0.0,因此得分为 1.0×0.0=0.0000。