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

时间:2014-08-29 10:27:32

标签: python regex nlp

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

"wowwwwww!"
"Daaaaaaamn!"
"I'm soooooo pisssssed" 

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

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

s = re.sub(r'(.)\1+', r'\1\1', s)

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

"woww!"
"Daamn!"
"I'm soo pissed"

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

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

编辑:根据所有答案,我提出了一个似乎不太合理的解决方案

  • 使用Ubuntu的/usr/share/dict/words作为词典
  • 使用Soundex(和其他类似算法)
  • 索引所有词典单词
  • 对于每个输入单词I(a)检查它是否在索引中,如果不是(b)所有类似发声单词并选择具有最高Levenshtein相似性的单词 - 请注意,作为预备步骤,替换所有2个重复的字母,2个字母
  • 在极少数情况下,我会得到多个顶级结果(例如,wooww会导致wowwoo同样相似),我会利用Typoglycemia的概念来检查基于第一个和最后一个字母的相似性

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

3 个答案:

答案 0 :(得分: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'

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


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

答案 1 :(得分:1)

我发布了另一个答案,因为这是一个完全不同的想法。

如果处理过的文本仅用于分析目的,并且不打算显示,那么您是否应该尝试转换为(近似)语音转录?

基于soundex的算法可能是一个起点。

答案 2 :(得分:1)

可能有使用词典和最小编辑距离(MED)的解决方案。

让我们考虑一个词汇外词:' daaaaamn'。 来自' daaaamn'该死的'是3(三个删除)。

现在,您可以调整MED功能,以便降低删除成本。 例如,您可以为插入定义1,为替换定义1,为删除定义0.5(现在编辑距离为1.5)。 或者,如果您已经在序列中抑制了相同的字符(编辑距离现在为1),则删除的成本可能为0。

现在你只需要拿起编辑距离最短的单词('该死的'希望如此)。

由于您可以尝试许多不同的配置,您可能需要构建一些参考数据并查看哪种解决方案表现最佳。

祝你好运。

最近,我发了一篇关于MED的帖子。它在这里:Unable to follow the intuition behind minimum edit distance