2017-10-24 2 views
0

データ構造をマウントして、発生数を記述し、それらを正しい順序でマッピングしたいと考えています。効率的な方法でPython上の単語発生のリストを実装する

例えば:

WORD_1 => 10の出現箇所

word_2 => 5つの出現箇所

word_3 => 12の出現箇所

word_4 => 2 ocurrences

であり、各単語にはそれを表す1つのIDがあります。

kw2id = ['word_1':0, 'word_2':1, 'word_3':2, 'word_4': 3] 

ので、順序付きリストは、次のようになります。

ordered_vocab = [2, 0, 1, 3] 

例えば私のコードはこれです...:

#build a vocabulary with the number of ocorrences 
vocab = {} 
count = 0 
for line in open(DATASET_FILE): 
    for word in line.split(): 
     if word in vocab: 
      vocab[word] += 1 
     else: 
      vocab[word] = 1 
    count += 1 
    if not count % 100000: 
     print(count, "documents processed") 

私はこの効率的方法を行うことができますか?

+0

それで、オカレンスはどのように格納されていますか?私はそれが入力の1つだと推測しています。サンプル入力を明確に定義できますか? – Divakar

+1

'collections.Counter'を使用せず、いくつかの規則でキーをソートするのはなぜですか? –

答えて

3

Countersがために作られた何が:

from collections import Counter 
cnt = Counter() 

with open(DATASET_FILE) as fp: 
    for line in fp.readlines(): 
     for word in line.split(): 
      cnt[word] += 1 

または使用(短く、より「美しいです」ジェネレーター):

from collections import Counter 

with open(DATASET_FILE) as fp: 
    words = (word for line in fp.readlines() for word in line.split()) 
    cnt = Counter(words) 
+0

たとえば、カウンタobjの3つの上位ワードを印刷できますか? –

+1

Nvm、ちょうど繰り返しを使用してください...ありがとう、これは問題を解決します。 –

+0

@denisCandido:ようこそ。 – Jan

2

これは若干速いバージョンのコードですが、numpyはうまく分かりませんが、これは役に立ちます。enumeratedefaultdict(int)は私が行った変更です(これを受け入れる必要はありません

from collections import Counter 
from collections import defaultdict 
import time 

words = " ".join(["word_"+str(x) for x in range(100)]) 
lines = [words for i in range(100000)] 

counter_dict = Counter() 
default_dict = defaultdict(int) 

start = time.time() 
for line in lines: 
    for word in line.split(): 
     counter_dict[word] += 1 
end = time.time() 
print (end-start) 

start = time.time() 
for line in lines: 
    for word in line.split(): 
     default_dict[word] += 1 
end = time.time() 
print (end-start) 

結果:0から始まるとき答え、ちょうど)を助けるためにも

from collections import defaultdict 

#build a vocabulary with the number of ocorrences 
vocab = defaultdict(int) 
with open(DATASET_FILE) as file_handle: 
    for count,line in enumerate(file_handle): 
     for word in line.split(): 
      vocab[word] += 1 
     if not count % 100000: 
      print(count, "documents processed") 

defaultdict(int)をしようとするとループ()はPython 3.44を実行するために増加のために二倍の速Counter()のように表示されます。

5.353034019470215 
2.554084062576294 

あなたはこの主張に異議を唱えるしたい場合、私はこの質問にあなたを参照してください。Surprising results with Python timeit: Counter() vs defaultdict() vs dict()

1

collection.Counterを使用できます。カウンターを使用すると、リストを入力することができ、各エレメントの出現回数が自動的にカウントされます。

from collections import Counter 
l = [1,2,2,3,3,3] 
cnt = Counter(l) 

あなたが何ができるかので、上記の回答のほかに、それはファイルのうち、単語のリストを作成するために、代わりに手動でリスト内の各要素を反復処理のリストとカウンターを使用しています。ファイルがあなたのメモリに比べて大きすぎる場合、この方法は適していないことに注意してください。

0

文字列:

>>> a = 'word_1 word_2 word_3 word_2 word_4' 

のID

>>> d = {'word_1':0, 'word_2':1, 'word_3':2, 'word_4': 3} 

ワードカウントを生成するには:

>>> s = dict(zip(a.split(), map(lambda x: a.split().count(x), a.split()))) 
>>> s 
{'word_1': 1, 'word_2': 2, 'word_3': 1, 'word_4': 1} 

順序付きリストを生成するには:

>>> a = sorted(s.items(), key=lambda x: x[1], reverse=True) 
>>> ordered_list = list(map(lambda x: d[x[0]], a)) 
>>> ordered_list 
[1, 0, 2, 3] 
関連する問題