Python拼写检查器

时间:2016-02-28 03:22:59

标签: python-3.x

我需要编写一个接受字符串和列表的python拼写检查器。它将字符串中的每个单词与列表中的每个单词进行比较,如果列表中的单词是添加,减去或删除的一个字符,则返回结果。我不知道如何使我的变量x每次都不同。 这是代码:

def spelling_corrector(q,r):
    def single_insert_or_delete(s1,s2):
        s1,s2 = s1.lower(), s2.lower()
        count = 0
        if s1 == s2:
            return 0
        elif len(s1) == len(s2):
            return 2
        elif len(s1) - len(s2) == -1:
            if s1 == s2[:-1]:
                return 1
            else:
                for i in range(len(s2)):
                    if s1 == s2[:i] + s2[i+1:]:
                        return 1
                    else:
                        return 2
        elif len(s1) - len(s2) == 1:
            if s1[:-1] == s2 or s1[1:] == s2:
                return 1  

        else:
            return 2
    for word in q:
        word.lower()
        for correct in q:
            correct.lower()
            if single_insert_or_delete(word, correct) == 1:
                x = q.replace(correct)

对此有何帮助?

1 个答案:

答案 0 :(得分:0)

我在外部函数的底部看到了循环代码的许多问题。

首先,你循环q,我认为它应该是一个包含任意数量单词的字符串。如果你直接迭代这样的字符串,你会得到个别字符,我认为你不想要。您可能应该使用q.split()或类似的东西将字符串分解为单词字符串列表。

下一个问题是您正在调用word.lower()(以及之后的correct.lower()),但没有使用返回值执行任何操作。 Python中的字符串是不可变的,因此像lower这样的方法会返回一个包含所请求更改的新字符串,而不是修改现有的字符串。您可能需要word = word.lower()(以及correct = correct.lower())。但这可能会有问题,因为更改的大写可能会使replace调用后来无法正常工作。更好的方法可能是将案例视为重要案例,只需删除lower来电。

第三个问题是你的第二个循环再次出现在q上,而不是r,我认为这应该是拼写正确的单词列表。 (注意,你也应该改进你的变量名,所以它们的含义是显而易见的。)你可能想要:for correct in r:

我认为,最后两个(相互交织的)问题是你在问题中实际询问的问题。你在最后一行调用replace的第一个问题是你只传递了一个参数。 str.replace期望有两个(除了它被调用的实例之外),所以这不起作用。使用replace(word, correct)word子串correct的每一个匹配项替换为x(尽管更多关于为什么这可能不适合以后再做)。

另一个问题是变量x。您不在代码中的任何其他地方使用q,因此我不知道您打算将其用于什么。如果您只是尝试使用其中包含替换项的新字符串,我建议使用replace调用的返回值覆盖q = q.replace(word, correct) 变量:

return q

然后只需在函数底部添加"an"

请注意,在许多情况下,您的功能仍会出错,但修复它们需要进行更大规模的重新设计。对于错误的一个示例,如果您有q之类的字符串作为["and", "an"],并且您的字典包含an(在较小的字词之前有较长的字),您的代码将假设and字符串是word in r的拼写错误的版本并替换它。您可能需要首先检查单词是否拼写正确(可能是"foo foobar"),然后再检查它是否是任何其他单词中的一个字符。

另一种情况是错误的是当拼写错误的单词作为另一个单词中的前缀出现时(可能会或可能不会拼写错误)。尝试使用["food"]的单词列表修复"food foodbar",您将获得replace("foo", "food"),因为$city= $_POST['city']; $offset = $_POST['offset]; 调用不尊重字边界。