2016-11-07 1 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] 

が、Pythonスクリプトは、まだ午前8時から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リストで

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

1,2,1,0 ''「は、positive_featureリストに1回発生し、Bの略'が2回発生し、' c 'が1回発生し、' e 'がpositive_featureリストで0回発生する。

+2

どのようにこのコードはおそらく8時間稼動しています?あなたのコードでcollections.Counterを使用して

は、次のようになりますか –

+0

あなたはそれがその長さの間走っていたのですか?私は印刷文をいくつか入れて、あなたがどこにいるかを監視することができます。 @EliSadoff私の賭けは、OPはサンプルデータを提供しているだけで、実際の情報は設定されていないということです。 – Fallenreaper

+0

それは長い間実行されておらず、スクリプトを完成させて終了しました。単にprintステートメントを追加すると、 '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'オブジェクトは、最後の行でiterableではありません。 –

+0

@KevinAudsおっと、電話しませんでした。それは 'Counter.items'ではなく' Counter.items() 'でなければなりません。 –

+0

TypeError: 'dict'オブジェクトの記述子 'items'に引数が必要です。 Patrick様、元の質問の更新を見たことがありますか? –

0

を行います。

count occurrences of thingsには多くの方法があります。私はperformance testedいくつかの異なるテクニックで、標準ライブラリの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()) 
関連する問題