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

"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(和其他类似算法)索引所有字典单词
  • 对于每个输入词,我 (a) 检查它是否在索引中,如果不是 (b) 所有发音相似的词并选择 Levenshtein 相似度最高的词——注意,作为初步步骤,替换所有 2+带有 2 个字母的重复字母
  • 在极少数情况下,我会得到多个最高结果(例如,wooww 结果与 wowwoo 同样相似),我利用 Typoglycemia 的概念检查基于第一个和最后一个字母
  • 的相似性

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

    最佳答案

    如果“拼写错误”的语料库很小,是否可以提供专用规则?

    >>> 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 编写一个词法分析器?再一次,您必须为每个单词提供专用规则,但主要优点是这次每个字符只会被检查一次。缺点是您不能再轻松地并行化(据我所知)。

    关于python - 更正用户消息中的重复字母,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25566426/

    10-09 15:55
    查看更多