更正用户消息中的重复字母

Chr*_*ian 5 python regex nlp

我尝试分析来自社交媒体或聊天的消息。一个常见的问题是这种特殊的拼写错误,人们使用重复的字符来表达他们的情感或其他什么,例如

"wowwwwww!"
"Daaaaaaamn!"
"I'm soooooo pisssssed" 
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种或多或少稳健的方法来纠正这些情况。

要仅用两个字符替换重复的字符(重复 3 次或更多),我已经找到了合适的正则表达式:

s = re.sub(r'(.)\1+', r'\1\1', s)
Run Code Online (Sandbox Code Playgroud)

但考虑到上面的例子,这会导致

"woww!"
"Daamn!"
"I'm soo pissed"
Run Code Online (Sandbox Code Playgroud)

这看起来更好,但还不够完美。我怎样才能最好地决定何时用一个字符而不是两个字符替换它?

一种(可能是幼稚的)方法是使用字典来检查字典中是否存在一个版本。或者也许是一些相当简单的语言规则来检查何时需要双字母。或者也许有更好的方法来完成此任务。

编辑:根据所有答案,我想出了一个似乎效果不错的解决方案

  • 使用Ubuntu/usr/share/dict/words作为字典
  • Soundex使用(和其他类似算法)对所有字典单词建立索引
  • 对于每个输入单词,我 (a) 检查它是否在索引中,如果不在索引中,则 (b) 所有发音相似的单词,然后选择具有最高 Levenshtein 相似度的单词 - 请注意,作为第一步,替换所有 2 个以上重复的单词有2个字母的字母
  • 在极少数情况下,我得到多个顶级结果(例如,wooww结果wow和同样相似),我利用Typoglycemiawoo的概念根据第一个和最后一个字母检查相似性

通过这个解决方案,我不仅很好地解决了重复字母的问题,而且还解决了一般的拼写错误。它可能远非完美,但另一方面它是一个非常简单的解决方案。

Syl*_*oux 1

如果“拼写错误的东西”的语料库很小,也许可以提供专门的规则?

>>> rules = (('wo+w+', 'wow'), ('da+m+n+', 'damn'), ('so+', 'so'),('coo+l+','cool'))
# in "real world", should compile the regex for obvious performance reasons

>>> s = 'wowwww sooo cool'
# in "real world", normalize somehow (lowercase?)

>>> for pattern, replace in rules:
...     s = re.sub(r'\b'+pattern+r'\b', replace, s)
... 
>>> s

'wow so cool'
Run Code Online (Sandbox Code Playgroud)

但这是高度组合的!另一方面,并​​行化可能并不太难。


为了获得更高的性能,也许可以 使用?编写词法分析器。PLY您必须再次为每个单词提供专用规则,但主要优点是这次每个字符只会检查一次。缺点是你不能再轻松地并行化(据我所知)。