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

-1 投票
2 回答
1277 浏览
提问于 2025-04-15 23:02

这是我现在的代码:

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

根据你正在做的事情,我觉得下面这个方法非常适合你:

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将会是一个字典,里面的键是未识别的单词,而值则是这些单词所在的行号。

1

当你把新的 counter 插入到 d 里时,你首先检查 word 是否在 words 里面。其实你可能是想检查 word 是否已经在 d 里:

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

检查 word 是否在 wordsline 里,应该单独用一个 if 来做。

你也可以用字典的 setdefault() 方法来简化这个逻辑:

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

或者你可以把 d 变成一个 defaultdict,这样赋值会更简单:

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

关于这个算法的一般说明,现在你是先遍历所有行来增加计数器,然后在计数器达到最大值后,才开始检查拼写错误。其实你应该在增加计数器的循环里,顺便检查每一行。

撰写回答