2016-10-04 11 views
1

私はbigramsとunigramsを扱っています。Pythonでリスト内の要素にアクセスできない

私のバイグラムはタプルのカウンタであり、私のユニグラムは私がfollwing

for b,countB in bigrams.most_common() 
     key=b[0] # this is guaranteed to be a key for my unigrams 
     uniCount=uni[key] 

を実行しようとしてい

uni['some key']=count 

リスト、次のエラーが発生している:

TypeError: tuple indeces must be integers or slices, not str 

私は混乱しています。なぜこれが問題であるべきですか? uniは基本的にハッシュですが、そのキー値は文字列です。どのように私は[鍵]にアクセスできますか?

編集:完全なコード

# corpus is a string containing my corpus 
sp=corpus.split() 

uni={} 
for t in sp: 
     try: 
      uni[t]+=1 
     except: 
      uni[t]=0 
prev='' 
big=[] 
for t in sp: 
     tup=(prev,t) 
     big.append(tup) 
     prev=t 

bigrams=collections.Counter(big) 

for b,countB in bigrams.most_common(): 
     key=b[0] 
     uniCount=uni[key] 
+0

あなたは 'プリントを( "{}" を実行したときに何を得るのですか)形式(キー。 ) '' key = b [0] 'の直後ですか? – Samundra

+2

もっとコードが必要です。エラーによると、 'uni'は' dict'と主張している間に 'tuple'です。 – tzaman

+0

実際、 "私のunigramsはリストです"という文は、uni ['some key'] = count'の例と衝突します。リストはそのように索引付けすることもできません。 – jez

答えて

1

あなたのコードを試しましたが、KeyError: ''が発生しました。最初のbigramには0の位置に空の文字列があり、''はunigramsの辞書にないためです。私はTypeErrorを見なかったので、あなたのコードの他のどこかの人がいるかもしれません。あなたは、コードのあなたの最初のチャンクを置き換えることができます - あなたはcollections.Counterが何を理解しているようですが、あなたはでたらめにuniを構築しながら、それを自分でやろうとしている

  1. :、他のさまざまな意見を言っ

    unigrams = Counter(sp)

  2. あなたは、それをペアを反復し、あなたのバイグラムその方法を構築し、代わりにDIYのループするzipを使用することができますLSOあなた''問題を取り除く:

    bigrams = Counter(zip(sp, sp[1:]))

だからあなたのコードは次のようになります。

sp = corpus.split() 
unigrams = Counter(sp) 
bigrams = Counter(zip(sp, sp[1:])) 

for bigram, count in bigrams.most_common(): 
    # etc. 
+0

私はあなたの第2のポイントを完全に理解していません。 – basil

+0

@basil 'zip'は複数のシーケンスを繰り返し、ペアを生成します。 'sp [1:]'は同じリストの2番目の要素です。したがって、 'zip(sp、sp [1:])'は、あなたのバイグラムタプルをすべて生成します(2番目のループで手動で 'big 'を構築するのではなく)。メインの投稿に 'zip'のドキュメントリンクを追加しました。 – tzaman

3

あなたはおそらく、辞書を必要とするときは、タプルを使用しての間違いを犯しています。エラーメッセージの状態として、タプルを文字列キーでインデックスすることはできません。数値インデックスを使用することが期待されます。

dictは、必要に応じて文字列キーを使用できるようにします。

d = {} 
d['some key] = 23 

あなたの更新コードは、あなたがしていることのより良いアイデアを提供します。まず、単語数の辞書をuniに作成します。私はその分岐が実行されたときに、単語の最初の発生を検出しているため

uni[t] = 0 

読み込みラインが実際に

uni[t] = 1 

を読むべきだと思います。次に、bigにバイグラムタプルのリストを作成し、それらのバイグラムを数えます。

私はbは、カウントすべきCounter項目とcountBの鍵となるものの、最終forループで失われたビットを取得。したがって、keyはbigramの最初の単語になり、uniCountはその単語がコーパスに現れた回数になります。これらの価値を確立した後は、何もしないで次の最も一般的なバイグラムに進みます。

おそらく、最終ループで何らかの印刷を行う時でしょうか?そうでなければ公表されたコードは妥当と思われる。

+0

私の用語が正しいかどうかわかりません。私は過度に慣れていない言語を使って問題を解決しようとしている間違いをしています。上記のコードを追加しました。 – basil

+0

拡張コードをより詳細に分析して更新しました。 – holdenweb

+0

また、他の回答に記載されているように、最初のbigramは現在、最初の要素として空の文字列を持っており、これが最も一般的なバイグラムの1つであれば問題を引き起こす可能性があることに注意してください(短いコーパス)。 – holdenweb

0

でコードを実行しました。エラーは、タプルであるuniに関連するエラーだと言われていますが、実際は辞書です。

私が得たエラーは、タプル(previous word, word)のリストを作成しているとcorpusの最初の単語が(prev=''が初期状態である)空の文字列として設定前の単語を持っているので、それがuniCount=uni[key]KeyErrorで、異なっています。

ないキー''それはKeyErrorを投げているuni辞書に存在しないようにuniCount=uni[key]線におけるキーはタプル(key=b[0])の最初の項目に等しいです。

タプルの前の単語ではなく、単語をuniで使用されるキーにすることができます。

関連する問題