二进制搜索Python拼写检查

时间:2014-03-30 02:57:44

标签: python dictionary binary

我正在尝试导入文本文件(所有小写单词,没有标点符号)并将这些单词与单词的词典列表进行比较。如果单词未出现在词典列表中,则打印为可能不正确。如果单词确实出现在词典列表中,则不执行任何操作。我们应该在这里使用二进制搜索方法。我认为我的二分查找方法是正确的,我只是不知道在哪里/如何返回未出现在字典列表中的单词并宣布它们可能不正确。

谢谢!

我的输入文件句子:快速的红狐狸跳过慵懒的brn狗

def spellcheck(inputfile):

filebeingchecked=open(inputfile,'r')
spellcheckfile=open("words.txt",'r')

dictionary=spellcheckfile.read().split()
checkedwords=filebeingchecked.read().split()

for word in checkedwords:

    low = 0
    high=len(dictionary)-1

    while low <= high:

        mid=(low+high)//2
        item=dictionary[mid]

        if word == item:
            return word

        elif word < item:
            high=mid-1

        else:
            low=mid+1

    return word

def main():

    print("This program accepts a file as an input file and uses a spell check function to \nidentify any problematic words that are not found in a common dictionary.")
    inputfile=input("Enter the name of the desired .txt file you wish to spellcheck: ")

main()

2 个答案:

答案 0 :(得分:0)

当您要搜索的数组为空时,二进制搜索“结束”。在您的情况下,您使用lowhigh跟踪数组的开始和结束索引,并且您应该继续搜索while low <= high

但是,当(low <= high) == False并且您没有找到匹配的单词时,对于您的程序的逻辑意味着什么?

这意味着这个单词不在您的字典中,您应该采取适当的措施(将其添加到“错误单词”列表中。

当然,只有在查看完所有单词后,才会输出错误单词列表。

答案 1 :(得分:0)

word == item时,您不想返回该字词。你想要摆脱while循环。但是,退出while循环有两个条件:

  1. 当单词出现在词典中时,您会跳出while循环或
  2. 当单词不在词典中时,最终while循环将结束
  3. 那么,我们如何辨别两者之间?事实证明,在Python中,elsewhile循环有一个for子句:else子句中的代码仅在循环自然结束而不是结果时才执行break语句,这就是我使用的。

    此外,要返回多个单词,我可以在列表中收集它们并稍后返回该列表,或者我可以使用yield关键字。看看它是如何工作的。

    def spellcheck(inputfile):
    
        filebeingchecked=open(inputfile,'r')
        spellcheckfile=open("words.txt",'r')
    
        dictionary=spellcheckfile.read().split()
        checkedwords=filebeingchecked.read().split()
    
        for word in checkedwords:
    
            low = 0
            high=len(dictionary)-1
    
            while low <= high:
    
                mid=(low+high)//2
                item=dictionary[mid]
    
                if word == item:
                    break
    
                elif word < item:
                    high=mid-1
    
                else:
                    low=mid+1
            else:
                yield word
    
    def main():
    
        print("This program accepts a file as an input file and uses a spell check function to \nidentify any problematic words that are not found in a common dictionary.")
        inputfile=input("Enter the name of the desired .txt file you wish to spellcheck: ")
        for word in spellcheck(inputfile):
            print(word)
    
    main()