У меня такой код:
def sent_dictionary(text):
token_dictionary = {}
both_keys = in_both.keys()
sentences = sent_tokenize(text)
tokens = word_tokenize(str(sentences))
for token in tokens:
if token in both_keys:
token_dictionary[token]=in_both[token]
print(token_dictionary)
У меня есть словарь in_both, который содержит слова, которые есть в словаре, и мой текст, который выглядит так:
{'think': -0.125, 'seem': 0.0, 'able': 0.25, 'make': 0.0, 'correct': 0.0, 'understand': 0.125, 'words': -0.125, 'appropriate': 0.0, 'confuse': -0.375, 'underactive': -0.625, ... }
Я хочу, чтобы моя функция принимала ввод текста, разбивалась на предложения, а затем на слова. Затем, если слово также находится в словаре in_both, поместите его в token_dictionary вместе со значением, которое находится в in_both.
Когда я пытаюсь использовать эту функцию, происходит следующее:
sent_dictionary("His father was a successful local businessman and his mother was the daughter of a landowner. Shakespeare is widely regarded as the greatest writer in the English language and the world's pre-eminent dramatist. He is often called England's national poet and nicknamed the Bard of Avon")
Результат:
{}
{}
{}
{}
{}
{}
{}
{}
{}
{'language': 0.0}
{'language': 0.0}
{'language': 0.0}
{'language': 0.0}
{'language': 0.0}
{'language': 0.0}
{'language': 0.0}
{'language': 0.0}
{'language': 0.0}
{'language': 0.0}
{'language': 0.0}
{'language': 0.0}
{'language': 0.0}
{'language': 0.0, 'often': 0.25}
{'language': 0.0, 'often': 0.25}
{'language': 0.0, 'often': 0.25}
{'language': 0.0, 'often': 0.25}
{'language': 0.0, 'often': 0.25}
{'language': 0.0, 'often': 0.25}
{'language': 0.0, 'often': 0.25}
Я хочу, чтобы результат выглядел так:
{'language': 0.0, 'often': 0.25}
Теперь, когда я думаю об этом, в моем тексте есть кратные, с которыми я работаю. Поэтому я не хочу их исключать, мне нужно, чтобы все токены были учтены.
Проблема в том, что у вас есть print(token_dictionary)
внутри цикла for
. Итак, вы снова и снова распечатываете весь словарь. Просто удалите эту строку, чтобы это произошло только после завершения цикла.
Что вы имеете в виду под «учитываются все жетоны»?
Если вы хотите обрабатывать повторяющиеся ключи, суммируя все значения для каждого ключа, вы должны использовать defaultdict(float)
или Counter
(оба в модуле collections
в stdlib) вместо простого dict для token_dictionary
, затем выполните token_dictionary[token] += in_both[token]
.
Если вы хотите обрабатывать повторяющиеся ключи, например, сохраняя набор всех значений, идея та же; просто используйте defaultdict(set)
и token_dictionary[token].add(in_both[token])
. Или, если хотите, используйте простой диктатор и выполните token_dictionary.setdefault(token, set()).add(in_both[token])
. (Разница в том, что когда вы будете искать что-то позже, defaultdict
предоставит вам пустой набор неизвестных ключей, а обычный dict, который вы создали с помощью setdefault
, даст вам KeyError
.)
@abarnert, я получаю ключевую ошибку. ---> 12 token_dictionary [токен] .add (in_both [токен]) 13 new_token_dict = token_dictionary 14 text_values = list (new_token_dict.values ()) KeyError: 'who'
@Shelina Какое решение вы получили KeyError
? Вы заменили token_dictionary
на default_dict(set)
вместо обычного set
?
@abarnert да, я заменил token_dictionary на default_dict (set)
Можете ли вы отредактировать свой вопрос, чтобы показать нам обновленный код, а также полное исключение и трассировку?
Вы вызываете print во внешнем цикле вложенного цикла for, возможно, вы захотите назвать его после, цикл for завершен.