PyEnchant将字典中的单词修正为不在字典中的单词

时间:2014-01-16 12:31:14

标签: python dictionary spelling pyenchant enchant

我正在尝试从网络论坛中获取大量自然语言并使用PyEnchant更正拼写。文本通常是非正式的,关于医疗问题,所以我创建了一个文本文件“test.pwl”,其中包含相关的医学词汇,聊天缩写等等。在某些情况下,不幸的是,html,url等的一小部分仍然存在于其中。

我的脚本旨在使用en_US字典和PWL来查找所有拼写错误的单词,并将它们完全自动地更正为d.suggest的第一个建议。它打印拼写错误的单词列表,然后打印没有建议的单词列表,并将更正的文本写入'spellfixed.txt':

import enchant
import codecs

def spellcheckfile(filepath):
    d = enchant.DictWithPWL("en_US","test.pwl")
    try:
        f = codecs.open(filepath, "r", "utf-8")
    except IOError:
        print "Error reading the file, right filepath?"
        return
    textdata = f.read()
    mispelled = []
    words = textdata.split()
    for word in words:
        # if spell check failed and the word is also not in
        # mis-spelled list already, then add the word
        if d.check(word) == False and word not in mispelled:
            mispelled.append(word)
    print mispelled
    for mspellword in mispelled:
        #get suggestions
        suggestions=d.suggest(mspellword)
        #make sure we actually got some
        if len(suggestions) > 0:
            # pick the first one
            picksuggestion=suggestions[0]
        else: print mspellword
        #replace every occurence of the bad word with the suggestion
        #this is almost certainly a bad idea :)
        textdata = textdata.replace(mspellword,picksuggestion)
    try:
        fo=open("spellfixed.txt","w")
    except IOError:
        print "Error writing spellfixed.txt to current directory. Who knows why."
        return 
    fo.write(textdata.encode("UTF-8"))
    fo.close()
    return

问题在于输出通常包含词典或pwl中单词的“更正”。例如,当输入的第一部分是:

  

我的新医生觉得我现在是双极的。经过9年被其他人视为主要沮丧之后

我明白了:

  

我的新人觉得我现在是两极的。这一点,经过9年的考虑,受到了其他人的严重压抑

我可以处理案件变更,但医生 - > dotor一点也不好。当输入更短时(例如,上面的引用是整个输入),结果是可取的:

  

我的新医生觉得我现在是两极的。经过9年被其他人视为主要沮丧之后

有人可以向我解释原因吗?用非常简单的术语来说,因为我对Python的编程和新版本都很陌生。非常感谢逐步解决方案。

2 个答案:

答案 0 :(得分:1)

我认为你的问题是你正在替换里面的字母序列。 “ER”可能是“er”的有效拼写更正,但这并不意味着您应该将“考虑”改为“考虑”。

您可以使用正则表达式而不是简单的文本替换来确保只替换完整的单词。正则表达式中的“\ b”表示“单词边界”:

>>> "considered at the er".replace( "er", "ER" )
'considERed at the ER'
>>> import re
>>> re.sub( "\\b" + "er" + "\\b", "ER", "considered at the er" )
'considered at the ER'

答案 1 :(得分:1)

    #replace every occurence of the bad word with the suggestion
    #this is almost certainly a bad idea :)

你是对的, 是个坏主意。这就是导致“考虑”被“考虑”所取代的原因。此外,即使您没有找到建议,也可以进行更换。将替换移动到if len(suggestions) > 0块。

至于替换单词的每个实例,你要做的是保存拼写错误的单词的位置以及拼写错误的单词的文本(或者只是位置,你可以在文本中查找单词稍后当你正在寻找建议时),允许重复拼写错误的单词,并仅用其建议替换单个单词。

但是,我会将实现细节和优化留给您。一步一步的解决方案无助于您学习。