1

我正在尝试从网络论坛中获取大量自然语言并使用 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 也很陌生。一步一步的解决方案将不胜感激。

4

2 回答 2

1

我认为您的问题是您要替换单词中的字母序列。“ER”可能是“er”的有效拼写更正,但这并不意味着您应该将“considered”更改为“considered”。

您可以使用正则表达式代替简单的文本替换,以确保只替换完整的单词。正则表达式中的“\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'
于 2014-01-16T12:46:12.757 回答
1
    #replace every occurence of the bad word with the suggestion
    #this is almost certainly a bad idea :)

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

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

不过,我将把实现细节和优化留给你。循序渐进的解决方案不会帮助您学到很多东西。

于 2014-01-16T12:46:18.547 回答