如何去除句子中重复字符且保留词义,同时支持按模式还原词形
功能实现需求
一、冗余重复字符去除功能
需要实现句子冗余重复字符的清理,同时保证处理后的单词保留原有语义:
- 输入示例:
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。
解决方案
冗余重复字符修正方案
你之前的两种方案都是纯规则匹配,没有结合英文词汇的合法拼写校验,必然会出现误改的问题,不需要单独做排除词列表,更高效的方案是结合拼写检查库实现:
- 先对每个单词做冗余字符压缩:把所有连续重复超过2次的字符先压缩到最多2次(英文中合法的连续重复字符最多只有2个,没有3个及以上的合法拼写)
- 调用
autocorrect或者pyspellchecker这类拼写检查库,对压缩后的单词做拼写矫正,自动匹配最接近的合法词汇 - 额外加白名单机制:如果有特殊词汇不在拼写库中,可以手动加到白名单跳过矫正
示例代码:
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
相关产品推荐
相关产品推荐

