【问题标题】:Remove repeating characters from words从单词中删除重复字符
【发布时间】:2012-04-09 11:50:00
【问题描述】:

我想知道将“haaaaapppppyyy”之类的内容转换为“haappyy”的最佳方法是什么。

基本上,在解析俚语时,人们有时会重复字符以增加重点。

我想知道最好的方法是什么?使用set() 不起作用,因为字母的顺序显然很重要。

有什么想法吗?我正在使用 Python + nltk。

【问题讨论】:

  • 基本上,如果一个字母在同一个单词中连续重复 > 2 次,我只会这样做,所以实际上这个词实际上是“haappy”的逻辑。不过,我可以使用附魔来进行拼写检查。
  • 哦,对不起,忘了我重复了“y”,是的,应该是“haappyy”
  • 与字典匹配也是一个很好的问题:通过删除重复找到最短的真实单词。这不是微不足道的,因为有些单词有两个或多个双字母(想想“簿记员”)。

标签: python nlp nltk


【解决方案1】:

可以使用正则表达式来完成:

>>> import re
>>> re.sub(r'(.)\1+', r'\1\1', "haaaaapppppyyy")     
'haappyy'

(.)\1+ 将任何字符 (.) 后跟一个或多个相同字符(因为后向引用 \1 必须相同)替换为两倍的字符。

【讨论】:

  • 我会改用r'(.)\1{2,}',这样双打就不用管了(现在你只是用自己替换它们)。这应该会给你另一个加速。
  • @TimPietzcker 并没有真正加快替换速度。我的第一个想法和 larsmans 一样,正则表达式应该比 group/join 快得多,但似乎并非如此。
  • @Howard:如果字符串包含许多双字母,它会。显然不在这个测试字符串上。
【解决方案2】:

您可以使用itertools.groupby 压缩多次出现的字母:

>>> ''.join(c for c, _ in groupby("haaaaapppppyyy"))
'hapy'

同样,您可以从 groupby 获取 haappyy

>>> ''.join(''.join(s)[:2] for _, s in groupby("haaaaapppppyyy"))
'haappyy'

【讨论】:

    【解决方案3】:

    你应该在没有 reduce 或 regexps 的情况下这样做:

    >>> s = 'hhaaaaapppppyyy'
    >>> ''.join(['' if i>1 and e==s[i-2] else e for i,e in enumerate(s)])
    'haappyy'
    

    重复次数硬编码为上面的>1-2。一般情况:

    >>> reps = 1
    >>> ''.join(['' if i>reps-1 and e==s[i-reps] else e for i,e in enumerate(s)])
    'hapy'
    

    【讨论】:

      【解决方案4】:

      这是一种方法(仅限于 python 不会说英语的明显限制)。

      >>> s="haaaappppyy"
      >>> reduce(lambda x,y: x+y if x[-2:]!=y*2 else x, s, "")
      'haappyy'
      

      【讨论】:

        猜你喜欢
        • 2012-03-14
        • 2013-08-11
        • 1970-01-01
        • 2019-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多