搜索 / NOTEBOOK 课程

45 · 前缀建议、相关查询与会话推荐

完全构造查询日志;无真实用户或隐私数据

构造机制只读 · 已保存的实验

已有输出来自保存的教学实验,并非打开页面时重新执行。 代码和原始输出保持不变;数据与历史注释保留原始语言。

45 · 前缀建议、相关查询与会话推荐

单元:S16。先修:38、39、43。

来源:王树森固定目录。这是 Lab 自编实验;王树森后四模块只有公开目录,不称原作者完整讲义。

证据边界:完全构造查询日志;无真实用户或隐私数据。

学习方式:先预测每个对照,再只改一个变量,运行后解释差异。

PYTHON · 01
import numpy as np
import pandas as pd
from IPython.display import display
from reclab.learning.search_curriculum import *

三个任务

前缀补全必须满足前缀;相关query服务当前需求;下一query预测依赖会话。先定义输入输出,再用频次和转移生成候选,不能以点击热门词代表相关性。

PYTHON · 02
print('CONSTRUCTED sessions',SESSIONS)
print('prefix apple',suggestions('apple'))
print('related apple repair',related('apple repair'))
assert all(q.startswith('apple') for q in suggestions('apple'))
Notebook 保存的输出 · 本页未执行
CONSTRUCTED sessions [('apple repair', 'phone battery repair'), ('apple repair', 'apple official repair'), ('apple fruit', 'apple pie'), ('apple repair', 'phone battery repair'), ('phone battery repair', 'battery price'), ('apple fruit', 'apple pie')]
prefix apple ['apple repair', 'apple fruit', 'apple pie', 'apple official repair']
related apple repair ['phone battery repair', 'apple official repair']

训练和保留会话

按会话边界拆分;重复模板会泄漏,此例故意展示模板重合,不报告泛化成绩。固定前四条fit,后两条机制评估,列出重合而非掩盖。

PYTHON · 03
fit=SESSIONS[:4]; hold=SESSIONS[4:]
print('template overlap',set(fit)&set(hold))
rows=[]
for a,b in hold:
    pred=related(a,fit); rank=pred.index(b)+1 if b in pred else None
    rows.append({'query':a,'next':b,'pred':pred,'RR':1/rank if rank else 0})
display(pd.DataFrame(rows))
Notebook 保存的输出 · 本页未执行
template overlap {('apple fruit', 'apple pie')}
query next pred RR
0 phone battery repair battery price [] 0.0
1 apple fruit apple pie [apple pie] 1.0

前缀排序与相关性约束

候选先按前缀召回再频次排序。前缀无结果显式返回空;不是偷偷改前缀。只改变prefix。

PYTHON · 04
for prefix in ['apple','apple r','unknown']:
    pred=suggestions(prefix,fit); print(prefix,pred)
    assert all(q.startswith(prefix) for q in pred)
assert suggestions('unknown',fit)==[]
# 人工前缀判断:相关集合只对当前补全任务有效。
gold={'apple repair','apple official repair'}
ranked=suggestions('apple',fit)
for k in [1,3]:
    head=ranked[:k]
    print('prefix k',k,'precision',len(set(head)&gold)/max(len(head),1),'recall',len(set(head)&gold)/len(gold))
Notebook 保存的输出 · 本页未执行
apple ['apple repair', 'apple fruit', 'apple official repair', 'apple pie']
apple r ['apple repair']
unknown []
prefix k 1 precision 1.0 recall 0.5
prefix k 3 precision 0.6666666666666666 recall 1.0

漂移与回退

会话需求可能从维修转价格。只返回同锚词是保守机制,会漏掉合理转移;展示coverage损失。实际需要人工相关性、覆盖、时效及线上拒用率评估。

PYTHON · 05
for q in ['apple repair','phone battery repair','unknown']:
    raw=related(q); safe=[x for x in raw if set(terms(q))&set(terms(x))]
    print(q,'raw',raw,'guarded',safe,'fallback prefix',suggestions(q) if not safe else [])
Notebook 保存的输出 · 本页未执行
apple repair raw ['phone battery repair', 'apple official repair'] guarded ['phone battery repair', 'apple official repair'] fallback prefix []
phone battery repair raw ['battery price'] guarded ['battery price'] fallback prefix []
unknown raw [] guarded [] fallback prefix []

本次保存结果的解读

保留会话中一个转移无候选(RR=0),另一个命中(RR=1)却与fit模板重复,故不能称可靠泛化。人工前缀判断在k=1时precision=1、recall=0.5,k=3时precision约0.667、recall=1,体现覆盖与精度取舍。unknown显式返回空结果。

改参数后应以新输出重新判断,不把这段固定解读当作新的测量。

复盘与练习

写下输入、输出、保持不变的量与本章不能支持的结论。选一个上面的单变量参数先预测再重跑;保留失败例。回到搜索学习路径继续下一语义单元。

继续阅读原文

本章来源

作者课程中文

王树森 · 搜索引擎技术

目录:查询词推荐 → 场景、召回、排序

固定版本:六模块目录、9份PDF。查询处理、召回、排序、查询推荐四模块主要是目录,Lab实验为独立教学实现。

学习标记可选,仅保存在当前浏览器中。打开页面不会自动标记已学。