从网页抓下来的问答对没有解码 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 条没有残留。

提醒一点。反转义要循环到稳定为止,抓取链路里每多一层转义就多一层编码;入库前抽样看一眼,比事后训练完再发现便宜得多。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189