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

如何去除句子中重复字符且保留词义,同时支持按模式还原词形

功能实现需求

一、冗余重复字符去除功能

需要实现句子冗余重复字符的清理,同时保证处理后的单词保留原有语义:

  • 输入示例:I'm so haaappppyyyy about offline school
  • 预期输出:I'm so happy about offline school

规则说明:重复冗余的haaappppyyyy会被修正为happy,但本身包含合法连续重复字符的offline、school要保持原有形态,不能被错误处理为ofline、schol

二、已尝试方案及问题

我已经试过两种实现方案,都不符合需求:

1. 正则表达式实现方案

代码如下:

tweet = 'I\'m so haaappppyyyy about offline school'
repeat_char = re.compile(r"(.)\1{1,}", re.IGNORECASE)
tweet = repeat_char.sub(r"\1\1", tweet)
tweet = re.sub("(.)\\1{2,}", "\\1", tweet)

输出结果:

I'm so haappyy about offline school #所有重复字符都被保留为2个,不符合要求

2. itertools实现方案

代码如下:

tweet = 'I\'m so haaappppyyyy about offline school'
tweet = ''.join(ch for ch, _ in itertools.groupby(tweet))

输出结果:

I'm so hapy about ofline schol

三、疑问点

请问该如何修正现有方案?是否需要创建专门的排除词列表来规避合法重复字符的单词被误改?

四、附加功能需求

还需要实现词汇按指定模式还原为基准形态的功能:例如指定wkwk为基准形态时,wkwkwkwk、wkwkwkwkwkwkwk这类重复延伸的词汇都可以被还原为wkwk。


解决方案

冗余重复字符修正方案

你之前的两种方案都是纯规则匹配,没有结合英文词汇的合法拼写校验,必然会出现误改的问题,不需要单独做排除词列表,更高效的方案是结合拼写检查库实现:

  1. 先对每个单词做冗余字符压缩:把所有连续重复超过2次的字符先压缩到最多2次(英文中合法的连续重复字符最多只有2个,没有3个及以上的合法拼写)
  2. 调用autocorrect或者pyspellchecker这类拼写检查库,对压缩后的单词做拼写矫正,自动匹配最接近的合法词汇
  3. 额外加白名单机制:如果有特殊词汇不在拼写库中,可以手动加到白名单跳过矫正

示例代码:

import re
from autocorrect import Speller

spell = Speller(lang='en')
# 可手动添加自定义白名单
custom_whitelist = {"wkwk", "xswl"}

def clean_redundant_chars(word):
    # 先把连续3次及以上的重复字符压缩到2次
    compressed = re.sub(r'(.)\1{2,}', r'\1\1', word)
    # 白名单词汇直接返回
    if compressed.lower() in custom_whitelist:
        return compressed
    # 拼写矫正
    return spell(compressed)

# 测试
tweet = "I'm so haaappppyyyy about offline school"
processed = ' '.join([clean_redundant_chars(word) for word in tweet.split()])
print(processed)
# 输出:I'm so happy about offline school

指定基准形态还原方案

这类固定模式的重复还原直接用正则匹配即可,提前定义好基准词和对应的匹配规则:

import re

def restore_benchmark(word, benchmark):
    # 生成基准词的重复匹配规则:允许基准词循环重复出现
    pattern = re.compile(f'({re.escape(benchmark)})+', re.IGNORECASE)
    if pattern.fullmatch(word):
        return benchmark
    return word

# 测试
print(restore_benchmark("wkwkwkwkwk", "wkwk"))
# 输出:wkwk

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:54:03