2017-02-25 5 views
0

私は、各単語が世界的に何回出現するかを数え、どの文書に格納するかを数えながら、文書のリストを調べています。したがって、私は多かれ少なかれ、キーとその単語であり、値はカウントであり、文書IDのリストであるデータ構造が必要です。単語とその単語が表示される文書を数えるために使用するデータ構造はどれですか?

基本的にはそうですね。 :

{ 
'word1': [num1, [id1, id2, id3]], 
'word2': [num2, [id2, id4, id5]], 
'word3': [num3, [id1, id4, id6, id]] 
} 

このような種類のものはありますか?

何が必要なのである:新しい行を作成する必要があります

  • 私が押してる単語が存在しない場合、
  • numフィールドをインクリメントするのは簡単でなければならない、
  • idのリストは新しい文書で簡単に更新できますid

私はdictを使用すべきですか?または、他の何か ?私はlistとそれぞれの単語について['word', num, [id1, id2, id3]]とすることができますが、簡単なコードではコードがかなり複雑になると感じていますので、わからない他のデータ構造があるかどうか疑問です私の使用のために良い?

+1

主なユースケースは何ですか?例えば特定の単語がいくつあるか知りたいですか?または、特定の文書内にいくつのユニークな単語がありますか?これは、あなたが鍵となるべきものとあなたが価値を挙げるべきものに差をつけます。まず、あなたの構造がどのように使われるか考えてみましょう。ランダムアクセスまたはシーケンシャルアクセスが必要ですか? – rism

+0

30の最も頻繁な単語を表示したいので、最も頻繁に言及されるものが何であるかを知ることができます(文書は実際につぶやきです)。それらが見つかると、私は他のすべての言葉を取り除きます。特定の単語が見つかるように見えるようなつぶやきが必要なので、IDを保存する必要があります。私は主に合理的に速いことを確認することに関心があります(スクリプトは毎分複数回実行できます)。ありがとう –

答えて

0

私は、チェーンのコンセプトでハッシュすることをお勧めします。 文書を参照してくださいhere 最悪の場合の複雑さはO(n)です。

1
from collection import defaultdict 
import re 

s = "the task is to find the frequency of words in multiple docs" 
ids = { 'the': [1,2,4], 'frequency' : [2,3] , 'of' : [1,2,3,4,5], 'words': [8] } 
d = defaultdict(int) 

#build the histogram of words: 
for w in re.findall('\w+',s): 
    d[w] += 1 

#new dictionary of frequency and ids: 
new_ids = defaultdict(list) 

for k in d: 
    new_ids[k].append(d[k]) 
for k in ids: 
    new_ids[k].append(ids[k]) 

出力:つまり

>>>new_ids 
defaultdict(list, 
      {'docs': [1], 
      'find': [1], 
      'frequency': [1, [2, 3]], 
      'in': [1], 
      'is': [1], 
      'multiple': [1], 
      'of': [1, [1, 2, 3, 4, 5]], 
      'task': [1], 
      'the': [2, [1, 2, 4]], 
      'to': [1], 
      'words': [1, [8]]}) 

、1つのアプローチは、簡単にカウントを作成し、値にリストを追加するために、その機能を利用するために、デフォルトの辞書を組み合わせることです。

関連する問題