ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AI大模型如何清洗地质勘探语料?从OCR乱码到规范标注的完整方案

AI大模型如何清洗地质勘探语料?从OCR乱码到规范标注的完整方案 简介这份PDF方案由AI产品社编写面向地质勘探研究人员、工程师及技术管理人员系统讲解AI大模型在地质语料清洗与标注中的应用路径。内容从项目背景与目标切入覆盖数据源选择、网络爬虫/数据库检索/现场调查等收集方法数据筛选、噪声识别、去重等清洗策略地质层位、矿体特征、结构特征等标注方案以及人员培训、数据库设计、模型训练与应用建议并涉及风险管理与实施计划。资源包含1个PDF文件大小约940KB适合快速通读整体技术框架。目前已有81人学习下载读者可据此掌握从语料收集、清洗标注到模型训练与应用落地的完整流程并借鉴其中的人员培训、质量考核及风险管理安排为构建智能化勘探与决策支持系统提供参考。1. 一份二十年前的钻探报告就是地质勘探语料清洗最真实的战场一份二三十年前的纸质钻探报告扫描成 PDF 再 OCR 出来满篇是错别字、乱码和断行岩性描述和设备参数挤在同一行里——这是地质勘探语料最真实的样子。这套《AI 应用大模型做地质勘探语料清洗和标注应用方案》要解决的就是这类语料的整理问题用 AI 大模型把脏乱的地质文本清洗成干净、可检索、可训练的规范语料再按地质语义完成实体标注。它适合正在做地质数据治理、勘探知识库、矿产预测建模的团队也适合准备把老报告数字化的单位。方案本身不复杂真正的复杂度藏在清洗边界、标注 Schema 和质量兜底里下面按流水线顺序把这些讲透。2. 先把地质语料的特殊性立住为什么通用清洗流程在这里集体失效通用文本清洗习惯是去停用词、做标准化、按标点断句这套流程放到地质勘探语料上很快就会翻车。地质文本里埋着大量对通用清洗器来说无意义、但对地质判断极其重要的信息——深度值不能当噪声删地层代号不能按英文缩写规则处理一两个 OCR 错字就可能把一个矿化描述变成另一个截然不同的地质现象。所以动手之前要先把语料的特殊性和标注目标对齐。2.1 地质语料里藏着四类典型的脏文字脏、术语脏、格式脏、语义断层文字脏指 OCR 和扫描引入的字符级错误。常见的有含金石英脉被识别成舍金石英脉花岗岩变成花岡岩砾石与烁石混写全角半角字符混排也很普遍数字与单位之间夹着莫名其妙的空格或换行。这类错误的特点是量大、模式多、还不稳定同一份报告不同页面的 OCR 错误类型可能完全不同。术语脏指的是地质专业表达的不统一。同一套岩石命名可能同时出现花岗闪长岩花岗闪长斑岩等多种写法地层代号的下标丢失后C1 和 C1 在文本里无法区分单位制混乱米、m、M、III 交替出现。这些对通用规则来说只是同义词问题但对后续的实体抽取和关系建模是直接决定标注质量的硬边界。格式脏更隐蔽。地质报告是按章节和表格拼装出来的页眉页脚、图注、表格碎片散落在正文里钻孔编录表往往被 OCR 成一行行不完整的碎片。同一个深度有的写35.2m有的写35.2 米有的写35.20M原始 CSV 表格转文本后甚至会把列头和数据交错排布。语义断层则是指上下文依赖极强报告里到处是该层厚约 3m其下未见矿化这类省略主语和先行词的句子单看一句话根本无法判断在描述哪条钻孔、哪个层位。2.2 标注目标决定清洗边界实体抽取、关系标注和语料级清洗不是一回事很多团队一上来就急着跑模型结果清洗后的语料既不满足实体抽取需求又丢了关系标注必需的上下文线索。我一般建议先定标注目标再反推清洗策略因为三者的边界要求完全不一样。如果目标是实体抽取比如抽岩性、地层代号、矿化类型和深度区间那清洗的重点是字符纠错、单位归一化和断行合并确保每个实体的字面表达是干净且可枚举的。如果目标是关系标注比如某深度区间对应某岩性某构造控制某矿化清洗就必须保留句子结构和指代关系不能为了去噪声把主语和谓语的连接打断也不能把同一钻孔的不同段落切到不同文件里。如果目标只是语料级清洗把老报告整理成可检索的知识库那重点反而在于段落切分和章节结构保留实体级的精细度可以往后放。清洗策略在三种目标下的取舍原则是清洗只做减法不做加法。规则可以删除页眉页码、合并断行、归一化单位但不能替作者补充缺失的地质描述模型的语义清洗可以修正明显 OCR 错误但不能用常识推断来改写专业内容。这个边界守不住后续所有标注结果都会建立在被污染的底稿上。2.3 大模型介入的选型判断哪些活交给规则哪些活交给模型大模型不是万能的地质语料清洗里有一类问题是纯规则更可靠。凡是可枚举、有固定模式的操作我用正则和查找表来处理比如全角转半角、页码剔除、单位归一化、地层代号的大小写规整。这类操作用模型做不仅慢还会引入不可控的改写风险。但有一类工作必须交给模型断行合并和指代消解。OCR 扫出来的文本经常把中粒黑云母——花岗岩拆成两行单靠正则很难判断是故意换行还是断裂而该层其下ZK05这类指代关系必须结合上下文语义才能还原。另一个适合模型的任务是 OCR 错字候选纠错——注意是候选纠错不是直接替换。模型给出含金/舍金的纠错候选人工确认后进替换表这样既利用了大模型的上下文能力又避免了模型在关键术语上自作主张。规则和模型的边界可以按是否依赖语义理解来定。纯粹字符级的交给正则语义级的交给模型介于两者之间的先让模型出候选、再让规则落地。这个分工立住之后流水线才不会变成大模型的玩具才能扛得住上万份报告的量。3. 语料清洗流水线从扫描件文本到结构化句段清洗流水线我按三工序搭建规则预处理 → 大模型语义清洗 → 质量门禁。规则预处理负责把 OCR 文本里能确定的脏东西清掉大模型负责处理需要理解的脏质量门禁负责拦截清洗过度或清洗不足的批次。三道工序串起来每一步的输入输出都是标准文本方便单独调试和回溯。3.1 第一道工序用正则做字符级预处理参数全在这里以一个实际处理过的最小脚本为例。它的职责很单一把 OCR 文本里的全角字符、页码、断行、和已知术语错字处理掉。import re def preprocess_ocr(raw_text: str) - str: # 全角转半角只处理常见字符避免误伤中文标点 text raw_text.translate(str.maketrans( , 0123456789mck.:;,() )) # 剔除页码与页眉匹配行首/行尾的“- 3 -”与“第 X 页/共 Y 页” text re.sub(r-\s*\d{1,3}\s*-, , text) text re.sub(r第\s*\d{1,3}\s*页\s*共\s*\d{1,3}\s*页, , text) # 断行合并行尾无标点且下一行以数字或小写字母开头时拼接 # 注意地质报告行首出现深度值极常见这里限定行尾无标点时才合并 lines text.split(\n) merged [] for i, line in enumerate(lines): line line.strip() if not line: continue if (merged and not re.search(r[。;,]$, merged[-1]) and re.match(r^\d, line)): merged[-1] merged[-1] line else: merged.append(line) return \n.join(merged) # 术语纠错表OCR 错字候选经人工确认后积累 TERM_FIX { 舍金: 含金, 花岡: 花岗, 烁石: 砾石, 压粹: 压碎, } def apply_term_fix(text: str) - str: for wrong, right in TERM_FIX.items(): text text.replace(wrong, right) return text这段脚本有三个参数值得关注。全角转半角的字符表不能贪多把英文数字和中英文标点转掉即可中文标点保留了原样避免把句号顿号搞乱。页码正则里的数字长度限定在 1 到 3 位因为地质报告正文里四位数往往是年份或坐标贸然匹配会把有效数据删掉。断行合并的正则条件写得很保守——行尾必须没有中文标点且下一行必须以数字开头这是从翻车里学来的一开始合并条件太宽松把顶板深度 28.5m和底板深度 28.5m这种成对出现的两行硬拼成了一行直接破坏了后续深度区间的标注。预处理完成后还需要做一次单位归一化常见做法是用正则把35.2 米35.2m35.2 M统一成35.2m并在行尾追加一列原始写法用于追溯。单位归一化的坑在于不要顺手改写数字精度OCR 文本里35.20和35.2的精度差异可能在编录表里是有效信息统一单位可以统一数字位数不行。3.2 第二道工序大模型清洗的提示词设计与采样参数预处理把字符级脏清完之后剩下的是断行语义合并、OCR 错字候选纠错、表格碎片剔除这类需要理解的任务。这一步我通常用 7B 到 14B 的开源模型做本地部署量化到 Q4 之后单卡就能跑。模型不需要太大清洗任务对推理能力的要求远低于对指令遵循的要求把提示词写结实比换大模型管用。你是一名地质编录文本清洗助手。给定一段来自地质勘探报告 OCR 的原始文本请完成 1. 合并因 OCR 或扫描产生的断行保持句子完整。 2. 修正明显的 OCR 错字例如含/舍砂/沙砾/烁但不得改写专业术语。 3. 保留所有深度、坐标、样品编号、年代数据不做四舍五入或格式改写。 4. 删除页眉页脚、图注、表格碎片等与正文无关的内容。 5. 以 JSON 格式输出{cleaned_text: 清洗后的文本, uncertain: false}。 6. 硬约束原文信息缺失或语义模糊时保留原样并将uncertain置为 true禁止推测补全。采样参数上temperature 直接设 0top_p 设 0.9。清洗任务不允许创造性同一段文本跑两次结果必须一致否则下游标注没法复现。max_tokens 要给足地质报告一段编录经常几百字默认的 512 会把文本截断。另一个容易忽视的参数是 repeat_penaltyOCR 文本里常见连续重复的表格碎片调高一点能减少模型在碎片上循环输出的概率。模型跑完之后uncertain 标记为 true 的片段单独落盘不进下一道工序。这相当于让模型自己承认哪些地方它拿不准后续人工复核只需要盯这批模糊片段不用全部重看。用模型清洗的收益在于它能理解上下文把断裂行拼回完整语义但代价是要防着它过度理解——这也是质量门禁要盯的重点。3.3 清洗后的质量门禁三档指标拦截清洗翻车清洗跑完不能直接进入标注先过一道自动质量门禁。我习惯按批次统计三个指标清洗前后字符数变化率、术语词典命中率、数字信息保留率。字符数变化率超出 ±30% 说明可能误删了正文或者模型擅自扩写术语词典命中率应当比清洗前上升如果反而下降多半是模型把专业术语改写了数字信息保留率最敏感清洗前后出现的数字总量必须基本一致差一个都可能意味着深度值被吞了。这三个指标在流水线里做成一张每批次报告表超阈值就自动暂停该批次输出失败样本让人工判断是规则误杀还是模型幻觉。实践里最常触发告警的是字符数变化率原因是某些老报告的页眉页脚占整个页面的比重极大正常清洗就会超 30%这种情况要按页数拆分批次后重新计算基线而不是直接调阈值。质量门禁确认通过后清洗后的文本才会进入标注环节。清洗阶段如果留下了尾巴标注阶段的所有成果都是在脏底稿上盖楼返工成本至少翻倍。所以我有句话常挂在嘴边清洗宁可保守不要激进留一点脏字给标注模型去判断远比清洗时把有效信息删掉要好。4. 标注方案落地让模型按地质 Schema 输出可校验的标注结果清洗完的语料要变成可训练、可检索的数据还得落到标注这一步。地质勘探语料标注和通用文本标注最大的差别在于标注 Schema 必须贴着地质业务定义不能拿通用命名实体识别的标签硬套。4.1 标注 Schema 设计字段、取值范围与边界备注以我做岩芯编录语料实体标注时的 Schema 为例定义五类实体和一个坐标系统字段。岩性实体要求保留原文描述不简化、不归并中细粒黑云二长花岗岩就必须是这个长度不许压缩成花岗岩因为蚀变程度和粒度对后续的成矿预测是重要特征。地层代号用字母加数字的组合但 OCR 丢下标后的写法C1 和 C1要统一记录并在备注里保留原始写法。构造实体允许带编号比如F5 断层和压扭性断裂都要完整保留。矿化实体只标原文真实出现的描述含金石英脉是矿化但可能含金不能标成确定矿化。坐标系统单独设字段。同一份老报告里混用北京 54、西安 80 和新国家坐标系的情况不少见坐标系统不对后续做空间分析时所有点位都会偏移这也是我强调它必须作为显式字段的原因。实体类型输出字段取值约束边界备注岩性lithology保持原文描述不简化不归并带蚀变化前缀的描述必须保留地层代号stratigraphy字母数字组合下标转为普通数字新旧代号差异必须记录原始写法构造tectonic按原文名称输出带编号的保留编号不推断构造性质矿化mineralization只标原文真实出现的矿化描述可能疑似前缀的必须保留深度区间depth统一保留原始单位坑道深度可能为负数禁止归一化时取绝对值坐标系统coordinate_system原文声明必须记录多处声明不一致时报错这个 Schema 的表就是你和标注模型之间的契约。契约写得越松模型发挥空间越大标注结果一致性越差。4.2 让开源模型稳定输出标注提示词模板与 few-shot 样例定义好 Schema 之后下一步是让模型照着输出。我一般用 DeepSeek 或 Qwen 系列的量化版本做本地部署原因只有一个勘探数据不能出内网。API 再方便这一条就把它否掉了。系统提示词 你是地质勘探语料实体标注模型。给定一段清洗后的地质描述文本抽取以下实体 lithology岩性、stratigraphy地层代号、tectonic构造、mineralization矿化、depth深度区间、coordinate_system坐标系统。 输出格式为 JSON 数组每个元素包含字段 {entity: 实体类型, value: 实体原文, span_text: 原文中匹配的文本片段} 约束 1. 只标注文本中真实出现的信息不确定的字段填 null禁止用常识或背景知识补全。 2. value 与 span_text 必须与原文保持一致不许改写。 3. 输出必须是纯 JSON不要用 Markdown 代码块包裹。 一个 few-shot 示例 文本ZK03孔0-15.2m为第四系15.2m以下为中细粒黑云母花岗岩岩石具黄铁矿化见F5断层。 输出[{entity: stratigraphy, value: 第四系, span_text: 第四系}, {entity: lithology, value: 中细粒黑云母花岗岩, span_text: 中细粒黑云母花岗岩}, {entity: mineralization, value: 黄铁矿化, span_text: 黄铁矿化}, {entity: tectonic, value: F5断层, span_text: F5断层}, {entity: depth, value: 0-15.2m, span_text: 0-15.2m}]模型部署时的三个参数直接影响标注质量。temperature 必须设 0标注任务同一段文本跑两遍结果必须完全一致否则没法做一致性校验。上下文长度建议限制在 2K 到 4K token 之间——地质报告的长段落经常跨越多个钻孔上下文太长模型容易把前面钻孔的信息串到后面切成单孔或单层位的片段再标注串扰会明显下降。max_tokens 给 2048因为输出 JSON 数组时实体多的情况下很容易被截断。模型输出还需要一个解析后处理。开源模型偶尔会在 JSON 外包一层 Markdown 代码块标记或者把键名从下划线风格改成驼峰风格这些都用脚本兜底处理掉。span_text 与原文的匹配要严格做字符串匹配匹配不上时宁可告警丢弃也不能让模型自己生成接近但不一致的片段。4.3 一致性兜底双模型投票与争议样本回流单模型标注的直接风险是它在某个错误判断上非常有自信。我在实践中采用双通道校验同一段文本让两个不同的模型各标一次或者让同一模型在两种不同的提示词变体下各标一次只保留双方一致的标签不一致的标签进人工争议池。双通道不一致的比例是一个很敏感的早期预警信号。如果一批次的不一致率超过 15%问题大概率不在模型而在 Schema 定义不清晰或者清洗阶段留下的噪声太大。这时候先回去看清洗结果而不是调模型。人工争议池的处理结果会定期回流成 few-shot 样例。每积累 50 条典型争议就挑 3 到 5 条最典型的加进提示词里让模型在下一次迭代中不再犯同类错误。这套机制跑起来后标注一致率通常能在两到三轮迭代内从 80% 提到 90% 以上。5. 地质勘探语料清洗标注避坑5 个让我返工的典型问题说几条实打实的踩坑记录都是返工过一轮才长记性的问题。每条按现象、原因、解决三步写方便对照排查。5.1 模型自作主张补全缺失的地质描述现象清洗完的语料里原文只写了岩石具硅化模型在清洗环节给加了一句局部见黄铁矿化。单看每句话都很通顺但和原始报告核对后发现矿化信息是模型推测出来的不是原文所有。更麻烦的是下游标注模型把这段推测内容标成了矿化实体整个数据集被污染。原因清洗提示词里的修正 OCR 错字被模型理解成了完善表达它把地质文本当成了常规文章按语言习惯做了补全。这属于提示词与模型理解的偏差。解决提示词里加了硬约束——只允许修正明显的 OCR 错字不允许新增任何原文没有的信息并在输出 JSON 里增加 uncertain 字段让拿不准的片段直接标记为模糊。后处理脚本里再做一层校验清洗后的文本与原始文本做词面覆盖率对比新增敏感词如矿化、蚀变、岩性名词时自动拦截。5.2 OCR 错字绕过术语表纠错表的失效与被骗现象含金石英脉被 OCR 成舍金石英脉后术语纠错表本来能救回来但同一份报告里还出现了舍金脉舍金石脉等多种变体。替换表覆盖不全错字漏进了下游标注模型把舍金当成了未知实体名标出来。原因OCR 错字在上下文里呈现多样化远不止那一个词位而且靠人工积累替换表太慢新报告类型进来后错字变体又会冒出来。解决把纠错流程改成模型出候选人工确认后入表。先让清洗模型把疑似 OCR 错字的词位连同上下文和候选结论输出人工快速确认后写入纠错表。每个批次结束后统计纠错表的命中率和新增词条数命中率掉到阈值以下说明出现了新错字模式触发一次人工复核。5.3 坐标系混用两套坐标并存导致点位系统偏移现象一份矿区老报告里附图用的是北京 54 坐标系附表数据表头标注的是西安 80。清洗和标注阶段都完好保留了坐标数字但做空间投影时发现点位全部偏移约百米。整个标注任务白干所有坐标字段全部重标。原因文本清洗和标注只关注了坐标数值本身没有把坐标系统当作高优先级实体处理。解决把 coordinate_system 升为 Schema 里的必填字段每份报告先做一次全局扫描提取坐标系统声明全文多处声明不一致直接告警拦截。坐标数值则保留原始写法不做任何归一化。5.4 长文本上下文串扰前一个钻孔的岩性跑到后一个钻孔现象一份报告连续描述 ZK01 到 ZK05 五个钻孔的岩性。模型标注 ZK03 时把 ZK02 的黄铁矿化也带了过来标注结果在单条记录上看着合理但跨钻孔对比时露馅。原因输入上下文过长模型没有严格按照钻孔边界切分信息。长文本语义建模本身对大模型就是个难题靠通用模型默认行为根本兜不住。解决标注前按钻孔编号做硬切块单段文本只包含一个钻孔的编录内容上下文长度控制在 2 到 4K token 以内。切块规则里做了负向断言——切块边界处出现下一个钻孔编号时强制截断并让切块脚本校验每个块的钻孔编号唯一性。5.5 人工标注与模型标注的标准漂移现象模型标注完的批次交给人工复核人工把模型标过的岩性改掉三成两边的标准越走越远。一致性校验时 Cohens Kappa 掉到 0.6 以下数据没法用。原因刚开始我让人工独立标注一遍再和模型对比结果人对岩性实体该保留多长的理解和模型完全不一致。人按自己的经验截取模型按 span_text 原文截取两边量纲不同没法对齐。解决改成预标注 人工修正的工作模式。模型先标完人工在模型结果上做修改改动的比例作为质量指标记录下来而不是让人工从头标一遍。这样标准的基准锚定在模型上人的修正逐渐把标准拉回地质业务常识两边的一致性才会收敛。6. 把标注效果守住一致性指标、抽检策略与主动学习迭代标注上线后最怕的是没有一个指标能告诉你效果是在变好还是变差。我习惯把校验分成三层第一层是自动一致性校验把标注结果转成 BIO 序列后算 Cohens Kappa人工抽检样本与模型结果的 Kappa 低于 0.7 时该批次要重新走标注第二层是针对低置信度样本的定向抽检模型输出的概率分数低于阈值的样本全部人工复核这类样本是错误高发区第三层是随机抽检每批次随机抽 5%用于评估全局质量防止定向抽检看漏了盲区。置信度阈值这个参数调起来有点玄学我一般从 0.8 起步看抽检结果的错误率分布再往下压。错误率超过 5% 就把阈值提高错误率低于 1% 就尝试降低阈值减少人工量。迭代两三轮之后人力和质量能找到一个相对稳定的平衡点。主动学习的价值在这个阶段最明显。跑过几轮标注后把模型置信度最低的那批样本优先送人工精标精标结果再回流进 few-shot 样例和训练集模型的短板会补得很快。我的一个教训是早期为了省事把高置信度样本和低置信度样本混在一起送审结果人工大量时间花在了本来就标注正确的样本上真正需要人判断的模糊样本反而滞留了。后来改成低置信度优先同样的人工投入效果明显改善。这套流程走到这里你已经具备把老地质报告从扫描件变成可训练语料的全套手段规则打底、大模型做语义清洗、Schema 约束标注、双通道校验兜底、主动学习迭代。不要指望一次性跑通就高枕无忧地质语料的地域性和报告类型差异会不断带来新问题关键是守住清洗边界和一致性指标这两个基线。希望这套方案能帮你少走一圈我之前走过的弯路。本文还有配套的精品资源点击获取
返回列表