把 CiteReal 生成的核对清单直接丢给作者改,通常会出现两种失控:一条引文查不到,就被当成整篇引用都有问题;或者几十条结果混在同一列里,分不清哪条必须删、哪条只是信息不全。更稳的做法是先把每条引文的核验结果压成三档状态,再把「查不到」的那几条单独拎出来做第二轮检索,最后按状态决定处置,而不是按印象决定。
先给每条引文落一个明确状态:能对上、对不上、查不到。对不上的一般是字段抄错,回原文按版权页、卷期页、署名顺序取值即可修复;查不到的要单独集中再检索一轮,区分「检索入口不对」和「确实不存在」。清单用带状态列的 CSV 保存,用一段脚本按状态过滤汇总,避免遗留条目被顺手放过。删除、替换、降级为未见原文这三种处置,需要在正文里留下可核对的标注。
先按条目建立三档状态
三档状态不是给整篇文献打标签,而是给每一条引文打标签。判定依据建议只围绕可核对的字段:作者姓名的拼写与顺序、标题、刊名或会议名、年份、卷期、页码、DOI 或稳定链接。任何一个字段对不上,就落到对应档位;不要用「感觉这条应该没问题」来兜底。
| 状态 | 判定依据 | 典型表现 |
|---|---|---|
| ok(能对上) | 作者、标题、出处、年份、页码逐项与原文一致 | 仅大小写、连字符、缩写形式差异,不影响定位 |
| mismatch(对不上) | 能定位到原文,但清单里至少一个字段与原文不符 | 年份差一年、页码取成了起始页、作者顺序颠倒 |
| notfound(查不到) | 用一个检索入口没有结果,尚不能断定原文不存在 | 标题片段过长、刊名写成简称、缺作者 |
清单建议存成 CSV,列固定为:cite_id, raw_text, authors, title, venue, year, pages, doi, status, note。每条引文一行,status 只允许写 ok / mismatch / notfound 三个值,note 里记「用哪个入口查的、查到什么、还缺什么」。状态列保持机器可读,备注列留给人看,两者不要混在一起。
把查不到的条目集中再检索一遍
把 status 为 notfound 的行抽出来单独排队处理,不要和 mismatch 混着改。第二轮检索按三条路径依次走,每条路径都要写清期望结果,避免无限重试。
- 换检索入口:从通用搜索引擎换到 Crossref、DataCite、PubMed、CNKI 这类按元数据检索的库,或者换成出版社站点内的检索框。期望结果是把 notfound 缩小成「有唯一命中」或「多命中需要人工判断」两种情况。
- 缩窄标题片段:把标题截到 4~6 个实词,去掉副标题、破折号后的部分和中文书名号,再用作者姓氏加年份做一次组合检索。期望结果是命中数从零变成个位数,从而拿到可核对的出处信息。
- 查作者其他作品:用作者姓名加机构或研究主题,翻该作者的作品列表或主页,看这条是否属于被漏检的一篇。期望结果是确认「作者确实写过,但清单里的题录抄错了」,或者确认「该作者作品列表里没有这一条」。
三条路径都走完仍然没有命中,才可以把它记为「待定」,暂时不要直接判定为不存在。经验上,题目表述被改写、会议论文只存在于论文集、报告类文献没有 DOI,都会造成检索不到而不是不存在。
把对不上的条目改回原文信息
mismatch 是投入产出比最高的一档,多数情况是字段抄写问题,不需要重新找文献。修改时以原文的对应位置为准,不要以另一个数据库的记录为准。
- 年份:取原文版权页或卷首的出版年;期刊按卷期对应的年份,不要取在线优先发布年。
- 页码:取正文首页到末页的完整起止页;只有文章编号的出版物写文章编号,不要臆造页码区间。
- 作者顺序:严格按原文署名顺序,不按字母序或贡献大小重排;通讯作者标记保留但不改变顺序。
- 刊名与卷期:刊名用原文的完整刊名,卷期分别取值,不要把「第 3 卷第 2 期」塞进一个字段。
改法示例(CSV 行,仅示意字段位置):改前 2021, 45-45, Wang L.; Chen Y.,按原文改为 2022, 45-58, Chen Y.; Wang L.,同时在 note 写「按原文版权页与首页署名顺序更正」。改完把这些行状态改回 ok,并保留 note 便于追溯。
用一段命令把状态表里未解决的行汇总
人工翻表容易漏行,用一段脚本按状态列过滤,跑完把输出条数和表内计数对一遍。下面是通用骨架,字段名按你的 CSV 表头替换。
import csv
from collections import Counter
path = "refs_check.csv"
rows = list(csv.DictReader(open(path, encoding="utf-8")))
print(Counter(r["status"] for r in rows))
for r in rows:
if r["status"].strip() in {"mismatch", "notfound"}:
print(r["cite_id"], r["status"], r["title"][:60], "|", r["note"][:40])
只想快速看数量,也可以先用 shell 过滤:awk -F, 'NR>1 && ($9=="mismatch" || $9=="notfound")' refs_check.csv | wc -l。两种方式都要求输出条数与表内这三档计数的和一致;对不上说明 CSV 里有空状态、首尾空格或多行字段,需要先清洗再统计。
决定这批引文的去留
核验结果最终要落到正文层面,按状态分三种处置,口径尽量统一,避免同一篇里处理方式互相矛盾。
- 删除:适用于确认不存在、或与论点无实质支撑关系的条目。正文中直接去掉引用标记和对应的陈述句,不要留下「据说」「有研究表明」这类无主语句。
- 替换:适用于论点成立但原引文题录不可靠的情况。换成能对上原文的等价文献,并在正文中把该句的事实主张与替换后的文献对应上,避免换文献不换说法。
- 降级为未见原文:适用于只拿到二次引用、或仅能看到摘要的条目。正文表述改为转述来源,例如「据某某综述转引」,并在清单 note 里写明未见原文的原因。
三种处置都建议记回 CSV,新增一列 action(keep / delete / replace / degrade),并保留原始状态列不清空。这样下一轮复核时,能直接看到某条引文是被删掉的还是被降级处理的,而不是只看到最终稿里少了一行。