【问题标题】:String preprocessing字符串预处理
【发布时间】:2016-02-12 23:14:54
【问题描述】:

我正在处理一个字符串列表,其中可能包含原始拼写的一些附加字母,例如:

words = ['whyyyyyy', 'heyyyy', 'alrighttttt', 'cool', 'mmmmonday']

我想对这些字符串进行预处理,使其拼写正确,以检索新列表:

cleaned_words = ['why', 'hey', 'alright', 'cool', 'monday']

重复字母的序列长度可能会有所不同,但显然cool 应保持其拼写。

我不知道有任何 python 库可以做到这一点,我最好尽量避免硬编码。

我试过这个:http://norvig.com/spell-correct.html 但是你在文本文件中输入的单词越多,它似乎就越有可能提示拼写错误,所以即使没有删除额外的字母,它也永远不会真正正确。比如eel变成teel...

提前致谢。

【问题讨论】:

  • 由于该任务非常依赖于语言,python 本身无法为您完成。尝试查找一些拼写纠正包,例如 pypi.python.org/pypi/autocorrect/0.1.0
  • 请看这篇帖子:stackoverflow.com/questions/4500752/…。我建议:1)检查每个单词的拼写。 2)如果不正确,使用循环尝试删除重复的字母,直到拼写正确。
  • 我认为你不会得到任何真正的答案,除非你提供一些你写的代码,或任何推理 - 算法/论文/链接使用/思想/你的想法。跨度>
  • @javad 谢谢 :) 我会试试拼写包
  • 大多数 UNIX 应该有一个/usr/share/dict/words 中的单词列表。如果需要,请使用它

标签: python string python-2.7


【解决方案1】:

如果您只想删除重复的字母,那么使用正则表达式模块re 可能会有所帮助:

>>> import re
>>> re.sub(r'(.)\1+$', r'\1', 'cool')
'cool'
>>> re.sub(r'(.)\1+$', r'\1', 'coolllll')
'cool'

(它不影响“酷”。)

对于前导重复字符,正确的替换是:

>>> re.sub(r'^(.)\1+', r'\1', 'mmmmonday')
'monday'

当然,对于合法以重复字母开头或结尾的单词来说,这会失败......

【讨论】:

    【解决方案2】:

    如果您要下载所有英文单词的文本文件进行检查,这是另一种可行的方法。

    我没有测试过,但你明白了。它遍历字母,如果当前字母与最后一个字母匹配,它将从单词中删除该字母。如果它将这些字母缩小到 1,但仍然没有有效的单词,它会将单词重置为正常并继续,直到找到下一个重复字符。

    words = ['whyyyyyy', 'heyyyy', 'alrighttttt', 'cool', 'mmmmonday']
    import urllib2
    word_list = set(i.lower() for i in urllib2.urlopen('https://raw.githubusercontent.com/eneko/data-repository/master/data/words.txt').read().split('\n'))
    
    found_words = []
    for word in (i.lower() for i in words):
    
        #Check word doesn't exist already
        if word in word_list:
            found_words.append(word)
            continue
    
        last_char = None
        i = 0
        current_word = word
        while i < len(current_word):
    
            #Check if it's a duplicate character
            if current_word[i] == last_char:
                current_word = current_word[:i] + current_word[i + 1:]
    
            #Reset word if no more duplicate characters
            else:
                current_word = word
                i += 1
                last_char = current_word[i]
    
            #Word has been found
            if current_word in word_list:
                found_words.append(current_word)
                break
    
    print found_words
    #['why', 'hey', 'alright', 'cool', 'monday']
    

    【讨论】:

    • 点赞。喜欢这个主意。当前的输出是['whyyy', 'heyy', 'alrighttt', 'cool', 'mmmmonday'],所以它删除了一些结束字符,但不是全部。知道为什么吗?
    • 啊抱歉,我遍历每个字符一次,就好像单词保持相同大小一样,但事实并非如此,我已经设法修复它。作为记录,您还需要检查word_list 是否正确,我必须将f.read().split('\r\n') 作为一个文本文件,每个单词都换行。
    • 由于某种原因,我得到一个字符串索引超出范围错误。在last_char = current_word[i] 线上
    • 现在我只是在猜测哈哈,但这可能会奏效。如果它仍然不起作用,请发送您正在使用的单词列表,我会尝试弄清楚:) 我也只是注意到'cool'没有正常工作,因为还有'col',所以我添加了稍微检查一下原始单词:P
    • 现在它返回一个空列表? :P 我不确定如何给你文本文件,但这些是我使用的词:raw.githubusercontent.com/eneko/data-repository/master/data/…
    【解决方案3】:

    嗯,粗略的方式:

    words = ['whyyyyyy', 'heyyyy', 'alrighttttt', 'cool', 'mmmmonday']
    
    res = []
    for word in words:
        while word[-2]==word[-1]:
            word = word[:-1]
        while word[0]==word[1]:
            word = word[1:]
        res.append(word)
    print(res)
    

    结果: ['why', 'hey', 'alright', 'cool', 'monday']

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-18
      • 2019-06-21
      • 1970-01-01
      • 2010-11-25
      • 2011-09-24
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      相关资源
      最近更新 更多