我怎样才能“正常化”
word = 'yeeeessssssss'
到
word = 'yes'
如果没有更多信息,就不可能回答您的问题。正如您所说,您想从可迭代对象中删除重复项。你可以这样做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,博士
只需删除重复项很容易。找到作为英语单词的最佳近似值是非常困难的。
如果通过规范化,您的意思是删除重复的字符,这应该有效:
re.sub(r'(\w)\1+', r'\1', 'yeeeesssss') // yes
这似乎类似于您需要使用拼写检查器执行的操作。
一种常用的解决方案是使用 Soundex 函数将单词简化为“听起来像”,然后将其与已知的有效词词典进行比较。我不认为这会是万无一失的,但这是一个可以让你朝着正确方向开始的想法。
http://en.wikipedia.org/wiki/Soundex
Soundex 不是唯一的选择。还有 Metaphone 和其他几种可能有效的类似算法。
这里有一个关于 Soundex 与 Python 的先前问题:Python中的 Soundex 算法(作业帮助请求)
最难的部分可能是找到一本好词典,但我很幸运地进行了这个搜索:http ://www.bing.com/search?q=download+word+list&qs=n&form=QBRE&pq=download+word+list&sc= 8-18&sp=-1&sk=
不管你做什么,它都不会是完美的。正如一些评论所指出的,英语(以及任何语言,就此而言)有很多复杂的问题需要处理。例如,区分“too”和“to”取决于上下文。微软和其他公司已经将经过多年开发的开发团队投入到拼写检查器中,但拼写检查器仍然无法 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))