You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于NLTK识别语法错误文字数字及拆分逻辑优化咨询

问题解决方案

1. 用NLTK识别语法错误的文字数字

可以通过构建合法英文数字表达的上下文无关文法(CFG),结合NLTK的解析器来识别错误序列:

  • 先定义符合英文数字规则的CFG,覆盖基数词、复合数(如"forty four")、百位及以上结构(如"four hundred twenty");
  • 使用NLTK的ChartParser对输入文本解析,若解析失败,则说明文本存在语法错误(比如"Four hundred two six eight nine"中,"four hundred two"后直接接"six"不符合连贯数字的表达逻辑,属于错误序列)。

示例代码片段:

import nltk
from nltk import CFG, ChartParser

# 定义简化的数字文法
digit_grammar = CFG.fromstring("""
    S -> NUM | NUM ',' NUM
    NUM -> CARDINAL | COMPOUND | HUNDRED
    COMPOUND -> TENS UNIT
    HUNDRED -> CARDINAL 'hundred' NUM?
    TENS -> 'forty' | 'thirty' | 'twenty'
    UNIT -> 'one' | 'two' | 'three' | 'four' | 'five' | 'six' | 'seven' | 'eight' | 'nine'
    CARDINAL -> UNIT | 'ten' | 'eleven' | 'twelve' | 'thirteen' | 'fourteen' | 'fifteen' | 'sixteen' | 'seventeen' | 'eighteen' | 'nineteen'
""")

parser = ChartParser(digit_grammar)

def has_grammar_error(text):
    tokens = nltk.word_tokenize(text.lower())
    try:
        next(parser.parse(tokens))
        return False
    except StopIteration:
        return True

# 测试示例
print(has_grammar_error("Four hundred two six eight nine"))  # 输出 True
print(has_grammar_error("Forty four six two"))  # 输出 True(文法未定义无逗号的多数字并列,符合错误判定)

2. 实现正确拆分,避免错误合并

核心思路是先识别完整的合法数字短语,再拆分剩余单个数字:

  • 构建复合数字短语的匹配规则(如正则匹配"twenty one"这类结构);
  • 遍历文本时优先匹配复合数,标记为单个单元,再提取剩余的单个数字词;
  • 最终将每个单元独立转换为阿拉伯数字,避免错误合并。

示例处理逻辑:

import re

# 复合数字短语匹配规则
compound_pattern = r'\b(twenty|thirty|forty|fifty|sixty|seventy|eighty|ninety)\s+(one|two|three|four|five|six|seven|eight|nine)\b'

def split_correctly(text):
    tokens = text.lower().split()
    result = []
    i = 0
    while i < len(tokens):
        # 检查当前和下一个词是否构成复合数
        if i + 1 < len(tokens) and re.match(compound_pattern, f"{tokens[i]} {tokens[i+1]}"):
            result.append(f"{tokens[i]} {tokens[i+1]}")
            i += 2
        else:
            result.append(tokens[i])
            i += 1
    return result

# 测试示例
print(split_correctly("Forty four six two"))  # 输出 ['forty four', 'six', 'two']

3. 是否调整思路:规避 vs 识别处理

需根据输入场景的可控性决策:

  • 优先选择规避(输入可控场景):如果是表单、提交界面这类用户输入场景,从源头规范输入更高效。比如提示用户用逗号分隔多个数字(如"Forty four, six, two"),或提供数字输入组件,彻底避免语法错误,开发成本低且准确率100%。
  • 必须做识别处理(输入不可控场景):如果是抓取的第三方文本、用户自由输入的非结构化内容,无法强制规范,就必须通过语法解析、短语匹配处理错误序列。但这类处理需要覆盖大量边缘情况,维护成本较高。

内容的提问来源于stack exchange,提问作者Jason Brody

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 05:40:25