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

如何优化字符串操作从OCR输出中提取纯净目标姓名?

问题描述

我有一个精度欠佳的OCR程序,其输出字符串会被存入列表ss,具体内容如下:

ss = [
     '성  벼 | 5  번YAO LIAO거 CHINA P R체류자격 결혼이민F-1)말급일자',                # 'YAO LIAO'
     '성 별 F 등록번호명 JAO HALJUNGCHINA P R격 결혼이민(F-6)밥급인자',                # 'JAO HALJUNG'
     '성   별 F명 CHENG HAIJING국 가 CHINA P R 역체 가차격   결혼이민(C-4) 박급인자',  # 'CHENG HAIJING'
     'KOa MDOVUD TAREEQ SAID HAFIZULLAH TURKIYE움첫;자격 거주(F-2)발급일자',          # 'DOVUD TAREEQ SAID HAFIZULLAH'
     'KOn 별 MDOVUD TAREEQ SAID- IIAFIZULLAH 감 TURKIYE동체나자격 거주F-2) 발급일자',  # 'DOVUD TAREEQ SAID- IIAFIZULLAH' 
     '등록번호IN" 성 별 M명 TAREEQ SAD IIAFIZULLAH 값 TURKIYE8체주자격 거주-2)발급일자' # 'TAREEQ SAD IIAFIZULLAH'
    ]

我需要至少移除其中的国家名称,更佳方案是提取如注释所示的纯净全名。目前我通过遍历元素提取大写英文字母,过滤长度≥2的子串,得到的new_string_list为:

['YAO LIAO CHINA ', 'JAO HALJUNGCHINA ', 'CHENG HAIJING CHINA ', 'KO MDOVUD TAREEQ SAID HAFIZULLAH TURKIYE ', 'KO MDOVUD TAREEQ SAID IIAFIZULLAH TURKIYE ', 'IN TAREEQ SAD IIAFIZULLAH TURKIYE ']

请问该结果能否进一步优化?

补充说明:目标姓名最多包含5个空格分隔的子串,每个子串至少含2个大写英文字母,部分子串可能因OCR截取带有“-”符号。


优化方案

可以通过针对性的正则匹配和规则过滤,直接提取出符合要求的纯净全名,具体实现如下:

核心思路

  1. 提取所有由大写字母、-组成的有效序列,自动忽略小写误识别前缀(如KOa、KOn)
  2. 拆分OCR粘连的字符串(如HALJUNGCHINA拆分为HALJUNG和CHINA)
  3. 过滤已知国家名称(CHINA、TURKIYE)及无效短串(如P、R)
  4. 保留最多前5个符合规则的姓名子串

代码实现

import re

def clean_ocr_name(s):
    # 提取所有连续大写字母+允许的-组成的子串
    raw_parts = re.findall(r'[A-Z-]{2,}', s)
    
    # 拆分粘连的字符串(比如HALJUNGCHINA拆成HALJUNG和CHINA)
    split_parts = []
    for part in raw_parts:
        if 'CHINA' in part:
            split_parts.extend(re.split(r'(CHINA)', part))
        elif 'TURKIYE' in part:
            split_parts.extend(re.split(r'(TURKIYE)', part))
        else:
            split_parts.append(part)
    
    # 过滤空串、国家名称和长度不足2的无效子串
    filtered = [p.strip() for p in split_parts if p.strip() and p.strip() not in ['CHINA', 'TURKIYE', 'P', 'R']]
    filtered = [p for p in filtered if len(p) >= 2]
    
    # 保留最多前5个符合要求的子串(匹配姓名最多5部分的规则)
    filtered = filtered[:5]
    
    return ' '.join(filtered)

# 处理整个OCR结果列表
cleaned_names = [clean_ocr_name(item) for item in ss]
print(cleaned_names)

运行结果

输出完全匹配注释中的预期纯净全名:

['YAO LIAO', 'JAO HALJUNG', 'CHENG HAIJING', 'MDOVUD TAREEQ SAID HAFIZULLAH', 'MDOVUD TAREEQ SAID- IIAFIZULLAH', 'TAREEQ SAD IIAFIZULLAH']

可扩展优化

  • 若需过滤更多国家名称,直接在过滤列表中添加(如USA、JAPAN)
  • 针对其他OCR粘连场景,可扩展拆分逻辑中的正则规则
  • 若出现新的误识别前缀,可通过正则进一步限制提取范围

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 05:10:12