Python 如何删除字符串中的重复字母?

Python 如何删除字符串中的重复字母?,python,nlp,Python,Nlp,我怎样才能“正常化” word = 'yeeeessssssss' 到 如果通过规范化,您的意思是删除重复的字符,那么这应该可以: re.sub(r'(\w)\1+', r'\1', 'yeeeesssss') // yes 没有更多的信息是不可能回答你的问题的。如前所述,您希望从iterable中删除重复项。您可以使用itertools.groupby: >>> "".join(c for c, _ in groupby("yeeessssss")) 'yes' 当然

我怎样才能“正常化”

word = 'yeeeessssssss'


如果通过规范化,您的意思是删除重复的字符,那么这应该可以:

re.sub(r'(\w)\1+', r'\1', 'yeeeesssss')  // yes

没有更多的信息是不可能回答你的问题的。如前所述,您希望从iterable中删除重复项。您可以使用
itertools.groupby

>>> "".join(c for c, _ in groupby("yeeessssss"))
'yes'
当然,这将删除所有重复项:

>>> dedupe = lambda s: "".join(c for c, _ in groupby(s))
>>> dedupe("hello")
'helo'
>>> dedupe("Mississippi")
'Misisipi'
我想你的问题可能要难得多;也就是说,如何将可能有重复字母的单词规范化为实际的英语单词。这基本上是不可能精确地做到的--
beeeeeee
feeeed
会变成什么样子但是,经过大量的努力,您可能可以通过任何一种启发式方法来近似它

一个简单的方法是查看单词是否在字典中,如果没有,则一次删除一个重复的字母,直到它被删除。这将非常低效,但可能有效

另一种方法是使用自然语言库将单词转换为某种“正常形式”。这可能是因为它的发音、拼写或其他原因。然后,您可以找到最接近该正常形式的单词,并使用它给出消除重复的单词

另一种方法是定义字符串之间某种类型的“修改距离”,即为“删除字符”、“插入字符”和“修改字符”的每个操作分配固定成本。然后,您可以在此度量下计算与输入最接近的单词。这是一个研究得很好的问题,因为它被用于生物信息学,并且有一种优雅的动态规划方法。不幸的是,这也是一个非常具有挑战性的问题(一个相关的问题是我本科学位的一个为期数周的课程项目)


);tl博士


只是删除重复项很容易。找到英语单词的最佳近似值是非常困难的。

这似乎类似于使用拼写检查器所需的操作

一种常用的解决方案是使用Soundex函数将单词简化为“听起来像什么”,然后将其与已知的有效单词词典进行比较。我不认为这是万无一失的,但这是一个可以让你朝着正确方向出发的想法

Soundex不是唯一的选择。还有变音和其他一些类似的算法可能会起作用

这里有一个关于使用Python的Soundex的问题:

最困难的部分可能是找到一本好词典,但我在这项搜索中运气不错:


无论你做什么,它都不会完美。正如一些评论所指出的,英语(以及任何一种语言)有许多复杂的问题需要处理。例如,区分“太”和“到”取决于上下文。微软和其他公司已经将经过多年开发的开发团队投入到拼写检查器中,拼写检查器仍然无法100%正确地完成这项工作,并且仍然需要人工干预。我认为在单词规范化方面也会遇到同样的问题。

使用
enchant
模块检查返回的单词是否为英语单词:

import enchant,itertools
d_us= enchant.Dict("en_US")
d_uk= enchant.Dict("en_UK")
words=[]
teks=teks='yeeeessssssss'
for x in itertools.permutations(set(teks)):
    if d_us.check(''.join(x)) or d_uk.check(''.join(x)):
      words.append(''.join(x))

这是一个具体的案例吗?或者其他单词的泛化,也可以映射为“是”?如果只是yeeesss的情况,你就不能删除重复的字符eee和sss吗?为了清晰起见,有几个问题:有问题的单词必须是“是”,并且“不正确”的输入总是重复的字母吗?除非你只需要“规范化”“是”,你需要一本完整的英语词典,否则我的评论会像“你需要一本完整的英语词典,否则我的评论会像……”;你想如何处理“太”?应该变成“去”吗?那么“模糊/融合”、“铜币/Cooper/copers”、“剥落/剥落”、“单桅帆船/斜坡”、“轻敲/剥落”、“滑行/滑行”、“摇摆/下注”等呢。?如果您只想在缺少歧义的情况下进行规范化,那么如上所述,您需要一本完整的英语词典。我知道,但id取决于使用regexp的上下文。
import enchant,itertools
d_us= enchant.Dict("en_US")
d_uk= enchant.Dict("en_UK")
words=[]
teks=teks='yeeeessssssss'
for x in itertools.permutations(set(teks)):
    if d_us.check(''.join(x)) or d_uk.check(''.join(x)):
      words.append(''.join(x))