2017-02-01 9 views
0

Я добытый список словарей из Стэнфордского НЭКЕ и создал список вроде следующий:Python: Подсчет имен в списке dictiopnaries

myList = [ 
{'A':{},'B':['C','D'], 
'names': {'PERSON': [u'John Butters', u'Bill', u'Hillary Clinton'],'LOCATION': [], 
'ORGANIZATION': [u'FactSet', u'Pfizer Inc. PFE']}}, 
{'A':{'Hello'},'B':['F','E'], 
'names': {'PERSON': [u'Tim Anderson', u'Hillary Clinton'], 'LOCATION': [ u'US'], 
'ORGANIZATION': [u'Goldman Sachs GS', u'ConocoPhillips COP', u'FactSet']}}, 
{'A':{'right'},'B':['M','N'], 
'names': {'PERSON': [u'Mohammed bin Salman', u'Spano'], 'LOCATION': [u'Saudi Arabia',u'Red Sea'], 
'ORGANIZATION': [u'Aramco', u'FactSet', u'Goldman Sachs GS']}} 
] 

В другом слове у меня есть список, как:

myList = [{},{},{}] 

Каждый словарь содержит подробную информацию для одного конкретного документа. Ключ «имен» представляет собой словарь, как:

'names':{'PERSON':[], 'LOCATION':[], 'ORGANIZATION':[]} 

Я намерен извлечь частоту значений под ключ «имен» ----> «ОРГАНИЗАЦИЯ» по всему документу, а затем подсчитать, как много раз каждая пара имен происходила вместе в myList. Любая помощь будет принята с благодарностью. Вывод должен выглядеть следующим образом:

{u'FactSet': 3, u'Pfizer Inc. PFE':1, u'Goldman Sachs GS':2, u'ConocoPhillips COP':1, u'Aramco':1} 

И, наконец, я хочу, чтобы рассчитывать со-вхождения указанных имен. Выход может быть как:

{[u'FactSet', u'Pfizer Inc. PFE']:1, 
[u'Goldman Sachs GS', u'ConocoPhillips COP']:1, 
[u'Goldman Sachs GS', u'FactSet'] :2, 
[u'Aramco', u'FactSet']:1, 
[u'Aramco', u'Goldman Sachs GS']:1 } 

ответ

0

Вот решение, которое использует itertools.combination легко получить все пары из списка:

from itertools import combinations 

myList = [ 
{'A':{},'B':['C','D'], 
'names': {'PERSON': [u'John Butters', u'Bill', u'Hillary Clinton'],'LOCATION': [], 
'ORGANIZATION': [u'FactSet', u'Pfizer Inc. PFE']}}, 
{'A':{'Hello'},'B':['F','E'], 
'names': {'PERSON': [u'Tim Anderson', u'Hillary Clinton'], 'LOCATION': [ u'US'], 
'ORGANIZATION': [u'Goldman Sachs GS', u'ConocoPhillips COP', u'FactSet']}}, 
{'A':{'right'},'B':['M','N'], 
'names': {'PERSON': [u'Mohammed bin Salman', u'Spano'], 'LOCATION': [u'Saudi Arabia',u'Red Sea'], 
'ORGANIZATION': [u'Aramco', u'FactSet', u'Goldman Sachs GS']}} 
] 

orgs_by_group = [group['names']['ORGANIZATION'] for group in myList] 

org_counts = {} 
org_pair_counts = {} 

for org_group in orgs_by_group: 
    #Update counts of orgs 
    for org in org_group: 
     if org not in org_counts: 
      org_counts[org] = 1 
     else: 
      org_counts[org] += 1 

    #Update counts of org pairs 
    for pair in combinations(org_group,2): 
     k = '|'.join(sorted(pair)) #<-- key for org_pair_counts dict 
     if k not in org_pair_counts: 
      org_pair_counts[k] = 1 
     else: 
      org_pair_counts[k] += 1 

print('Org counts:') 
print org_counts 
print('') 
print('Org pair counts:') 
print org_pair_counts 

ВЫВОД:

Org counts: 
{u'Pfizer Inc. PFE': 1, u'ConocoPhillips COP': 1, u'Goldman Sachs GS': 2, u'FactSet': 3, u'Aramco': 1} 

Org pair counts: 
{u'Aramco|Goldman Sachs GS': 1, u'Aramco|FactSet': 1, u'FactSet|Goldman Sachs GS': 2, u'ConocoPhillips COP|FactSet': 1, u'ConocoPhillips COP|Goldman Sachs GS': 1, u'FactSet|Pfizer Inc. PFE': 1} 

ПРИМЕЧАНИЕ: не может быть списком ключей в словаре, поэтому ваш пример вывода для совпадений не работает, поэтому я сделал их строки