2017-11-12 41 views
0

私はテキストの文字列を見て、ストップワードを削除し、その文字列の中で最もよく使われる単語のトップ10をリストとして返す小さなスクリプトを書こうとしています。Python unhashable type:リスト上のスライス

これは私のコードです:

from collections import Counter as c 
from nltk.corpus import stopwords 
stop = set(stopwords.words('english')) 
description = ("This is some place holder text for a shop that sells shoes, coats and jumpers. We sell lots of shoes but never sell t-shirts. Please come to our shop if you want some jumpers") 
description = ([word for word in description.lower().split() if word not in stop]) 
common_list = c(description) 
top_ten = (common_list[:9]) 

しかし、これは私にエラーメッセージunhashable type: sliceを与えます。私はこれがcommon_listが実際にリストではないかもしれないからだと思う。私は非常にPythonに新しいので、これは本当にばかげている場合は容赦してください。

+1

'コレクションからC 'のwhhhhyyyとしてカウンターインポートあなたは今までに行うだろうこの?あなたのコードを読んで理解できる人がいらっしゃいませんか? –

+1

そして、 'common_list'は*ではなく、' Counter'です。これは 'Counter'の代わりに' c'を使用しなかった場合にはもっと明らかです。 'Counter'オブジェクトは、' dict'とほぼ同じように動作しますが、それはカウントに特化しています。 'my_counter [:9]'を実行すると 'my_dict [:9]'と同じように*スライス*が '__getitem__'に渡されますが、' dict'オブジェクトはスライスされません。 –

+0

そして、もちろん、カウンターアイテムには上位n個のアイテム、['most_common(n)'](https://docs.python.org/3/library/collections.html#collections.Counter.most_common)を取得するための特定のメソッドがあります。 。 –

答えて

0

この:あなただけのwordsをしたい場合は

[('cat', 3), ('dog', 2), ('fish', 1)] 

は、ただでtop_tenリスト内の各listからの最初の要素を取りますCounterオブジェクトのmost_commonmethod本当に簡単です:

top_ten = c(description).most_common(10) 

ドキュメントの状態:

戻るnは少なくとも最も一般的なから最も一般的な要素とそれらのカウントのリスト。

それはelementとそのcountsの両方を返し、我々は唯一のelementをしたいように、我々はまだlist-comprehensionを使用する必要があります。

top_ten = [i[0] for i in c(description).most_common(10)] 
0

common_listは辞書です。スライスできません(common_list [:9]は動作しません)。おそらくcommon_listを実際のリストに変換し、その出現に基づいてsort_listをソートする必要があります。

+0

コメント2と3を見るともっと良い答えが得られます。 –

0

次のワンライナーを使用することができます

top_ten = sorted(c(description).items(), key=lambda p:p[1])[::-1][:10] 

なぜ?

さてあなたは、本質的に持っている言葉のlist

description = ["cat", "fish", "cat", "cat", "dog", "dog"] 

、その後、あなたはそう与えるc(description)を取ることによってc()functionと各要素の数を取得することができます:

Counter({'cat': 3, 'dog': 2, 'fish': 1}) 

とをこれをソートする必要があり、tupleの2番目の要素を並べ替えてkey=lambda p:p[1]とします。我々の場合ではどちらが与えるだろう:

[('fish', 1), ('dog', 2), ('cat', 3)] 

その後、我々は [::-1]でそれを逆にして [:10]で最初 10の要素を取る必要があります。で私たちを残すことになる:で行うことができます

[i[0] for i in top_ten] 
+0

これは次のように単純化することができます: 'sorted(c(description).items()、key = lambda p:p [1]、reversed = True)[:10]' –

+0

@ juanpa.arrivillaga 'list'変換を行いますが、実際には' reverse = True'を使ってパフォーマンスが向上していますか? –

+0

まあ、はい。スライスすると完全に新しいリストが作成されます。 –

関連する問題