如何实现含重复字母单词的文本规范化?重复字母处理代码不生效求助
文本规范化函数修复方案
问题定位
现有代码无法运行重复字母检测功能的核心原因有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)
修改说明
- 删除了原来
return s的错误语句,避免提前终止函数执行 - 单独封装
_remove_repeated_chars私有方法处理单个单词的重复字符消除,避免和缩写替换逻辑混淆 - 新增了文本拆分逻辑,将完整文本拆分为单词和非单词分隔符两部分,仅对纯字母的单词做去重处理,保留原有的标点、空格格式
- 递归逻辑仅作用于单个单词,不会重复触发缩写替换规则
测试效果
输入: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
相关产品推荐
相关产品推荐

