# **临床统计特殊符号提取白皮书** **用途:** 指导 Python (python-docx) 在提取 Word 表格时进行字符清洗和标准化。 **核心痛点:** 同一个数学含义,可能由多种不同的编码方式表示。 ## **1\. 希腊字母类 (Greek Letters)** 这是最容易出现乱码或识别错误的重灾区。 | | **符号** | **含义** | **常见 Unicode** | **Word 中的潜在坑 (Legacy Fonts)** | **处理建议** | | ![][image1] | **卡方检验** | \\u03c7 (χ) \+ \\u00b2 (²) | 1\. 字体设为 "Symbol" 的 'c' 2\. 公式编辑器对象 | **正则匹配**:\[\\u03c7\\u03a7\]2? **关键词**:chi-square, chi | | ![][image2] | 显著性水平 | \\u03b1 | 字体设为 "Symbol" 的 'a' | 替换为 alpha | | ![][image3] | 回归系数/功效 | \\u03b2 | 字体设为 "Symbol" 的 'b' | 替换为 beta | | ![][image4] | 总体均值 | \\u03bc | 字体设为 "Symbol" 的 'm' | 替换为 u 或 mean | | ![][image5] | 总体标准差 | \\u03c3 | 字体设为 "Symbol" 的 's' | 替换为 std | | ![][image6] | 变化量/差值 | \\u0394 (大写) | 字体设为 "Symbol" 的 'D' | 替换为 delta | | ![][image7] | 相关系数 | \\u03c1 | 字体设为 "Symbol" 的 'r' | 替换为 rho | **⚠️ 提取陷阱:** 很多老旧的 Word 文档(特别是中文期刊投稿)喜欢用 **Symbol 字体**。在 python-docx 提取 text 时,你可能会读到一个普通的英文字母 c,但用户看到的是 ![][image8]。 * **解决方案**:检查 run.font.name。如果字体是 Symbol,需要建立映射表(c \-\> χ, a \-\> α)。 ## **2\. 数学运算符类 (Operators)** | **符号** | **含义** | **常见 Unicode** | **Word 变体** | **处理建议** | | ![][image9] | **加减/标准差** | \\u00b1 | \+/-, \+ / \- | 统一标准化为 \\u00b1 | | ![][image10] | 小于等于 | \\u2264 | \<=, \=\< | 统一为 \<= | | ![][image11] | 大于等于 | \\u2265 | \>= | 统一为 \>= | | ![][image12] | 不等于 | \\u2260 | \!=, \<\>, /= | 统一为 \!= | | ![][image13] | 约等于 | \\u2248 | \~, \= | 统一为 \~= | | ![][image14] | **负号/减号** | \\u2212 (Minus) | \\u002d (Hyphen), \\u2013 (En Dash) | **极高危!** 必须统一替换为标准连字符 \- (\\u002d),否则 float() 转换会报错 | | ![][image15] | 乘号/交互项 | \\u00d7 | x, X, \* | 统一为 x | **⚠️ 提取陷阱:** **“负号”是数据清洗中最大的坑**。Word 会自动把连字符(Hyphen)转成破折号(Dash)或数学减号(Minus)。 * python 代码:value.replace('\\u2212', '-').replace('\\u2013', '-') ## **3\. 统计学专用标记 (Statistical Notations)** | **符号** | **含义** | **形式** | **提取难点** | | ![][image16] | **样本均值** | x 上加横线 | 通常是 **Word 公式对象 (OMML)** 或 **域代码 (EQ)**,python-docx 的 .text **读不出来横线**,只能读到 x。 | | ![][image17] | 样本率 | p 上加尖帽 | 同上。 | | ![][image18] | 决定系数 | R \+ 上标 2 | python-docx 默认读成 R2。**这通常可以接受**。 | | ![][image19] | 下标 (如 ![][image20]) | 文本 \+ 下标 | python-docx 默认读成 Xsub。需要识别 font.subscript 属性。 | **⚠️ 提取陷阱:** 对于 ![][image16] 这种带修饰符的字符,python-docx 可能只能提取到底座字符 x。 * **策略**:对于数据侦探来说,通常我们关注的是表头里的 Mean 或 Average 关键词,而不是符号。如果表头只有 ![][image16],可能需要结合上下文推断。 ## **4\. 拉丁字母的特殊含义 (Latin Context)** 虽然是普通字母,但在统计学上下文中具有特殊含义,通常以**斜体 (Italic)** 出现。 | **符号** | **含义** | **易混淆点** | | ![][image21] | t 检验统计量 | 容易混淆为时间单位 t (time) 或 吨 (ton) | | ![][image22] | F 检验统计量 | 女性 (Female) | | ![][image23] | Z 检验统计量 | \- | | ![][image24] | P 值 (概率) | 磷 (Phosphorus) | | ![][image25] | 样本量 | 牛顿 (Newton) | | ![][image26] | 相关系数 | 半径 (radius) | | ![][image27] | 回归系数 | \- | | ![][image28] | 优势比 | 手术室 (Operating Room), 或者 (or) | | ![][image29] | 风险比 | 心率 (Heart Rate) | | ![][image30] | 置信区间 | 心脏指数 (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 提取中,最大的“鬼怪”不是复杂的 ![][image1],而是: 1. **假的负号**(导致 float() 崩溃)。 2. **Symbol 字体**(导致 ![][image2] 变成 a)。 3. **多段落换行**(上一节已解决)。 只要处理好这三点,99% 的统计表格都能被正确解析。 [image1]: [image2]: [image3]: [image4]: [image5]: [image6]: [image7]: [image8]: [image9]: [image10]: [image11]: [image12]: [image13]: [image14]: [image15]: [image16]: [image17]: [image18]: [image19]: [image20]: [image21]: [image22]: [image23]: [image24]: [image25]: [image26]: [image27]: [image28]: [image29]: [image30]: