2016-02-28 100 views
-1

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

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) 

对此有何帮助?

+0

是不是'q'应该是一个句子? (这似乎与[此问题]非常相似(http://stackoverflow.com/questions/35672938/write-a-function-named-spelling-corrector/35673773#35673773)。) –

+0

是的,q是一个句子和split()使其成为单词列表 –

+0

@Auston Hastings:你的答案似乎不起作用! –

回答

0

我在外层函数的底部看到了一些有关循环代码的问题。

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

接下来的问题是,你打电话word.lower()(和以后的correct.lower()),但没有做任何与返回值。 Python中的字符串是不可变的,因此像lower这样的方法会返回一个新的字符串,其中包含所请求的更改,而不是修改现有的字符串。您可能需要word = word.lower()(和correct = correct.lower())。但这可能会有问题,因为更改后的大小写可能会使以后的呼叫无法正常工作。更好的方法可能是将案件视为重要案件,只需删除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")调用不尊重单词边界。

+0

它说在第26行中:bool类型的对象没有len。 –