我想从句子中删除重复字符,但使单词仍然保留其含义(如果有的话)。例如:I'm so haaappppyyyy about offline school
到I'm so happy about offline school
。看,haaappppyyyy
变成了happy
,offline & school
保持不变变成了ofline & schol
我尝试了两种解决方案,使用RE和itertools,但没有一个真正适合我正在寻找的
使用正则表达式:
tweet = 'I'm so haaappppyyyy about offline school'
repeat_char = re.compile(r"(.)1{1,}", re.IGNORECASE)
tweet = repeat_char.sub(r"11", tweet)
tweet = re.sub("(.)\1{2,}", "\1", tweet)
输出:
I'm so haappyy about offline school #it makes 2 chars for every repating chars
using itertools:
tweet = 'I'm so happy about offline school'
tweet = ''.join(ch for ch, _ in itertools.groupby(tweet))
输出:
I'm so hapy about ofline schol
我该如何解决这个问题?我是否应该列出一个我想要排除的单词列表?
此外,我希望它还能够将模式中的一些单词约简为它的基本形式。例如:
wkwk (base form)
wkwkwkwk
wkwkwkwkwkwkwk
我想把第二个和第三个单词变成第一个单词,即基本形式
您可以在这里通过遍历字符串中的所有单词来组合regex和NLP,一旦找到一个具有相同连续字母的单词,将它们减少到最多连续出现2个相同字母,并运行自动拼写检查来修复拼写。
查看Python示例代码:
import re
from textblob import TextBlob
from textblob import Word
rx = re.compile(r'([^Wd_])1{2,}')
print( re.sub(r'[^Wd_]+', lambda x: Word(rx.sub(r'11', x.group())).correct() if rx.search(x.group()) else x.group(), tweet) )
# => "I'm so happy about offline school"
代码使用Textblob
库,但您可以使用任何您喜欢的。
注意([^Wd_])1{2,}
匹配任意三个或三个以上的连续字母,[^Wd_]+
匹配一个或多个连续字母。
这个答案最初是为Regex编写的,以减少字符串中的重复字符,该字符串在我提交帖子之前被关闭为重复字符。所以我"回收"了。这里。
Regex并不总是最好的解决方案
用于验证格式或输入
的正则表达式正则表达式通常用于低级模式识别和替换。它可能对格式验证很有用。你可以把它看成"转储"自动化。
语言学(NLP)
当涉及到自然语言(NLP),或者这里的拼写(字典)时,语义可能起作用。根据上下文情况而定。和";as"可能两者都是正确拼写,尽管语义非常不同。(我为粗鲁的例子道歉,但我的母语不是英语,这两个词的意思最明显,取决于重复。)
对于这些情况,正则表达式或简单的模式识别可能是不够的。与研究特定于语言的库或解决方案(包括基本应用程序)相比,正确地应用它可能会花费更多的精力。
正则表达式可能与
相冲突的拼写示例就像"快乐"one_answers"快乐"的区别一样。(拼写错误,但只有重复的元音"aa",没有辅音"pp")和"yeees"(不包含拼写正确的重复)或"kiss"(正确拼写为重复辅音)
拼写更正需要更多
例如字典来查找如果重复的字符(元音或辅音)是有效的正确拼写单词的形式。
考虑拼写纠正模块
您可以使用textblob
模块对进行拼写更正:
安装:pip install textblob
一些测试用例的示例(独立的单词):
from textblob import TextBlob
incorrect_words = ["cmputr", "yeees", "haappy"] # incorrect spelling
text = ",".join(incorrect_words) # join them as comma separated list
print(f"original words: {text}")
b = TextBlob(text)
# prints the corrected spelling
print(f"corrected words: {b.correct()}")
打印:
original words: cmputr,yeees,haappy
corrected words: computer,eyes,happy
惊喜:你可能期望"是"(我也这么做了)。但是更正的结果不是删除了两个重复的元音&;ee",而是重新排列以保留几乎所有的字母(6个中的5个,只删除了一个&;e")。
例句:
from textblob import TextBlob
tweet = "I'm so haaappppyyyy about offline school" # either escape or use different quotes when a single-quote (') is enclosed
print(TextBlob(tweet).correct())
打印:
I'm so haaappppyyyy about office school
更不幸的是:
- 不是"都无
- 在语义上超出了"office"而不是"offline">
显然,前面使用regex清理步骤,如Wiktor建议的,可能会改善结果。
参见:
- Stackabuse:拼写纠正在Python与TextBlob,教程
- 文档:TextBlob:简化文本处理
首先,您需要一个包含所有允许的单词的列表(或集合),以便进行比较。
我会假设(这可能是错误的)没有单词包含两个以上重复字符的序列来处理它。因此,为每个单词生成一个包含所有潜在候选词的列表,例如"haaappppppyyyy"会让你("快乐"、"快乐"、"快乐"等)。那么它只是检查哪一个允许这些话通过比较实际存在的单词列表。这样做的时间复杂度是相当高的,所以如果它需要快速运行,那么就在它上面放一个哈希表或其他东西:)