Обновление значений словаря на основе ключей другого словаря

#python #dictionary #nltk

Вопрос:

У меня есть словарь, который содержит разные значения слов, некоторые из которых являются морфологическими формами одного и того же слова:

 test_dictionary = {'und': 2,
 'der': 326,
 'die': 667,
 'in': 46456,
 'den': 16628950,
 'zu': 222,
 'Buch': 300,
 'Büchern': 20,
 'Lehrerin': 20,
 'Lehrerinnen': 2}
 

Я хочу сгруппировать слова, происходящие от одних и тех же слов, и присвоить им одно и то же значение, которое является суммой значений слов в этом кластере. Так:

 new_dictionary = {'und': 2,
     'der': 1159,
     'die': 1159,
     'in': 46456,
     'den': 1159,
     'zu': 222,
     'Buch': 320,
     'Büchern': 320,
     'Lehrerin': 22,
     'Lehrerinnen': 22} 
 

Что я делал до сих пор, так это использовал Спейси для сдерживания:

 nlp = spacy.load("de_core_news_sm")
test_list = list(test_dictionary.keys())
test_lemmas = [nlp(a)[0].lemma_ for a in test_list]
test_counter = Counter(test_lemmas)
counter_test_dictionary={}
for key, value in test_counter.items():
    counter_test_dictionary[key] = value
counter_test_dictionary

{'und': 1,
 'der': 3,
 'in': 1,
 'zu': 1,
 'Buch': 2,
 'Lehrerin': 2}
 

Я знаю, как суммировать значения словаря, но как мне использовать это counter_test_dictionary (если я могу), чтобы точно знать, какие значения суммировать. Примечание: этот пример представляет собой небольшой фрагмент из огромного набора слов, поэтому мне также может потребоваться проверить, насколько это дорого с точки зрения вычислений.

Ответ №1:

Вот возможное решение:

 from collections import defaultdict

nlp = spacy.load("de_core_news_sm")
word2lemma = {word: nlp(word)[0].lemma_ for word in test_dictionary}
new_dictionary = defaultdict(int)
for word, value in test_dictionary.items():
    new_dictionary[word2lemma[word]]  = int(value)
new_dictionary = dict(new_dictionary)
 

Комментарии:

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