#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. Извините, что я не одобрил ваш ответ, это тоже была моя ошибка, потому что я случайно написал некоторые значения в виде строк. Ваш код сохраняет только главное слово, поэтому он не возвращает все исходные ключи.