ChatGPT公式格式修复实战:从混乱数据到结构化输出的解决方案

1次阅读
没有评论

共计 1775 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

问题背景

ChatGPT 生成的数学公式常存在以下格式问题:

ChatGPT 公式格式修复实战:从混乱数据到结构化输出的解决方案

  • 符号错位 :运算符与操作数位置混乱,如x +y 缺少空格或 x+ y 间距不均
  • 括号不匹配 :开闭括号数量不一致,如(a+b)*c 缺少闭合
  • 隐式乘法 :变量间省略乘号导致解析歧义,如2x 应转为2*x
  • 函数格式 :数学函数名与参数未标准化,如sinx 应为sin(x)
  • 多行公式:换行符破坏公式结构,导致后续解析失败

技术方案对比

正则表达式方案

优点
– 实现简单,适合快速处理规则明确的文本模式
– 性能较高,尤其适合单次匹配场景

缺点
– 难以处理嵌套结构(如多重括号)
– 维护成本随规则复杂度增加而升高

语法解析器方案

优点
– 能准确处理嵌套语法结构
– 可生成 AST 进行语义级修正

缺点
– 实现复杂度高
– 需要预定义完整语法规则

核心实现

多级正则匹配方案(Python 示例)

import re
from typing import Optional

def format_implicit_multiplication(formula: str) -> str:
    """处理隐式乘法如 2x -> 2*x"""
    return re.sub(r'(\d)([a-zA-Z])', r'\1*\2', formula)

def fix_parentheses(formula: str) -> str:
    """修复括号不匹配问题"""
    open_count = formula.count('(')
    close_count = formula.count(')')

    if open_count > close_count:
        formula += ')' * (open_count - close_count)
    elif close_count > open_count:
        formula = '(' * (close_count - open_count) + formula

    return formula

def normalize_formula(raw_formula: str) -> Optional[str]:
    try:
        # 处理步骤按依赖顺序执行
        steps = [lambda s: re.sub(r'\\s+', ' ', s.strip()),  # 标准化空格
            format_implicit_multiplication,
            lambda s: re.sub(r'(\\w+)\\s*\\(', r'\1(', s),  # 修复函数调用
            fix_parentheses,
        ]

        result = raw_formula
        for step in steps:
            result = step(result)

        return result
    except Exception as e:
        print(f"Error normalizing formula: {e}")
        return None

AST 修正方案(扩展建议)

  1. 使用 lark-parser 定义数学表达式语法
  2. 构建 AST 后遍历节点进行格式标准化
  3. 特别处理函数调用、运算符优先级等场景

性能优化

并行处理技巧

from concurrent.futures import ThreadPoolExecutor

def batch_normalize(formulas: list[str]) -> list[str]:
    """批量处理公式(线程池版)"""
    with ThreadPoolExecutor() as executor:
        results = list(executor.map(normalize_formula, formulas))
    return [r for r in results if r is not None]

缓存策略

  • 对高频出现的公式片段(如sin(x))建立缓存
  • 使用 functools.lru_cache 装饰纯函数

避坑指南

正则表达式陷阱

  • 贪婪匹配 .* 可能意外吞掉后续内容,优先使用 .*? 非贪婪模式
  • 字符集遗漏 :确保包含所有数学符号如∈∉∀∃ 等 Unicode 字符
  • 转义问题 :正则中的特殊字符(如+*?)需要\ 转义

Unicode 处理

  • 明确指定编码格式(推荐 UTF-8)
  • 规范化字符串:unicodedata.normalize('NFKC', input_str)
  • 注意全角 / 半角符号转换

扩展思考

标准格式转换

目标格式 关键转换规则
LaTeX *\times, ^^{}
MathML 需要构建 XML 树结构
AsciiMath 保留基础运算符,用反引号包裹

在线测试

公式修复 Fiddle 示例

延伸阅读

正文完
 0
评论(没有评论)