使用字典将拼写错误的单词分配给其行号

时间:2010-05-23 12:05:45

标签: python dictionary spell-checking

这是我目前的代码:

from collections import defaultdict

goodwords = set()

with open("soccer.txt", "rt") as f:
     for word in f.readlines():
        goodwords.add(word.strip())

badwords = defaultdict(list)

with open("soccer.txt", "rt") as f:
    for line_no, line in enumerate(f):
        for word in line.split():
            if word not in text:
                badwords[word].append(line_no)

print(badwords)

如何修复我的代码,以便打印存储在words列表中的错误字词和行号?

例如,如果单词togeher在第5行和第7行拼写错误,则会显示如下内容:

togeher 5 7

2 个答案:

答案 0 :(得分:1)

当您将新的counter插入d时,先检查word是否包含在words中。您可能想检查word中是否已包含d

if word not in d:
    d[word] = [counter]
else:
    d[word].append(counter)

检查wordwords中是否包含line应该是一个单独的if

您还可以使用dicts setdefault()方法简化此逻辑:

d.setdefault(word, []).append(counter)

或者您d成为defaultdict,这进一步简化了作业:

from collections import defaultdict
d = defaultdict(list)
...
d[word].append(counter)

关于一般算法注意,当你首先遍历所有行以递增计数器然后,当计数器已经达到它的最大值时,开始检查拼写错误的单词。可能你应该检查循环中增加计数器的每一行。

答案 1 :(得分:0)

形成你正在做的事情,我怀疑以下内容会非常适合你:

from collections import defaultdict

text = ( "cat", "dog", "rat", "bat", "rat", "dog",
         "man", "woman", "child", "child") #

d = defaultdict(list)

for lineno, word in enumerate(text):
    d[word].append(lineno)

print d

这为您提供了输出:

defaultdict(<type 'list'>, {'bat': [3], 'woman': [7], 'dog': [1, 5],
                            'cat': [0], 'rat': [2, 4], 'child': [8, 9],
                            'man': [6]})

这只是设置一个空的默认字典,其中包含您访问的每个项目的列表,这样您就不必担心创建条目,然后在单词列表中枚举它,所以你不需要需要跟踪行号。

由于您没有正确拼写的列表,因此实际上并未检查单词是否拼写正确,只是在文本文件中构建所有字典。

要将字典转换为一组字词,请尝试:

all_words = set(d.keys())
print all_words

产生:

set(['bat', 'woman', 'dog', 'cat', 'rat', 'child', 'man'])

或者,只是打印单词:

for word in d.keys():
    print word

编辑3:

我认为这可能是最终版本: 这是一个(故意)非常粗糙,但几乎完整的拼写检查。

from collections import defaultdict

# Build a set of all the words we know, assuming they're one word per line
good_words = set() # Use a set, as this will have the fastest look-up time.
with open("words.txt", "rt") as f:
    for word in f.readlines():
        good_words.add(word.strip())

bad_words = defaultdict(list)

with open("text_to_check.txt", "rt") as f:
    # For every line of text, get the line number, and the text.
    for line_no, line in enumerate(f):
        # Split into seperate words - note there is an issue with punctuation,
        # case sensitivitey, etc..
        for word in line.split():
            # If the word is not recognised, record the line where it occurred.
            if word not in good_words:
                bad_words[word].append(line_no)

最后,bad_words将是一个字典,其中包含无法识别的单词作为键,以及单词作为匹配值条目的行号。