从网页抓下来的问答对没有解码 HTML 实体,样本里到处都是 amp、nbsp、quot,模型学会了输出这些字符串,前端渲染出来是一串编码。
一开始怀疑是「多次抓取叠加,实体被二次编码成 amp;amp」,查了一圈,方向不对。
排查方向其实有限,先把可能性排一排。解析器只取了 innerText 之外的部分,实体没还原。另一种情况是清洗管道里没有 unescape 这一步。
不容易想到的是,没有在入库前做抽样肉眼检查。
动手时先统计实体字符串出现频次
python -c "import re;s=open('raw.txt',encoding='utf-8').read();print(len(re.findall(r'&[a-z]+;',s)))"
做一次反转义并检查二次编码
python -c "import html;print(html.unescape(' '))"
再往下把反转义加进清洗管道并重跑
python clean.py --in raw.txt --out clean.txt --unescape
等前面都确认过,再抽 50 条肉眼确认没有残留
python sample.py --file clean.txt --n 50
别只看报错消失,验证要多做一步。样本里实体字符串归零,二次编码的 amp;amp 也能还原成正常空格,抽样 50 条没有残留。
提醒一点。反转义要循环到稳定为止,抓取链路里每多一层转义就多一层编码;入库前抽样看一眼,比事后训练完再发现便宜得多。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
