ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

FIDIC银皮书条款结构化:从.doc到可检索JSON与责任矩阵

FIDIC银皮书条款结构化:从.doc到可检索JSON与责任矩阵 简介这份资源是FIDIC设计采购施工EPC合同条件银皮书英文原版面向国际工程总承包从业者、海外项目商务法务人员及工程管理专业师生用于查阅EPC合同标准条款原文、厘清雇主与承包商的权利义务边界。资源为单个doc文件压缩包约479KB完整保留英文目录与条款编号依次覆盖一般规定、雇主及其行政管理、承包商、设计、员工、生产设备与工艺、开工与竣工、竣工检验、雇主的接收、缺陷责任、计量与估价、变更与调整、合同价格与付款、终止与暂停、风险与职责、保险、不可抗力、索赔与争议仲裁等核心模块便于投标编制、合同谈判与条款比对时精准定位。目前已有134人学习下载适合需要中英对照研读FIDIC条款、准备国际工程合同案例分析的读者作为案头参考。1. 把银皮书当数据而不是当文档读投标截止前两小时商务在群里问银皮书里承包商核实现场数据的义务压在哪一条。翻 PDF 目录1.1 DEFINITIONS 里根本没有 Site Data靠中文直觉找「现场」会白翻英文得跳到 4.10 SITE DATA再往下4.12 UNFORESEEABLE DIFFICULTIES 才是真正的风险落点。三分钟能定位靠的不是英语好是这份 FIDIC 设计采购施工EPC合同条件银皮书英文版已经被索引化了。文件里是银皮书英文条款原文从 1 GENERAL PROVISIONS 一路排到 11 DEFECTS LIABILITY1.1 到 1.14、4.1 到 4.24每一条都能当一条独立记录来查。它适合三类人做国际工程投标的商务要按条款出偏差表做合同管理系统的开发要把条款变成可查询的结构化数据以及在谈判桌上需要秒引条款号的合同工程师。读一遍记不住上百条索引一次能查很多年。2. 银皮书条款骨架从目录到唯一 clause_id2.1 章、条两级编号与命名规律银皮书的编号是「章.条」两级章用单个数字1、4、11条用「章号.点序号」4.12没有「4.12.3」这种第三级编号。第三层含义靠条内的 (a)(b)(c) 或自然段承载所以抽 clause_id 时长度只有两种形态——一位或两位章号 一个点 一至两位序号落到库里主键用VARCHAR(8)就够。真正容易翻车的是排序。字符串排序会把1.10排在1.2前面4.24排在4.3后面任何按条号输出的报告都会乱序。排序键必须拆成数值元组。标题全部大写且多是同义重复的短名词短语FOSSILS、TAKING OVER OF PARTS OF THE WORKS、PROLONGED SUSPENSION这种写法对正则和全文检索都极友好天然就是检索锚点。2.2 目录页与正文是两套文本.doc 打开后前两屏是 CONTENTS点线连页码同一批编号在正文里再出现一次但不带页码。我一般只保留正文那份入库目录那份单独抽出来做校验基准——两边条款号集合必须完全相等不等就说明漏切或重复收录。先把这份文件的骨架数清楚后面所有校验都靠它章章名英文条款区间条数企业侧高频引用1GENERAL PROVISIONS1.1–1.14141.5 文件优先顺序、1.10 雇主使用承包商文件2THE EMPLOYER2.1–2.552.4 雇主的资金安排3THE EMPLOYERS ADMINISTRATION3.1–3.553.5 Determinations4THE CONTRACTOR4.1–4.24244.10 现场数据、4.11 价格充分性、4.12 不可预见困难5DESIGN5.1–5.885.1 设计义务、5.8 设计错误6STAFF AND LABOUR6.1–6.11116.4 劳动法7PLANT, MATERIALS AND WORKMANSHIP7.1–7.887.3 检查、7.5 拒收8COMMENCEMENT, DELAYS AND SUSPENSION8.1–8.12128.4 竣工时间延长、8.7 误期损害赔偿9TESTS ON COMPLETION9.1–9.449.4 未通过竣工试验10EMPLOYERS TAKING OVER10.1–10.3310.1 接收工程与区段11DEFECTS LIABILITY11.1–11.111111.3 缺陷通知期延长、11.9 履约证书合计 105 条。这个数字是后面切分脚本的黄金基准。提示这份文件的目录在 11.11 CLEARANCE OF SITE 处截断落地前先确认正文是否也只到第 11 章别默认后面章节齐全。2.3 用正则切出条款号与标题目录行和正文行必须用两套正则混用会把正文里「见 4.12」这类引用句当成标题import re # 目录行1.1 DEFINITIONS......................1 TOC_RE re.compile( r^\s*(?Pclause\d{1,2}\.\d{1,2})\s r(?Ptitle[A-Z][A-Z0-9 ,\-()/\]{3,90}?)\s*\.{3,}\s*(?Ppage\d{1,3})\s*$ ) # 正文标题行4.12 Unforeseeable Difficulties标题大小写不定行内无页码 BODY_RE re.compile( r^\s*(?Pclause\d{1,2}\.\d{1,2})\s r(?Ptitle[A-Z][A-Za-z0-9 ,\-()/\]{3,90})\s*$ ) def sort_key(clause_id: str) - tuple: 按数值排序避开 1.10 1.2 的字符串顺序错误 ch, _, sub clause_id.partition(.) return int(ch), int(sub)参数逐个说清楚\d{1,2}限制章号位数防止把 11.11 误切成 1.11\.{3,}要求至少三个点因为目录点线通常几十个点而正文标题后不会出现点$锚定行尾挡掉正文中以条号开头但后面还跟着句子的段落标题以[A-Z]开头是因为原文标题全大写能过滤掉一部分含数字的正文行。注意若转换工具保留了制表符目录行的点线可能被拆成「点 Tab」把\.{3,}换成[\s.]{3,}更稳。3. 从 .doc 到结构化 JSON转换、清洗与字段设计3.1 .doc 二进制的转换路径.doc 是 OLE 复合文档python-docx 只吃 .docx直接 read 会报格式错误。常见做法两条LibreOffice headless 转换或者 antiword / catdoc 抓文本。我一般走第一条跨平台、换行结构保留得比较好# -env 指定独立配置目录避免并发转换时多个进程争抢同一个用户配置 soffice --headless \ -env:UserInstallationfile:///tmp/lo_fidic \ --convert-to txt:Text (encoded):UTF8 \ --outdir /data/fidic /data/fidic/FIDIC EPC Silver Book.doc参数含义--headless无界面运行-env:UserInstallation隔离用户配置目录批量或并发转换时不加会偶发静默失败txt:Text (encoded):UTF8强制 UTF-8 输出避免在 Windows 环境下转出 GBK 再乱码--outdir指定独立输出目录防止中间产物覆盖源文件同名内容。注意容器里跑 soffice要先确保配置目录可写否则进程直接退出而且不一定给出明确报错。3.2 清洗顺序不能颠倒转换后典型噪声三类目录点线、单独成行的页码、页眉里的文件名与页码。清洗顺序必须是「先删页眉页脚 → 再删纯数字行 → 最后处理点线」。顺序颠倒会把正文里的条号行当成页码误删import re NOISE_RE re.compile(|.join([ r^\s*\d{1,3}\s*$, # 单独成行的页码 r^\s*FIDIC.*Silver.*Book.*$, # 页眉里的文件名 r^\s*Page\s\d\s*$, ]), re.I | re.M) def clean(raw: str) - str: text NOISE_RE.sub(, raw) text re.sub(r\.{3,}\s*\d{1,3}, .... , text) # 目录点线压成标记 text re.sub(r\n{3,}, \n\n, text) # 压缩连续空行 return text.strip()把三类噪声合并成一条正则一次扫描比反复re.sub快得多。点线那段故意保留....标记而不是删干净是为了让后面的切分逻辑能区分「目录行」和「正文标题行」——两种行的处理结果完全不同一个只取编号和页码一个要连同正文段落一起收。3.3 字段设计与 JSON 结构字段别只设计 clause_id 和正文企业在做合同管理时会按条长、版本、来源页反查字段类型说明示例clause_idstring唯一键「章.条」4.12chapter_noint章号便于按章聚合4title_enstring原始标题保留大小写形态Unforeseeable Difficultiestitle_upperstring标准化大写标题检索用UNFORESEEABLE DIFFICULTIESbody_entext条款正文段间保留换行—char_lenint正文字符数异常短的多半切错812doc_versionstring文件版本标识支持多版本共存silver_en_uploaded单条记录长这样{ clause_id: 4.11, chapter_no: 4, title_en: Sufficiency of the Contract Price, title_upper: SUFFICIENCY OF THE CONTRACT PRICE, body_en: The Contractor shall be deemed to have satisfied itself as to the correctness and sufficiency of the Contract Price..., char_len: 486, doc_version: silver_en_uploaded }char_len这个字段看着无用实际是切分质量的第一道体检项整份文件里正文长度低于 50 字符的条目基本都是标题被重复收录或者正文被页码切断跑一次排序就能挑出来人工过一遍。4. 条款责任矩阵把英文条款落进企业合同流程4.1 银皮书的风险分配取向银皮书是 EPC 交钥匙模板设计、采购、施工压给同一个承包商风险分配明显偏向雇主。现场数据核实、合同价格充分性、不可预见困难这几条在偏单价类的模板里还能摆到桌面上谈在银皮书里基本是承包商兜底。所以条款库如果不带「责任方」字段查出来只是一堆英文句子落不到企业的评审流程上。具体谈的时候英文用词会误导人。4.11 的措辞是shall be deemed to have satisfied itself——「视为已确认」这是法律上的拟制不是事实推定签字后再主张「当时没算清」几乎没有空间。企业侧的做法是把这条变成报价复核单上的一个必签栏位而不是躺在合同附件里的英文段落。4.2 关键条款到控制点的映射clause_id英文标题责任方企业控制点4.10SITE DATACONTRACTOR投标前现场踏勘记录归档含地下管线资料索取凭证4.11SUFFICIENCY OF THE CONTRACT PRICECONTRACTOR报价复核单必须签字确认价格充分性4.12UNFORESEEABLE DIFFICULTIESCONTRACTOR索赔通知时限台账按合同约定时限设置提醒5.1GENERAL DESIGN OBLIGATIONSCONTRACTOR设计输入评审记录业主提供资料的接收签收单5.8DESIGN ERRORCONTRACTOR图纸会审留痕设计错误不得作为免责理由7.5REJECTIONEMPLOYER拒收通知与返工成本归属登记8.7DELAY DAMAGESCONTRACTOR误期损害赔偿与履约保函扣减联动11.3EXTENSION OF DEFECTS NOTIFICATION PERIODEMPLOYER缺陷通知期延长的触发条件登记「责任方」这一列不是抄来的是从条款文本的主语和情态动词判出来的主语是 Contractor 且动词是 shall 的责任在承包商主语是 Employer 的权利在雇主。个别条如 7.5 REJECTION主语是雇主但后果落在承包商的成本和工期上要在控制点里体现双向影响。4.3 用 SQL 建库并跑交叉查询CREATE TABLE fidic_clause ( clause_id VARCHAR(8) PRIMARY KEY, -- 如 4.12 chapter_no INT NOT NULL, -- 如 4 title_en VARCHAR(160) NOT NULL, body_en TEXT, risk_owner VARCHAR(16), -- CONTRACTOR / EMPLOYER / SHARED control_point VARCHAR(64), -- 企业内部流程节点 doc_version VARCHAR(32) -- 版本标识支持多版本共存 ); -- 按章、条数值顺序输出承包商侧高风险条款 SELECT clause_id, title_en, control_point FROM fidic_clause WHERE risk_owner CONTRACTOR AND clause_id IN (4.10,4.11,4.12,5.1,5.8,8.7,11.2) ORDER BY CAST(SUBSTRING_INDEX(clause_id, ., 1) AS UNSIGNED), CAST(SUBSTRING_INDEX(clause_id, ., -1) AS UNSIGNED); -- 找缺口承包商担责但企业还没配控制点的条款 SELECT clause_id, title_en FROM fidic_clause WHERE risk_owner CONTRACTOR AND (control_point IS NULL OR control_point );ORDER BY里那两行CAST(... AS UNSIGNED)就是 2.1 节埋的坑在 SQL 侧的解法不写会输出 4.10、4.11、4.12、4.1 这种乱序。第二个查询是日常最有用的一个——它直接告诉你条款库里哪些风险还没有对应的内部动作投标前的偏差表就是从这里长出来的SELECT c.clause_id, c.title_en, IFNULL(d.deviation_note, 待商务确认) AS deviation_note FROM fidic_clause c LEFT JOIN bid_deviation d ON d.clause_id c.clause_id WHERE c.risk_owner CONTRACTOR;LEFT JOIN保证没有偏差记录的条款也会出现IFNULL把它标成待办导出的 Excel 直接就能当投标评审会的清单用。5. 条款级检索、校验与版本比对5.1 用 ripgrep 做标题级检索条款库建好之后日常最高频的操作还是「在英文原文里快速定位」。直接在纯文本上做锚点检索比查库快# 前置条号锚点只命中标题行-A 8 带出后续正文用于人工确认 rg -n -i -A 8 ^\s*(1[0-1]|[1-9])\.\d{1,2}\s.*(site data|unforeseeable|sufficiency) \ fidic_epc_silver_en.txt如果去掉行首的条号锚点正文段落里所有提到 site data 的句子都会被命中噪声会盖掉信号。-A 8带出 8 行正文是因为这几条的正文都超过 6 行看前 3 行往往还没到关键句。5.2 三项验收校验切分完不要直接入库先跑三项校验基准计数章数 11、条款数 105从文件目录数出来的基准值集合一致性目录抽出的编号集合与正文抽出的编号集合必须相等差集非空就是漏切抽样人工核对建议固定抽 4.12、5.8、11.3 这三条它们被引用频率最高切错代价最大。def verify(toc_ids, body_ids): miss sorted(set(toc_ids) - set(body_ids), keysort_key) # 目录有、正文没切到 dup sorted({i for i in body_ids if body_ids.count(i) 1}, keysort_key) return miss, dup # miss 非空 - 正文切分漏行dup 非空 - 目录与正文被同时收录进库dup这一项最容易被忽略。转换后的文本里目录和正文都在若切分时没按....标记分流同一条会被收两遍而主键冲突往往被INSERT IGNORE悄悄吞掉最后表现为条款数凑不齐 105却查不出少在哪。5.3 版本比对的土办法同一份银皮书拿到不同修订版本要合并条款库时别急着写 diff 脚本。把两边都规范成「条号 标题」一行的格式再用系统自带工具比# 只保留条号与标题输出规范行 awk /^[0-9]\.[0-9] /{print $1\t$0} old.txt old.norm awk /^[0-9]\.[0-9] /{print $1\t$0} new.txt new.norm # 统一格式后再比只看增删改的行 diff -u old.norm new.norm | rg ^[-][^-]统一成「一行为一条」之后diff输出里带的是新版新增或改写标题的条款带-的是被删掉的配合 5.2 的sort_key排序键几分钟就能拉出一份版本差异清单。这个办法比肉眼对两版目录可靠得多尤其适合条款标题只改了几个单词、肉眼一扫就漏过去的场景。本文还有配套的精品资源点击获取
返回列表