2016-11-07 2 views
0

Я хочу посчитать вхождения положительной/отрицательной частоты документа для каждого токена. Но мой скрипт python работает и работает на все утро. Не могли бы вы рассказать мне, что не так с чем-то? Оценивается заранее.Как эффективно подсчитывать вхождения каждого ключа в список словарей?

import numpy as np 
positive_feature=[[{'a':2,'b':1},1], 
        [{'b':2,'c':1},1] 
       ] 

negative_feature=[[{'e':2,'b':1},0] 
       ] 
alltokens=['a','b','c','e'] 

dic=dict((t,i) for i,t in enumerate(alltokens)) 

vacabulary_size=len(dic) 

positive_doc_frequency,negative_doc_frequency=np.zeros(vacabulary_size), np.zeros(vacabulary_size) 

for t in alltokens: 
    for x in positive_feature: 
     if t in x[0].keys(): 
      positive_doc_frequency[dic[t]]+=1 
    for x in negative_feature: 
     if t in x[0].keys(): 
      negative_doc_frequency[dic[t]]+=1 

Согласно приказу элементного alltokens списка, я хочу к positive_doc_frequency/negative_doc_frequency это вроде как:

alltokens=['a','b','c','e'] 
positive_doc_frequency=[1,2,1,0] 
negative_doc_frequency=[0,1,0,1] 

но сценарий питона все еще работает сейчас, (с 8:00 до 4 : 00PM), Любая оптимизация для моего скрипта? Еще раз спасибо.

ОБНОВЛЕНИЕ: Вопрос вводит в заблуждение из-за плохих данных образца. Позвольте мне исправить это.

Вход:

alltokens=['a','b','c','e'] 
positive_feature=[[{'a':aa,'b':bb},1], 
        [{'b':vv,'c':cc},1] 
       ] 

negative_feature=[[{'e':ee,'b':bb},0] 
       ] 

Выход я хочу это:

positive_doc_frequency=[1,2,1,0] 
negative_doc_frequency=[0,1,0,1] 

1,2,1,0 в списке positive_doc_frequency означает 'а' встречается один раз в списке positive_feature, «б «происходит два раза,« c »происходит один раз,« e »имеет нулевое время в списке положительных_файлов.

+2

Как этот код, возможно, работает уже в течение 8 часов? –

+0

Вы уверены, что работали в течение этого периода времени? Я бы поставил некоторые заявления о печати, чтобы вы могли затем контролировать, где вы лучше. @EliSadoff Моя ставка заключается в том, что OP просто дает образцы данных, а не является фактической информацией. – Fallenreaper

+0

Он не работает так долго, он только что завершил сценарий и вышел, просто добавьте инструкцию печати, и вы получите вывод 'print (positive_doc_frequency)' 'print (negative_doc_frequency)' – user2728397

ответ

0
from itertools import chain 
from collections import Counter 
c = Counter(chain.from_iterable(d for d, x in positive_feature)) 
print(*sorted(c.items())) 

Это делает список всех ключей в positive_feature, затем подсчитывает, сколько из каждого ключа есть, то печатает счетчики.

Чтобы получить отсчеты, как вы хотите их сделать

pos_freq = [c[key] for key in alltokens] 
+0

Привет, есть TypeError: объект 'method_descriptor' не является итерируемым в последней строке. –

+0

@KevinAuds oops, не называл это. Это должно быть 'Counter.items()' not 'Counter.items' –

+0

TypeError: дескриптор 'items' объекта 'dict' нуждается в аргументе. Дорогой Патрик. Вы видели мое обновление по оригинальному вопросу? –

0

Я не знаю, почему ваш код был бы побежал за такой отрезок времени, даже с большим набором данных.

Существует много способов для count occurrences of things в Python. I performance tested несколько различных методов и обнаружили, что collections.Counter в стандартной библиотеке был самым быстрым подходом (не удивительно, поскольку он оптимизирован именно для этого варианта использования).

collections.Counter Использование с вашим кодом будет выглядеть примерно так:

from collections import Counter 

positive_doc_frequency = Counter() 
negative_doc_frequency = Counter() 

for t in alltokens: 
    for x in positive_feature: 
     positive_doc_frequency.update(x[0].keys()) 
    for x in negative_feature: 
     negative_doc_frequency.update(x[0].keys()) 
Смежные вопросы