引用片段抽取:由 HTML 到可核驗摘錄
引用片段抽取:从 HTML 到可核验摘录
引用摘錄須把正文抽取與位置定位分開處理,並同時記錄片段的起止偏移、段落號及上下文窗口,才能回到原文核對。文章提出按容器識別正文,並處理導航與頁腳、推薦位及版權資訊等噪聲;無法判定的頁面或片段則記錄為失敗樣本。示例以前後各 6 字作為上下文窗口,文中 HTML、偏移量及樣本均為假設資料。
2026-11-06 11
版权
版权声明:
本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议》和 《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
简介: 本文厘清「引用摘录」本质:非简单文本抽取,而是可复核的精准定位——须同时输出字符串片段、原文字符偏移、段落号及前后上下文窗口。强调抽取(判正文)与摘录(定位置)分离,提出容器识别、三类去噪、稳定性控制与失败样本规范,确保每处引用均可回源验证。(239字)
本文说的「引用摘录」,指的是从被引页面里抽出一段可核验的文字:它有原文位置、有上下文窗口、能回原页对上。
先说结论:我认为抽取与摘录不是一件事。抽取解决哪些是正文,摘录解决这段文字在原页的哪个位置;只做抽取片段无法复核,只做摘录噪声会混进片段。文中样本与偏移量都是假设值。
【配图1】
问:为什么不直接把页面正文整段存下来?
答:整段混着导航、推荐位与页脚,复核的人要在噪声里找引用。
问:摘录要带到多细?
答:至少带字符区间与段落号,再给前后各一个窗口。
问:抽不出来的页面怎么办?
答:进失败样本,记原因与原始位置,不硬凑片段。
一、抽取与摘录是两件事
抽取的输出是段落列表:哪些文字属于正文、顺序如何。摘录的输出是一个定位:某段文字在原页的起止字符区间与上下文。
两件事混着做,常见结果是片段对、位置错。
缺了会怎样:只存片段不存位置,复核只能靠人翻页找。
二、正文抽取三条规则
我抽取只用三条:只取容器内段落、丢容器外导航与页脚、段落按文档顺序拼接。
我靠标签与类名识别容器,识别不到就整页降级。
缺了会怎样:识别失败就整页为空,记录成「页面无正文」。
三、摘录定位:起止与上下文
定位给三样:起止偏移、段落号、上下文窗口。
import re
RAW = ("<nav>首页 | 产品 | 关于</nav>\n<article>\n"
" <p>该型号支持快充,峰值功率65W。</p>\n"
" <p>注意:不具备防水能力,请勿在雨中充电。</p>\n</article>\n"
"<div class=\"footer\">版权所有 示例站点 | 推荐阅读</div>")
def paragraphs(raw):
body = raw.split("<article>")[1].split("</article>")[0]
segs = body.split("<p>")[1:]
return [re.sub(r"\s+", "", s.split("</p>")[0]) for s in segs]
def locate(page_text, snippet, window=6):
i = page_text.find(snippet)
if i < 0:
return None
return {
"start": i, "end": i + len(snippet),
"ctx": page_text[max(0, i - window):i + len(snippet) + window]}
paras = paragraphs(RAW)
text = "".join(paras)
for snip in ("支持快充,峰值功率65W", "不具备防水能力"):
hit = locate(text, snip)
para = [i + 1 for i, p in enumerate(paras) if snip[:4] in p]
print(f"片段 {snip} -> 起止 {hit['start']}-{hit['end']} 段落 {para}")
print(" 上下文:", hit["ctx"])
print("段落数:", len(paras), "| 导航或页脚混入:", ("首页" in text) or ("版权所有" in text))
当次输出(一条假设页面):
片段 支持快充,峰值功率65W -> 起止 3-15 段落 [1]
上下文: 该型号支持快充,峰值功率65W。注意:不具
片段 不具备防水能力 -> 起止 19-26 段落 [2]
上下文: 5W。注意:不具备防水能力,请勿在雨中
段落数: 2 | 导航或页脚混入: False
两段偏移落在 3–15 与 19–26,段落号 1 与 2;导航与页脚没混进正文。窗口取前后各 6 字,用于判断截断。
缺了会怎样:只给片段不给偏移,复核方要自己算,不同机器算出的位置还不一样。
四、去噪三类
| 噪声类型 | 特征 | 处理 |
|---|---|---|
| 导航与面包屑 | 容器外、短标签、链接密集 | 容器外直接丢 |
| 推荐位与广告 | 容器内但带推广标记 | 按标记丢,标记缺失记失败样本 |
| 页脚与版权 | 容器内末尾、含版权词 | 按版权词表丢 |
我认为三类里最难是推荐位:常与正文同容器,只能靠标记与长度判断,判错会丢正文。
缺了会怎样:只做容器过滤,推荐位会被当正文抽进去。
五、摘录稳定性的三个来源
我遇到第一个不稳定来源是容器识别:同站不同页类名可能不同,要按域名记模板。
第二是段落切分:空段落、图片说明、表格文字都会影响偏移,切分规则要固定。
第三是编码与空白:全角空格与零宽字符不统一,拼接前统一处理,否则偏移每次不同。
缺了会怎样:三源不固定,同页两次抽取偏移不同,摘录不可复算。
六、失败样本怎么记
我抽不出正文、片段找不到、容器为空,三类都进失败样本:记 URL、原因、容器标签与正文长度。
我要求失败样本可复跑:同批 HTML 重跑,失败集合一致。
缺了会怎样:失败样本不留,抽取率看着高,实际跳过了难页。
七、五步落地
- 我先把容器模板按域名建好,识别不到走整页降级。
- 段落切分规则固定,空段落与图表文字单独标。
- 定位输出起止偏移、段落号与上下文窗口三样。
- 去噪按容器外、推广标记、版权词三类处理,判不准的进失败样本。
- 我每批抽取后跑一次可复算检查,同一输入两次偏移一致。
缺了会怎样:只做前两步,片段有了但没有位置;只做后三步,位置有了但噪声没去。
八、承诺与边界
我承诺摘录可核验:起止偏移、段落号与上下文窗口都随摘录一起输出,换一批页面重跑能回到同一位置;效果只写可复测口径。
边界在页面结构:容器类名大改、正文用脚本渲染、推荐位无标记,这三类抽不准,只能进失败样本。文中 HTML、偏移与样本都是假设示例;换一批页面,容器模板与切分规则都要重定。
数据说明(PROV)
数据源(依据)=本文示例,HTML 片段、偏移量与样本均为构造数据,不引用真实页面
查询日=无
样本=一条假设页面,两段正文与两类噪声
口径=摘录=字符串片段+起止偏移+段落号+前后 6 字窗口
局限=只演示抽取、定位与去噪;脚本渲染页面不在范围
本文含 AI 辅助生成内容,经人工核实。
來源:阿里雲開發者社區 AI · developer.aliyun.com