
简介《数据产业图谱高清版》是一份面向数据产业研究、企业选型与行业分析场景的PDF图谱适合需要快速了解数据资源、数据应用、数据服务、数据技术及数据基础设施等板块分类的从业者与学生。压缩包内为1个PDF文件大小约24.09MB高清版便于查看企业名称与领域划分。已有344人学习说明其对产业全景梳理具有一定参考价值。内容按公共数据资源、互联网数据资源、行业数据资源以及城市治理、工业、交通、金融、医疗健康、能源、农业等应用方向展开并覆盖数据合规、交易、经纪、认证、咨询、资产评估等服务环节同时列出大数据平台、智能算法、智能芯片、数据存储、可视化、区块链、隐私计算、云平台与数据安全等技术设施类别。读者可据此建立产业链地图、查找细分赛道代表机构、辅助方案调研与汇报材料整理。1. 数据产业图谱高清版.pdf先想清楚你要从里面拿走哪张表拿到《数据产业图谱高清版.pdf》的人常见动作是从头翻到尾然后把它归到“参考资料”。真要用起来先问一句你要从里面拿走哪张表这份图谱按数据资源企业、数据应用企业、数据服务企业、数据技术企业、数据基础设施企业以及交易中心等类别罗列了大量主体适合做区域产业摸底、招商线索筛选、竞品盘点和方案底稿不适合替代实时工商数据。把它当“可读的PDF”只能看个热闹把它拆成“主体-类目-来源页”的表才能做统计和复核。这一步不难但顺序错了后面全是返工。2. 把PDF拆成可计算文本文本层体检、pdfplumber与OCR的取舍2.1 先做文本层体检为什么不能上来就OCRPDF分两类文本型PDF和扫描型PDF。文本型PDF里的字是字符对象直接抽就能拿到扫描型PDF本质是图片必须走OCR。很多人一上来就OCR结果把本来清晰的文本层又识别了一遍错字反而更多。我的习惯是先跑一遍页级体检看每页能抽出多少字符、替换符多不多、空白页占比高不高再决定哪几页补OCR。体检指标不用搞得太复杂关键看三个数每页去空白后的字符数、替换符和方框符数量、连续空页数量。字符数突然掉到个位数或者替换符明显增多基本就是扫描页或字体嵌入有问题。名单页尤其要单独看因为名单页经常是分栏排版文本层顺序未必等于阅读顺序。体检指标经验阈值动作每页字符数少于50且页面有内容标记为候选OCR页替换符/方框符单页超过5个检查字体嵌入必要时OCR连续空页连续2页以上确认是否插页或图片页可选中文字整页无法选中直接走OCR提示文本层体检不要只看第一页目录页、名单页、附录页的版面经常不一样。import pdfplumber from pathlib import Path pdf_path Path(data_industry_map.pdf) out_dir Path(work/page_text) out_dir.mkdir(parentsTrue, exist_okTrue) with pdfplumber.open(pdf_path) as pdf: for i, page in enumerate(pdf.pages, start1): # x_tolerance 调小一点避免把相邻词粘成一个词 # y_tolerance 控制行合并名单页不要放太大 text page.extract_text(x_tolerance1.5, y_tolerance3) or chars len(text.replace(\n, )) bad text.count(\ufffd) text.count(□) with open(out_dir / fpage_{i:03d}.txt, w, encodingutf-8) as f: f.write(text) print(fpage{i:03d} chars{chars} bad{bad})这段代码做的是“页级体检加中间态落盘”不是最终抽取。x_tolerance调小会让字符切分更保守适合字距紧的名单页调大容易把“数据 资源”粘成“数据资源”但也可能把两列文字连在一起。y_tolerance控制同一行文字的合并范围默认值在普通正文上问题不大名单页建议先按3跑一遍再根据串行情况微调。bad统计的是替换符和方框符数量异常升高通常意味着字体没嵌入或页面是图片。2.2 用pdfplumber抽页级文本与词坐标只抽纯文本不够名单页一旦分栏纯文本会按坐标顺序输出读起来像被洗过牌。extract_words()能拿到每个词的x0、x1、top、bottom有了坐标就能先分栏再排序。分栏的逻辑不复杂同一栏里的词x0波动范围小栏与栏之间会出现明显的横向间隔。按页宽的百分比做粗聚类比硬编码像素值更稳。下面的代码先把每页的词坐标取出来再按x0聚类分栏最后按“栏内从上到下、从左到右”的顺序拼回文本。这里的gap_ratio是栏间距阈值我一般从0.06开始试名单页密集时调到0.04正文页可以放到0.08。这个参数没有万能值得看实际版面。import pdfplumber from pathlib import Path def cluster_columns(words, page_width, gap_ratio0.06): if not words: return [] # 按 x0 排序后相邻词间距超过页宽阈值就切新栏 words sorted(words, keylambda w: (w[x0], w[top])) gap page_width * gap_ratio columns, current [], [words[0]] for w in words[1:]: if w[x0] - current[-1][x1] gap: columns.append(current) current [w] else: current.append(w) columns.append(current) return columns def page_text_by_column(page): words page.extract_words(use_text_flowFalse, keep_blank_charsFalse) columns cluster_columns(words, page.width, gap_ratio0.06) lines [] for col in columns: col sorted(col, keylambda w: (round(w[top], 1), w[x0])) buf, last_top [], None for w in col: if last_top is None or abs(w[top] - last_top) 3: buf.append(w[text]) else: lines.append(.join(buf)) buf [w[text]] last_top w[top] if buf: lines.append(.join(buf)) return \n.join(lines) with pdfplumber.open(data_industry_map.pdf) as pdf: for i, page in enumerate(pdf.pages, start1): txt page_text_by_column(page) Path(fwork/page_text/page_{i:03d}_col.txt).write_text(txt, encodingutf-8)这段代码的关键在cluster_columns它不追求完美分栏只解决“同一页两栏文字被交叉读取”的问题。gap_ratio越小越容易把一栏切成两栏越大越容易把两栏并成一栏。名单页的阅读顺序是PDF提取里最玄学的一环遇到串行先别怀疑代码拿原文页对照一下栏间距通常调一个参数就能回来。round(w[top], 1)是为了让同一行的微小坐标差归到一行避免一行被拆成好几段。2.3 版面分栏与阅读顺序名单页最容易串行名单页的典型结构是“分类标题 多栏企业名”。分类标题通常横跨整页企业名在下面分两栏或三栏排。纯文本抽取会按字符流顺序走可能先读左栏第一行再读右栏第一行再回到左栏第二行最后拼出来的名单看似完整实际顺序全乱。顺序一乱后面按行切分就会把两个企业名粘在一起或者把一个企业名切成两半。处理办法是先把页面切成“标题区”和“名单区”。标题区用横跨页宽的大字号或加粗文本识别名单区再按栏切。标题区不一定能靠字体大小判断PDF里字体信息经常丢所以更稳的做法是看文本行宽度横跨页宽80%以上的短行大概率是分类标题宽度只占一栏的短行大概率是名单行。这个规则不绝对但足够把大部分页面拆开。如果页面是扫描件分栏信息只能靠OCR的检测框拿。常见做法是用OCR返回的文本框坐标做同样的聚类再按栏拼接。OCR选型上Tesseract适合干净印刷体PaddleOCR对中文版面更友好但部署重一些。我的建议是文本层可用的页面坚决不OCR只有体检不过的页面才补不要把整份PDF无脑丢进OCR。2.4 输出中间态每页一个txt加元数据中间态要保留页码这是后面抽样回查的“后悔药”。没有页码发现问题只能整份重跑有了页码抽10%回查原文页几分钟就能定位是抽取问题还是原文问题。中间态至少留三类文件页级纯文本、页级分栏文本、页级元数据CSV。元数据里记页码、字符数、替换符数、是否OCR、分栏数后面做质量报表直接读这张表。import csv from pathlib import Path rows [] for p in sorted(Path(work/page_text).glob(page_*_col.txt)): page_no int(p.stem.split(_)[1]) text p.read_text(encodingutf-8) rows.append({ page: page_no, chars: len(text.replace(\n, )), lines: len([x for x in text.splitlines() if x.strip()]), has_replacement: \ufffd in text or □ in text, source: str(p), }) with open(work/page_meta.csv, w, newline, encodingutf-8-sig) as f: writer csv.DictWriter(f, fieldnamesrows[0].keys()) writer.writeheader() writer.writerows(rows)这张元数据表不参与最终统计但它是排查的入口。比如某几页chars突然很低先看has_replacement再回原文页看是图片还是字体问题某几页lines特别多可能是分栏切得太碎需要把gap_ratio调大。source字段保留文件路径后面做增量更新时可以直接比对哪些页面变了。中间态不要嫌多等你要给汇报材料找依据时就知道这几张表比一句“我抽过了”有用得多。3. 从名单段落抽结构化表字段设计、分类映射与规则抽取3.1 字段设计别只存企业名只存企业名的表看着干净用起来很痛苦。你没法回答“这个主体属于哪个一级类目”“它出现在第几页”“它是原文原样还是我改过的”。我一般至少留这些字段原文名称、匹配键、一级类目、二级类目、区域线索、来源页、抽取方式、置信度、复核标记。原文名称不改匹配键单独生成后面去重和比对都用匹配键不覆盖原值。字段作用维护规则company_raw保留原文原样不删括号、不改错字match_key去重和比对去空白、统一括号、去后缀category_l1一级类目固定词典不随意新增category_l2二级类目可留空允许扩展region_hint区域线索只做提示不强行补全source_page来源页必填回查用extract_method抽取方式text/ocr/rule/manualconfidence置信度规则给分人工可改review_flag复核标记0/1默认0另一个容易踩的坑是“一行一个主体”。原文里一个主体可能同时出现在数据资源企业和数据基础设施企业下面按一行一个主体存后面的类目会把前面的覆盖掉。更稳的结构是“主体-类目”长表一个主体可以有多行每行一个类目统计时再按口径去重。这样你既能算“有多少个主体”也能算“有多少个类目挂载”两个数不是一回事汇报时要说清楚。3.2 分类映射一级类目固定二级类目留扩展位一级类目直接跟原文的章节走数据资源企业、数据应用企业、数据服务企业、数据技术企业、数据基础设施企业、交易中心/交易所。这六类不要临时发明发明了后面汇总对不上原文。二级类目可以细比如数据应用下面分城市治理、工业、交通、金融、医疗健康、商业、能源、农业等这些词在原文里有线索抽不到就留空不要硬猜。一级类目判定线索常见误判数据资源企业章节标题含“数据资源”把资源型公司和应用型公司混在一起数据应用企业章节标题含“数据应用”二级行业词被当成企业名数据服务企业章节标题含“数据服务”咨询、评估、经纪混为一类数据技术企业章节标题含“数据技术”技术平台和芯片公司边界模糊数据基础设施企业章节标题含“数据基础设施”云平台、算力、安全混在一起交易中心/交易所名称含“交易中心/交易所”当成普通企业统计分类映射我一般用“词典加权规则”不用模型硬猜。规则看三个位置所在章节标题、名称后缀、上下文关键词。章节标题权重最高名称后缀次之上下文只做补充。比如名称里有“交易所”但章节在数据服务企业下面也要单独标成交易中心/交易所统计时分开。二级类目允许空空着比猜错好猜错了后面做行业分布结论会偏得很难看。3.3 用规则词典抽企业名正则边界与停用词名单段落切分最怕两件事一是分隔符不统一有的用顿号有的用逗号有的用换行二是括号里有逗号直接按逗号切会把一个名字切成两半。我的做法是先按换行和明显分隔符切再用括号配对做一次保护最后用停用词表过滤章节标题和说明性短语。停用词表要包含“数据资源企业”“数据应用企业”“数据服务企业”“数据技术企业”“数据基础设施企业”这些标题词不然它们会被当成企业名收进来。import re STOP_WORDS { 数据资源企业, 数据应用企业, 数据服务企业, 数据技术企业, 数据基础设施企业, 交易中心, 交易所, 城市治理, 工业大数据, 交通大数据, 金融大数据, 医疗健康大数据, 商业大数据, 能源大数据, 农业大数据, } SUFFIX_HINTS ( 数据, 科技, 信息, 智能, 网络, 软件, 电子, 集团, 研究院, 中心, 事务所, 平台, 云计算, 半导体, ) def split_candidates(text): # 先按换行、顿号、逗号、分号切括号内的逗号先保护 protected re.sub(r[(][^)]*[)], lambda m: m.group(0).replace(, §).replace(,, §), text) parts re.split(r[\n、,;]|(?!\d)\.(?!\d), protected) return [p.replace(§, ).strip() for p in parts if p.strip()] def keep_company(s): if not (2 len(s) 40): return False if s in STOP_WORDS: return False if re.fullmatch(r[0-9\W], s): return False return any(x in s for x in SUFFIX_HINTS) raw 数据资源企业 示例数据科技有限公司、某区域数据服务有限公司研究院、示例信息集团 数据应用企业 城市治理、工业大数据、示例智能科技有限公司 candidates [x for x in split_candidates(raw) if keep_company(x)] print(candidates)这段代码不是万能抽取器它解决的是“段落里候选名太多、人工挑不过来”的问题。split_candidates先用占位符把括号里的逗号保护起来切完再还原避免把“某区域数据服务有限公司研究院”切成两段。keep_company用长度、停用词、后缀线索做粗筛宁可多留一些进人工复核也不要把明显不对的收进来。后缀线索是经验词典不是官方规则遇到新行业词直接往SUFFIX_HINTS里加不要改主流程。3.4 批量落表与抽样复核批量落表时每个候选名都要带上来源页和所在类目。来源页从文件名或元数据里取类目从最近的章节标题继承。继承逻辑要处理“标题行”和“名单行”的区分标题行通常短、不含后缀词、出现在页面顶部或段落开头名单行通常含分隔符、长度更长。规则不可能百分之百准所以落表后必须抽样复核。import csv import re from pathlib import Path rows [] for p in sorted(Path(work/page_text).glob(page_*_col.txt)): page_no int(p.stem.split(_)[1]) current_l1 for line in p.read_text(encodingutf-8).splitlines(): line line.strip() if not line: continue # 标题行短、命中一级类目词 if len(line) 12 and any(k in line for k in [数据资源企业, 数据应用企业, 数据服务企业, 数据技术企业, 数据基础设施企业, 交易中心]): current_l1 line continue for cand in split_candidates(line): if keep_company(cand): rows.append({ company_raw: cand, category_l1: current_l1, source_page: page_no, extract_method: rule, confidence: 0.7, review_flag: 0, }) with open(work/companies_raw.csv, w, newline, encodingutf-8-sig) as f: writer csv.DictWriter(f, fieldnamesrows[0].keys()) writer.writeheader() writer.writerows(rows)落表后先看三张报表总行数、空类目行数、每页行数分布。总行数突然比预期少通常是切分规则太严空类目行数多通常是标题继承没接上每页行数分布极端通常是分栏顺序出了问题。抽样复核按10%抽固定随机种子保证每次可复现。复核时不要只看表要回原文页看上下文尤其是括号里带区域、带“研究院”、带“集团”的名字这些是最容易归一化过头的。4. 企业名称清洗与去重括号、别名和同名不同主体的处理顺序4.1 清洗顺序先归一再匹配清洗顺序错了后面全是血泪。正确顺序是保留原值、去不可见字符、统一括号、去多余空白、生成匹配键、分块、模糊匹配、人工复核。不要一上来就全量模糊匹配也不要在原值上直接改括号和区域前缀。原值是证据匹配键是工具两者混在一起回查时你都不知道自己改过什么。import re def normalize_name(name: str) - str: s name.strip() s s.replace(, ().replace(, )) s re.sub(r[\u200b\u200c\u200d\ufeff], , s) s re.sub(r\s, , s) s re.sub(r[·•], , s) return s def match_key(name: str) - str: s normalize_name(name) # 只在匹配键里尝试去常见后缀原值不动 s re.sub(r(有限责任公司|有限公司|股份有限公司|集团)$, , s) return s print(normalize_name(示例数据科技某区域有限公司)) print(match_key(示例数据科技有限公司))normalize_name只做无害归一化统一全半角括号、去零宽字符、去空白、去间隔点。match_key在归一化基础上再去常见后缀目的是让“示例数据科技有限公司”和“示例数据科技某区域有限公司”能进同一个候选组。注意去后缀只在匹配键上做原值必须保留否则后面回查原文页会对不上。区域前缀的去法要更谨慎不要直接正则删“某省某市”因为有些名字里的区域词是品牌的一部分删了就变成另一个主体。4.2 括号、后缀与区域前缀的处理括号里可能是区域、业务说明、曾用名、分支机构不能一刀切。我的处理是括号内容保留在原值里匹配键里按规则尝试去掉“区域型括号”但保留“业务型括号”。区分方法看括号内是否命中行政区划词典或“分公司/研究院/中心”这类组织词。命中行政区划的匹配键去掉命中业务词的匹配键保留。这个规则不完美但比全删或全留都稳。原值示例匹配键示例风险示例数据科技某区域有限公司示例数据科技区域括号去掉后可能和外地主体混淆示例数据科技研究院有限公司示例数据科技研究院业务括号保留避免误合并示例数据集团有限公司示例数据去集团后可能和子公司混淆某区域示例数据服务有限公司示例数据服务区域前缀去掉后匹配面变大后缀处理也一样不要把所有“集团”都当成冗余。集团和子公司是不同主体匹配键去“集团”只用于找候选不用于直接合并。最终是否合并要看来源页、类目、上下文和人工复核。同名不同主体在产业图谱里很常见尤其是“某区域数据科技有限公司”这种结构区域词一换就是另一家。我的原则是匹配键只负责把候选拉进复核队列不负责下结论。4.3 用rapidfuzz做候选对不要直接全量模糊匹配全量模糊匹配的复杂度是平方级几千条还能跑几万条就等得难受而且结果里全是低分噪声。更稳的做法是先分块再在块内匹配。分块键可以用匹配键前两个字、后缀词、区域线索任意一个能缩小范围都行。块内用rapidfuzz的token_set_ratio它对词序和重复词更宽容适合公司名这种带括号和后缀的文本。from rapidfuzz import fuzz, process names [ 示例数据科技有限公司, 示例数据科技某区域有限公司, 示例数据服务有限公司, 某区域示例智能科技有限公司, ] keys [match_key(x) for x in names] # 先按前两个字分块块内再模糊匹配 blocks {} for i, k in enumerate(keys): blocks.setdefault(k[:2], []).append(i) pairs [] for block in blocks.values(): for i in block: for j in block: if i j: continue score fuzz.token_set_ratio(keys[i], keys[j]) if score 90: pairs.append((names[i], names[j], round(score, 1))) for p in pairs: print(p)这段代码故意把阈值放在90不是为了自动合并而是为了控制复核量。90分以上的候选对通常已经很像85到90之间留给人工判断。token_set_ratio对“示例数据科技”和“示例数据科技某区域”这类包含关系比较友好但对“示例数据科技”和“示例数据服务”这种只差一个词的也会给不低的分所以不能只看分数。分块键用前两个字不是唯一解也可以按后缀词分块或者按区域线索分块目标都是把候选对从全量平方降到可接受范围。4.4 人工复核队列怎么排复核队列要排序不要从第一行开始硬看。优先级最高的信号是分数在85到95之间、长度差超过6个字、括号内容不同、跨一级类目。这四类最容易出“看似同一家、实际不同主体”的情况。优先级最低的是分数98以上且后缀一致、来源页相邻、类目相同的候选对这些可以直接标“高置信”抽几组确认就行。优先级信号处理动作高分数85-95长度差6回查来源页看上下文高括号内容不同判断是区域、业务还是曾用名高跨一级类目保留多类目不强行合并中分数95-98后缀不同看是否集团/子公司关系低分数98后缀一致抽检后标高置信复核时建议加两列merge_decision和merge_note。merge_decision只填“合并/不合并/待定”merge_note写依据比如“来源页不同括号内为业务说明保留两条”。不要只改匹配键不留痕过两周你自己都不记得为什么合了。人工复核不是一次性工作图谱更新后还要复用这套队列所以规则和备注要能传给下一个人。5. 避坑与复核五类翻车现场和一套验收脚本5.1 现象CtrlF能搜到抽出来却乱序或断字现象很典型PDF阅读器里搜索“数据”能命中抽成文本后名单顺序乱了或者“数据资源”变成“数 据 资 源”。原因通常不是OCR而是文本层里的字距、分栏和文本框顺序。PDF的字符流顺序和视觉阅读顺序本来就不一回事名单页多栏排版时尤其明显。解决顺序是先调x_tolerance和y_tolerance再用词坐标分栏最后才考虑OCR。调参时不要一次改多个先改x_tolerance看断字是否减少再改gap_ratio看串行是否回来。如果分栏后仍然乱回原文页看是不是有隐藏文本框或页眉页脚干扰把页眉页脚先裁掉再抽。5.2 现象同一主体出现多次汇总数虚高现象是总行数看着不少去重后少了一截或者同一个主体在不同类目下各算一次汇报时数对不上。原因通常是括号区域、后缀差异、换行截断三件事叠加。比如原文里一个名字被换行切成两行第二行只剩“有限公司”规则抽取时可能把它当成独立候选再比如同一主体在数据资源企业和数据基础设施企业下各出现一次长表里就是两行。解决办法是保留“主体-类目”长表统计时明确口径按主体去重算一家按类目挂载算多条。去重时先用匹配键分块再模糊匹配最后人工复核不要直接drop_duplicates原值那样括号一改就漏。5.3 现象一级类目汇总对不上原文现象是六个一级类目加起来的数量比原文名单少或者某个类目突然多出一截。原因多半是标题继承断了名单页跨页时第二页开头没有重复标题抽取脚本把第二页的名单挂到了空类目或上一页最后一个类目。解决办法是维护一个“跨页类目状态”每页开始时先找页面顶部的标题行找不到就继承上一页最后一个类目同时在元数据里记category_inherited标记。汇总前跑一次空类目检查空类目行数超过5%就停下来看不要带着空类目做统计。5.4 现象OCR把“数据”认成“数搪”名单少一截现象是扫描页OCR后出现一批奇怪的名字比如“数搪”“数椐”或者整段名单只出来一半。原因是扫描分辨率不够、字体太细、页面有底纹OCR把形近字认错。解决办法是先把扫描页提到300dpi做灰度化和二值化再用中文词典做后纠错。纠错不要全局替换只对高频错误词做定向替换比如把“数搪”改回“数据”改完必须抽原文页核对。OCR结果一定要保留extract_methodocr后面统计时单独看OCR页的准确率不要和文本层抽取混在一起算。5.5 现象把交易中心当普通企业统计现象是“企业总数”里混进了交易中心、交易所做赛道分布时这些主体被算进数据服务企业结论偏得很奇怪。原因是交易中心在原文里常和 data 服务企业排在一起名称里又有“数据”“服务”字样规则容易误收。解决办法是单独建“交易中心/交易所”一级类目名称命中“交易中心”“交易所”就优先归到这一类不再参与普通企业统计。如果原文确实把它列在数据服务企业下面保留一条普通类目记录同时加一条交易中心标记统计时按口径选择不要直接删。5.6 一套可重复的验收脚本验收不要靠肉眼写个小脚本每次跑完抽取都输出同一组指标。重点看总行数、空主体名、重复主体名、无来源页、一级类目数、抽样复核文件是否生成。指标不追求绝对漂亮追求“每次都能对比”。这次总行数比上次少20%你就知道要回去看切分规则空来源页突然变多说明页码继承断了。import pandas as pd df pd.read_csv(work/companies_raw.csv) checks { 总行数: len(df), 空主体名: int(df[company_raw].isna().sum()), 重复主体名: int(df[company_raw].duplicated().sum()), 无来源页: int(df[source_page].isna().sum()), 一级类目数: int(df[category_l1].nunique()), } print(checks) # 固定随机种子保证每次抽到同一批方便对比 sample df.sample(frac0.1, random_state42) sample.to_csv(work/review_sample.csv, indexFalse, encodingutf-8-sig)frac0.1是抽样比例名单量大时可以降到0.05量小时提到0.2。random_state42不是玄学是为了让每次验收抽到同一批改规则后能直接对比差异。验收表里再加一列“复核结论”人工填“通过/不通过/待查”下次更新图谱时先看上次不通过的样本有没有复发。验收脚本不解决抽取问题但它能把“感觉差不多”变成“这次和上次差在哪”。6. 进阶用法把图谱做成可增量复用的产业底稿这份PDF最大的价值不是一次性统计而是做成可增量复用的底稿。我的做法是维护一张最小表主体原值、匹配键、能力标签、来源页。四列就够用后面所有分析都从这张表派生。主体原值不动匹配键用于跨版本比对能力标签存一级类目和二级类目来源页保证可回查。每次拿到新版图谱不重新造表先跑抽取再用匹配键做集合差输出新增、删除、改名三类清单。字段作用维护规则主体原值证据不修改保留括号和错字匹配键版本比对归一化后生成不覆盖原值能力标签分类分析一级固定二级可扩展来源页回查必填OCR页单独标记增量比对时先看新增主体集中在哪些类目再看删除主体是不是改名而不是真的消失。改名判断用匹配键相似度加来源页上下文分数高且类目一致的标“疑似改名”不要直接当新增。每次比对完抽10%回查原文页重点看跨类主体和交易中心这两类最容易在版本之间换位置。从那以后我每次拿到这类PDF图谱都先跑页级文本体检再抽10%回查原文页最后才敢把汇总数放进汇报材料。希望帮到你。本文还有配套的精品资源点击获取