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

时间:2012-06-11 14:37:12

标签: python nlp

我怎样才能'正常化'

word = 'yeeeessssssss'

word = 'yes'

4 个答案:

答案 0 :(得分:14)

如果没有更多信息,就无法回答您的问题。正如您所说,您希望从可迭代中删除重复项。您可以使用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'

我认为你的问题可能要困难得多;即,如何将可能有重复字母的单词标准化为实际英语单词。基本上不可能做到这一点 - beeeeeeefeeeed会变成什么样? - 但是,经过很多努力,你可以通过各种启发式方法来近似它。

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

另一种方法是使用自然语言库将单词转换为某种“正常形式”。这可能是它的声音,拼写方式或其他内容。然后,您可以找到与该普通表单最接近的单词,并使用 it 来提供重复数据删除的单词。

另一种方法是在字符串之间定义某种“修改距离”,其中为每个操作“删除字符”,“插入字符”和“修改字符”分配固定成本。然后,您可以根据此指标计算与输入最接近的单词。这是一个经过充分研究的问题,因为它被用于生物信息学,并且有一种优雅的动态编程方法。不幸的是,锻炼也很困难(一个相关的问题是我本科学位课程的几周课程)。


; TL,博士

删除重复项很容易。找到最佳近似值作为英文单词非常难。

答案 1 :(得分:4)

如果通过规范化,你的意思是删除重复的字符,这应该有效:

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

答案 2 :(得分:3)

这看起来类似于使用拼写检查程序所需要做的事情。

一种常用的解决方案是使用Soundex函数将单词缩减为“听起来像什么”,然后将其与已知的有效单词词典进行比较。我认为这不是万无一失的,但这可能会让你开始朝着正确的方向前进。

http://en.wikipedia.org/wiki/Soundex

Soundex不是唯一的选择。还有Metaphone和其他一些可能有效的类似算法。

以前有一个关于Soundex和Python的问题:Soundex algorithm in Python (homework help request)

最困难的部分可能是找到一本好词典,但我对这次搜索感到满意:http://www.bing.com/search?q=download+word+list&qs=n&form=QBRE&pq=download+word+list&sc=8-18&sp=-1&sk=

无论你做什么,它都不会是完美的。正如一些评论所指出的那样,英语语言(以及任何语言)都有很多复杂的问题需要处理。区分“太”和“到”,例如取决于上下文。微软和其他人已经让开发团队经过多年的开发进入拼写检查程序,并且拼写检查程序仍然无法在100%的时间内正确执行,并且仍然需要人工干预。我认为你将面临与标准化相同的问题。

答案 3 :(得分:1)

使用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))