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

如何实现含重复字母单词的文本规范化?重复字母处理代码不生效求助

文本规范化函数修复方案

问题定位

现有代码无法运行重复字母检测功能的核心原因有3个:

  • replace方法在完成缩写替换后直接return s,后续的重复字母处理代码属于死代码,永远不会被执行
  • 重复字母处理逻辑直接作用于完整文本字符串,没有按单词拆分处理,既会被空格、标点干扰,也无法针对单个单词做字典校验
  • 原有逻辑把缩写替换和递归去重逻辑混写,递归调用时会重复执行缩写替换规则,引发逻辑异常

修复后完整代码

import re
from nltk.corpus import wordnet
R_patterns = [
   (r'won\'t', 'will not'),
   (r'can\'t', 'cannot'),
   (r'i\'m', 'i am'),
   (r'(\w+)\'ll', '\g<1> will'),
   (r'(\w+)n\'t', '\g<1> not'),
   (r'(\w+)\'ve', '\g<1> have'),
   (r'(\w+)\'s', '\g<1> is'),
   (r'(\w+)\'re', '\g<1> are'),
]

class REReplacer(object):
    def __init__(self, patterns=R_patterns):
        self.patterns = [(re.compile(regex), repl) for (regex, repl) in patterns]
        # 匹配连续重复字符的正则
        self.repeat_regexp = re.compile(r'(\w*)(\w)\2(\w*)')
        self.reple = r'\1\2\3'

    # 单独封装单个单词的重复字符处理方法
    def _remove_repeated_chars(self, word):
        # 如果单词已经在wordnet字典中存在,直接返回
        if wordnet.synsets(word):
            return word
        # 消除一组重复字符
        repl_word = self.repeat_regexp.sub(self.reple, word)
        # 如果发生了替换,递归继续检查是否还有重复
        if repl_word != word:
            return self._remove_repeated_chars(repl_word)
        else:
            return repl_word

    def replace(self, text):
        s = text
        # 第一步:先执行所有缩写替换规则
        for (pattern, repl) in self.patterns:
            s = re.sub(pattern, repl, s)
        # 第二步:拆分文本为单词+分隔符,逐个处理带字母的单词
        processed_tokens = []
        # 用正则拆分保留所有非单词字符作为分隔符,避免丢失标点、空格
        for token in re.split(r'(\W+)', s):
            if token.isalpha():
                # 只有纯字母的token才做去重处理
                processed_tokens.append(self._remove_repeated_chars(token))
            else:
                # 非字母的分隔符、标点直接保留
                processed_tokens.append(token)
        # 拼接回完整文本后返回
        return ''.join(processed_tokens)

修改说明

  1. 删除了原来return s的错误语句,避免提前终止函数执行
  2. 单独封装_remove_repeated_chars私有方法处理单个单词的重复字符消除,避免和缩写替换逻辑混淆
  3. 新增了文本拆分逻辑,将完整文本拆分为单词和非单词分隔符两部分,仅对纯字母的单词做去重处理,保留原有的标点、空格格式
  4. 递归逻辑仅作用于单个单词,不会重复触发缩写替换规则

测试效果

输入:Helllooooo. I don't know this.
执行代码:

replacer = REReplacer()
print(replacer.replace("Helllooooo. I don't know this."))

输出:Hello. I do not know this. 完全符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:54:01