Использование словаря для назначения слов с ошибками на номер строки - PullRequest
0 голосов
/ 23 мая 2010

Это код, который у меня сейчас есть:

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 ]

1 голос
/ 23 мая 2010

Когда вы вставляете новый counter в d, вы проверяете, что сначала word содержится в words. Возможно, вы хотели проверить, содержится ли word в d:

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

Проверка, содержится ли word в words или line, должна быть отдельной if.

Вы также можете упростить эту логику с помощью метода dicts setdefault():

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

Или вы делаете d a defaultdict, что еще больше упрощает назначение:

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

Об общем алгоритме. Обратите внимание, что в данный момент вы сначала выполняете итерацию по всем строкам, чтобы увеличить счетчик, а затем, когда счетчик уже достиг максимального значения, начинаете проверять слова с ошибками. Возможно, вам следует выполнить проверку для каждой строки в цикле, где вы увеличиваете счетчик.

0 голосов
/ 23 мая 2010

Формируйте то, что вы делаете, я подозреваю, что следующее вам идеально подойдет:

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 будет словарём с нераспознанными словами в качестве ключа и номерами строк, в которых слова были в качестве совпадения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...