Files
AIclinicalresearch/docs/03-业务模块/RVW-稿件审查系统/06-开发记录/临床统计特殊符号提取白皮书.md
HaHafeng f9ed0c2528 feat(rvw): Complete V2.0 Week 3 - Statistical validation extension and UX improvements
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>
2026-02-18 18:26:16 +08:00

19 KiB
Raw Blame History

临床统计特殊符号提取白皮书

用途: 指导 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 提取中,最大的“鬼怪”不是复杂的 ,而是:

  1. 假的负号(导致 float() 崩溃)。
  2. Symbol 字体(导致 变成 a
  3. 多段落换行(上一节已解决)。

只要处理好这三点99% 的统计表格都能被正确解析。