Week 3 Development Summary: - Implement negative sign normalization (6 Unicode variants) - Enhance T-test validation with smart sample size extraction - Enhance SE triangle and CI-P consistency validation with subrow support - Add precise sub-cell highlighting for P-values in multi-line cells - Add frontend issue type Chinese translations (6 new types) - Add file format tips for PDF/DOC uploads Technical improvements: - Add _clean_statistical_text() in extractor.py - Add _safe_float() wrapper in validator.py - Add ForensicsReport.tsx component - Update ISSUE_TYPE_LABELS translations Documentation: - Add 2026-02-18 development record - Update RVW module status (v5.1) - Update system status (v5.2) Status: Week 3 complete, ready for Week 4 testing Co-authored-by: Cursor <cursoragent@cursor.com>
19 KiB
临床统计特殊符号提取白皮书
用途: 指导 Python (python-docx) 在提取 Word 表格时进行字符清洗和标准化。
核心痛点: 同一个数学含义,可能由多种不同的编码方式表示。
1. 希腊字母类 (Greek Letters)
这是最容易出现乱码或识别错误的重灾区。
|
| 符号 | 含义 | 常见 Unicode | Word 中的潜在坑 (Legacy Fonts) | 处理建议 |
| | 卡方检验 | \u03c7 (χ) + \u00b2 (²) | 1. 字体设为 "Symbol" 的 'c' 2. 公式编辑器对象 | 正则匹配:[\u03c7\u03a7]2? 关键词:chi-square, chi |
| | 显著性水平 | \u03b1 | 字体设为 "Symbol" 的 'a' | 替换为 alpha |
| | 回归系数/功效 | \u03b2 | 字体设为 "Symbol" 的 'b' | 替换为 beta |
| | 总体均值 | \u03bc | 字体设为 "Symbol" 的 'm' | 替换为 u 或 mean |
| | 总体标准差 | \u03c3 | 字体设为 "Symbol" 的 's' | 替换为 std |
| | 变化量/差值 | \u0394 (大写) | 字体设为 "Symbol" 的 'D' | 替换为 delta |
| | 相关系数 | \u03c1 | 字体设为 "Symbol" 的 'r' | 替换为 rho |
⚠️ 提取陷阱: 很多老旧的 Word 文档(特别是中文期刊投稿)喜欢用 Symbol 字体。在 python-docx 提取 text 时,你可能会读到一个普通的英文字母 c,但用户看到的是 。
- 解决方案:检查 run.font.name。如果字体是 Symbol,需要建立映射表(c -> χ, a -> α)。
2. 数学运算符类 (Operators)
| 符号 | 含义 | 常见 Unicode | Word 变体 | 处理建议 |
| | 加减/标准差 | \u00b1 | +/-, + / - | 统一标准化为 \u00b1 |
| | 小于等于 | \u2264 | <=, =< | 统一为 <= |
| | 大于等于 | \u2265 | >= | 统一为 >= |
| | 不等于 | \u2260 | !=, <>, /= | 统一为 != |
| | 约等于 | \u2248 | ~, = | 统一为 ~= |
| | 负号/减号 | \u2212 (Minus) | \u002d (Hyphen), \u2013 (En Dash) | 极高危! 必须统一替换为标准连字符 - (\u002d),否则 float() 转换会报错 |
| | 乘号/交互项 | \u00d7 | x, X, * | 统一为 x |
⚠️ 提取陷阱: “负号”是数据清洗中最大的坑。Word 会自动把连字符(Hyphen)转成破折号(Dash)或数学减号(Minus)。
- python 代码:value.replace('\u2212', '-').replace('\u2013', '-')
3. 统计学专用标记 (Statistical Notations)
| 符号 | 含义 | 形式 | 提取难点 |
| | 样本均值 | x 上加横线 | 通常是 Word 公式对象 (OMML) 或 域代码 (EQ),python-docx 的 .text 读不出来横线,只能读到 x。 |
| | 样本率 | p 上加尖帽 | 同上。 |
| | 决定系数 | R + 上标 2 | python-docx 默认读成 R2。这通常可以接受。 |
| | 下标 (如
) | 文本 + 下标 | python-docx 默认读成 Xsub。需要识别 font.subscript 属性。 |
⚠️ 提取陷阱: 对于 这种带修饰符的字符,python-docx 可能只能提取到底座字符 x。
- 策略:对于数据侦探来说,通常我们关注的是表头里的 Mean 或 Average 关键词,而不是符号。如果表头只有
,可能需要结合上下文推断。
4. 拉丁字母的特殊含义 (Latin Context)
虽然是普通字母,但在统计学上下文中具有特殊含义,通常以斜体 (Italic) 出现。
| 符号 | 含义 | 易混淆点 |
| | t 检验统计量 | 容易混淆为时间单位 t (time) 或 吨 (ton) |
| | F 检验统计量 | 女性 (Female) |
| | Z 检验统计量 | - |
| | P 值 (概率) | 磷 (Phosphorus) |
| | 样本量 | 牛顿 (Newton) |
| | 相关系数 | 半径 (radius) |
| | 回归系数 | - |
| | 优势比 | 手术室 (Operating Room), 或者 (or) |
| | 风险比 | 心率 (Heart Rate) |
| | 置信区间 | 心脏指数 (Cardiac Index) |
⚠️ 提取策略: 不能只看字符,要看组合。
- P 单独出现且数值在 0-1 之间 -> P 值。
- t 单独出现且数值 > 0 -> t 值。
- CI 后面跟着括号 (1.2-3.4) -> 置信区间。
5. Python 字符串清洗工具箱 (Cleaner Utils)
建议在 DocxTableExtractor 中集成以下清洗函数:
import re
def clean_statistical_text(text):
if not text:
return ""
\# 1\. 归一化负号 (CRITICAL)
text \= text.replace('\\u2212', '-').replace('\\u2013', '-').replace('\\u2014', '-')
\# 2\. 归一化卡方 (Chi-square)
\# 处理 Symbol 字体的 'c'2 (需配合 run.font 检查,此处仅处理 Unicode)
text \= text.replace('\\u03c72', 'chi-square')
text \= text.replace('\\u03c7\\u00b2', 'chi-square')
text \= re.sub(r'\[Xxχ\]\\^?2', 'chi-square', text) \# 正则匹配常见变体
\# 3\. 归一化加减号
text \= text.replace('\\u00b1', '+/-')
\# 4\. 归一化比较符
text \= text.replace('≤', '\<=').replace('≥', '\>=')
\# 5\. 去除不可见字符 (Zero-width space 等)
text \= re.sub(r'\[\\u200b\\u200c\\u200d\\ufeff\]', '', text)
return text.strip()
6. 总结
在 Word 提取中,最大的“鬼怪”不是复杂的 ,而是:
- 假的负号(导致 float() 崩溃)。
- Symbol 字体(导致
变成 a)。
- 多段落换行(上一节已解决)。
只要处理好这三点,99% 的统计表格都能被正确解析。