#python #python-2.7 #dictionary #nlp #text-processing
#python #python-2.7 #словарь #нлп #обработка текста
Вопрос:
У меня есть словарь, в котором в качестве «ключей» используется комбинация двух слов, а в качестве «значений» — определенное число.» Пример:
bigram_counts = {(u',', u'which'): 1, (u'of', u'the'): 2, ('<UNK>', u'by'): 2, (u'in', '<UNK>'): 1, ('<UNK>', u'charge'): 1, (u'``', '<UNK>'): 2, (u'The', u'and'): 1, ('<UNK>', u'reports'): 1, (u'an', '<UNK>'): 1, (u'election', u'was'): 1, ('<UNK>', u'primary'): 2, (u'that', '<UNK>'): 1, (u'that', u'the'): 1, (u'and', u'Fulton'): 1, ('<UNK>', u'to'): 1, (u'primary', u'election'): 1, (u'had', u'been'): 1, (u'primary', u'which'): 1, (u'The', '<UNK>'): 1, (u'the', u'election'): 2, (u'irregularities', u'took'): 1, (u',', u'``'): 1, ('<UNK>', u'that'): 1, ('<UNK>', u'of'): 2, (u'the', u'City'): 2, (u'in', u'which'): 1, (u'jury', '<UNK>'): 1, ('<UNK>', u'.'): 2, ('<UNK>', u'the'): 1, (u'of', u"Atlanta's"): 1, ('<UNK>', u'jury'): 1, (u'had', '<UNK>'): 1, (u'election', '<UNK>'): 1, (u'Fulton', u'County'): 1, ('<UNK>', u'``'): 2, (u'of', '<UNK>'): 1, ('<UNK>', u'said'): 2, (u'place', u'.'): 1, ('<UNK>', u'and'): 1, (u'election', u','): 1, (u"Atlanta's", '<UNK>'): 1, (u'which', u'the'): 1, (u'been', '<UNK>'): 1, (u'charge', u'of'): 1, (u'County', '<UNK>'): 1, (u'by', u'Fulton'): 1, (u'reports', u'of'): 1, (u'manner', u'in'): 1, ('<UNK>', u'an'): 1, (u"''", u'in'): 1, (u'the', '<UNK>'): 2, (u'said', '<UNK>'): 1, (u'Fulton', '<UNK>'): 1, (u'The', u'jury'): 1, (u'Atlanta', u"''"): 1, (u'``', u'irregularities'): 1, (u'in', u'the'): 1, (u'took', u'place'): 1, (u'for', u'the'): 1, (u'irregularities', u"''"): 1, ('<S>', u'The'): 3, (u"''", u'that'): 1, (u'City', '<UNK>'): 1, (u'which', u'was'): 1, (u"''", u'for'): 1, (u'was', '<UNK>'): 2, (u'jury', u'had'): 1, (u'said', u'in'): 1, (u'by', '<UNK>'): 1, ('<UNK>', u"''"): 1, ('<UNK>', u'irregularities'): 1, (u'to', '<UNK>'): 1, (u'.', '</S>'): 3, (u'of', u'Atlanta'): 1, ('<UNK>', u','): 1, (u'City', u'of'): 1, (u'and', '<UNK>'): 1, (u'which', u'had'): 1, (u'the', u'manner'): 1, ('<UNK>', '<UNK>'): 12}
Я хочу вернуть новый словарь, содержащий сумму всех значений для всех «отличных первых слов» в «ключе», а вторым словом может быть любое слово.
Пример:
В приведенных выше bigram_counts есть 4 элемента, у которых » u’of'» в качестве «первого слова» в ключе и сумма их значений равна 5.
У меня также есть другой словарь, в котором есть все «отличающиеся слова», чтобы помочь в вычислении. Пример:
unigram_counts = {u'and': 2, u'City': 2, u"Atlanta's": 1, u'primary': 2, u'an': 1, u"''": 3, u'election': 3, u'in': 3, '<UNK>': 35, u'said': 2, u'for': 1, u'had': 2, u',': 2, u'been': 1, u'.': 3, u'to': 1, u'charge': 1, u'which': 3, u'Atlanta': 1, u'was': 2, u'``': 3, u'jury': 2, u'that': 2, '<S>': 4, u'took': 1, u'The': 3, u'by': 2, u'Fulton': 2, u'of': 5, u'reports': 1, u'irregularities': 2, u'County': 1, u'place': 1, u'the': 7, '</S>': 1, u'manner': 1}
На самом деле, unigram_counts уже имеет нужную мне сумму. Однако мне нужно вычислить сумму из bigram_counts и сопоставить ее со значениями unigram_counts.
Спасибо
Ответ №1:
@Baruchel прав, что это, вероятно, плохая структура для обработки этого, но в любом случае:
unigram_counts = collections.defaultdict(int)
for (first, _), val in bigram_counts.iteritems():
unigram_counts[first] = val
Кажется, это работает
Комментарии:
1. Да, кажется, это работает. Но в новом словаре отсутствует один элемент. Это для токена ‘</S>’. Проверьте сами: print(len(unigram_counts)) #36 print(len(ret)) #35 Кроме того, Барушель, @MateuszL можете ли вы, пожалуйста, предложить лучший способ хранения такой структуры данных. Спасибо.
2. Три лучше =)
3. @New_Coder ‘</S> — это второе слово, поэтому его нет в unigram_counts. Его первое слово ‘.’ и присутствует.
4. @New_Coder По правде говоря, мы не знаем остальной части программы, поэтому, возможно, такая структура оправдана в другом месте. Возможно, лучше было бы что-то вроде bigram_counts[firstword][secondword] = count , то есть bigram_count сопоставляет первое слово с другим dict, который сопоставляет второе слово с count. Это может быть дороже, но я всегда думаю, что в Python мы оптимизируем для удобства программиста, а не для производительности — поэтому все, что кажется вам простым, является лучшим 🙂
5. @MateuszL Спасибо, ваш код решения был очень умным и коротким.
Ответ №2:
Похоже, что метод, который вы выбрали для хранения ваших данных, не самый лучший для этой задачи. Вы можете достичь этого, конечно, но, возможно, другая система хранения данных была бы более удобной. Однако, если вам действительно нужно сделать это таким образом, вы должны попробовать что-то вроде:
unigram_counts = {}
for e in bigram_counts:
if e[0] in unigram_counts:
unigram_counts[e[0]] = bigram_counts[e[0]]
else:
unigram_counts[e[0]] = bigram_counts[e[0]]
(не тестировалось, но идея в этом).
Комментарии:
1. Большое вам спасибо!. Не могли бы вы, пожалуйста, предложить лучший способ хранения такой структуры данных.