2014-09-14 4 views
6

나는 단순한 감정 채광 시스템을 Naive Bayes classifier으로 만들고있다.사전에 비해 파이썬 빠른 대안?

내 분류 기준을 교육하기 위해 각 줄에 토큰 목록 (짹짹에서 생성)과 관련 정서 (-ve는 0, 양수는 4)가 포함 된 텍스트 파일이 있습니다.

0 @ switchfoot http : //twitpic.com/2y1zl - Awww , that 's a bummer . You shoulda got David Carr of Third Day to do it . ; D 
0 spring break in plain city ... it 's snowing 
0 @ alydesigns i was out most of the day so did n't get much done 
0 some1 hacked my account on aim now i have to make a new one 
0 really do n't feel like getting up today ... but got to study to for tomorrows practical exam ... 

이제 각 토큰을위한 내가 할 노력하고있어, 그것은 긍정적 인 트윗 발생 횟수를 계산하고, 얼마나 많은 시간이 부정적인 트윗에서 발생

예를 들어

. 그런 다음이 계산을 사용하여 확률을 계산할 계획입니다. 이 카운트를 저장하기 위해 내장 사전을 사용하고 있습니다. 키는 토큰이며 값은 크기가 2 인 정수 배열입니다.

이 코드는 매우 빠르게 시작하지만 느리게 진행되고 약 20 만 건의 짹짹을 처리하면 실제로 느려집니다. 초당 1 짹짹. 내 훈련 세트에는 160 만 건의 짹짹이 있기 때문에 너무 느립니다. 내가 가진 코드는 이것이다 :

def compute_counts(infile): 
    f = open(infile) 
    counts = {} 
    i = 0 
    for line in f: 
     i = i + 1 
     print(i) 
     words = line.split(' ') 
     for word in words[1:]: 
      word = word.replace('\n', '').replace('\r', '') 
      if words[0] == '0': 
       if word in counts.keys(): 
        counts[word][0] += 1 
       else: 
        counts[word] = [1, 0] 
      else: 
       if word in counts.keys(): 
        counts[word][1] += 1 
       else: 
        counts[word] = [0, 1] 
    return counts 

나는 빨리이 과정을 위해 무엇을 할 수 있는가? 더 나은 데이터 구조?

편집 : 중복되지는 않지만 일반적인 경우에는 dict보다 빠르지 만이 특정 사용 사례에서는 문제가 아닙니다.

+0

키가 존재하는지 여부를 확인하는 대신 counts [key] = counts.get (key, default = None) # 키가없는 경우 기본값을 제공 할 수 있습니다. 기본값으로 생성됩니다. –

+2

목록의 사전 사전 대신 두 개의'collections.Counter'를 사용할 수 있습니다. –

답변

10

사용하지 마십시오 if word in counts.keys() 이렇게하면 dict이 피해야하는 키를 순차적으로 살펴 보게됩니다.

그냥 if word in counts을 입력하십시오.

또는 defaultdict을 사용하십시오.

+1

파이썬 2에서,'dict.keys()'는 아마도 검색만큼 비싼 연산 인리스트를 생성합니다. 그것은 느린 사전이 아닙니다. –

+0

defaultdict가 매력처럼 작동했습니다. 이전에 200k 회선을 처리하는 데 ~ 4 시간이 걸렸지 만 이제는 160 만 회가 1 분 이내에 완료되었습니다. 감사! – hoodakaushal