删除句子中重复的字符,但保留单词的意思



我想从句子中删除重复字符,但使单词仍然保留其含义(如果有的话)。例如:I'm so haaappppyyyy about offline schoolI'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"会让你("快乐"、"快乐"、"快乐"等)。那么它只是检查哪一个允许这些话通过比较实际存在的单词列表。这样做的时间复杂度是相当高的,所以如果它需要快速运行,那么就在它上面放一个哈希表或其他东西:)

相关内容

  • 没有找到相关文章

最新更新