scripts/strip_meta.py
2.0 KB| 1 | #!/usr/bin/env python3 |
| 2 | """剥离 _meta 数据文件中的逐字原文字段,保留纯数值统计。 |
| 3 | |
| 4 | 版权面在文本字段(标题、机构、首末句、提领句),不在数值字段。 |
| 5 | 剥完的文件仍可支撑参数复算,但无法反查源篇目。 |
| 6 | |
| 7 | 用法: python3 strip_meta.py # 原地改写 |
| 8 | python3 strip_meta.py --dry-run # 只报告 |
| 9 | """ |
| 10 | import json, sys |
| 11 | from pathlib import Path |
| 12 | |
| 13 | ROOT = Path(__file__).resolve().parent.parent |
| 14 | |
| 15 | # 文件 → 要剥掉的字段 |
| 16 | STRIP = { |
| 17 | '公文语料/_meta/all_pieces.json': ['title', 'org', 'first_sent', 'last_sent', 'h1_list'], |
| 18 | '党建语料/_meta/l2_struct.json': ['title', 'leads', 'subs'], |
| 19 | } |
| 20 | # 剥完只剩计数字段、信息量不足以独立存在的文件 |
| 21 | DELETE = ['党建语料/_meta/l2_leads.json'] |
| 22 | |
| 23 | |
| 24 | def strip_file(rel, fields, dry): |
| 25 | path = ROOT / rel |
| 26 | if not path.exists(): |
| 27 | print(f' 跳过(不存在): {rel}') |
| 28 | return |
| 29 | items = json.loads(path.read_text(encoding='utf-8')) |
| 30 | removed = {f: 0 for f in fields} |
| 31 | for it in items: |
| 32 | for f in fields: |
| 33 | if f in it: |
| 34 | del it[f] |
| 35 | removed[f] += 1 |
| 36 | kept = sorted(items[0].keys()) if items else [] |
| 37 | print(f' {rel}') |
| 38 | print(f' 剥离 {len(items)} 条 × {[f + "×" + str(n) for f, n in removed.items()]}') |
| 39 | print(f' 保留字段: {kept}') |
| 40 | if not dry: |
| 41 | path.write_text(json.dumps(items, ensure_ascii=False, indent=1) + '\n', |
| 42 | encoding='utf-8') |
| 43 | |
| 44 | |
| 45 | def main(): |
| 46 | dry = '--dry-run' in sys.argv |
| 47 | print('剥离逐字原文字段:' if not dry else '(dry-run)将剥离:') |
| 48 | for rel, fields in STRIP.items(): |
| 49 | strip_file(rel, fields, dry) |
| 50 | print('\n整体删除(剥完无剩余信息):') |
| 51 | for rel in DELETE: |
| 52 | path = ROOT / rel |
| 53 | print(f' {rel} {"(不存在)" if not path.exists() else ""}') |
| 54 | if not dry and path.exists(): |
| 55 | path.unlink() |
| 56 | |
| 57 | |
| 58 | if __name__ == '__main__': |
| 59 | main() |
文件内容是平台检查时读出的文本,只供查看。平台不会运行包里的任何脚本或程序。

