2016-07-21 14 views
0

このコードでは、テキストファイルを読み込み、各単語の出現率をパーセントで表示します。それほとんど作品..各単語がテキスト内で何回出現するかを数えてください

私は他の人々のコードを貼り付け/コピーしたとき、(私は1つのポイントでそれを持っていた以上に最高の発生からプリントを整理する方法を見つけ出すことができない、私は私がコレクションをインポートしたと思います

もう一つの問題は、私の全体のリストを読むことです。これは小さなテキストファイルでは問題ありませんが、大きなものは私の端末を食べるだけです。 、各インスタンスに対して1回ではなく

+1

「dict」ではなく「collections.Counter」を使用する方がよいでしょう。そうであるように 'counts = Counter(words)'。 'dict'を使って' for'ループよりもはるかに高速で読みやすくなります。 – Arnial

+0

ようこそスタックオーバーフロー。将来、より良い質問をするための小さなメモは、タイトルの問題の簡単な説明を与えることです。例えば、この投稿の場合、より良いタイトルは「単語ごとの単語を印刷する」でしょう。これにより、将来的に自分の質問に対する回答を簡単に検索できるようになります。また、回答しようとしている人があなたの質問を一目で確認できるようになります。それ以外は、これは本当に良い質問でした。あなたは私が最初に試してマークダウンを使用して見た最初の人々の一つです。 –

答えて

1

次のように辞書を反復することができます。

for word in counts: 
    print word, counts[word] 

これは、辞書の各キーを一度印刷します。 並べ替えのために、あなたが見ておくべきであるビルトインsorted()機能:あなたの最初の問題のためにhttps://docs.python.org/3.4/library/functions.html#sorted

+0

は 'for word counts.itertools()'ではないはずですか?つまり、「言葉のために、カウントでカウントする」は私のために誤りを投げます。 – xgord

+0

あなたは正しいことですが、「単語のためにカウントしてください」は機能しません。私の間違い。それは代わりに 'for word in counts'(キーを繰り返します)または 'for word、countit in countitems()'(キーと値の両方を繰り返します) – akn320

0

することができますだけのコレクションなどOrderedDict:

sortedCounts = collections.OrderedDict(sorted(counts.items(),key=lambda t: t[1])) 

一度だけ、各単語を印刷するには:

for key, value in sortedCounts.iteritems(): 
    print key, percent(value,total),"%" 

希望すること

+0

これはアルファベット順でソートされていましたか?私に起こったことを引き起こして、私は低から高まで並べ替えようとしていましたが、一度だけ出力を修正しました –

+0

私はそれを編集することを申し訳ありません。 –

0

あなたのコードは実行可能な状態に非常に近いです。

P1:あなたのコードでは、単語以外の文字は考慮されません。たとえば、word;,word.、およびwordはすべて一意の単語として扱われます。

text = handle.read() 
words = text.split() 


P2:あなたが代わりにcountsで独自のリストで、重複が含まれた単語の全体リスト、を反復。もちろん、各単語を複数回印刷することになります。

for word in words: 


P3:あなたはファイルを開くが、それを閉じることはありません。あなたのコードには問題はありませんが、改善すべき点があります。このため、ファイルを閉じるために、with open(...):の構文を使用することが一般的に推奨されています。

handle = open(name, 'r') 


ここではいくつかの修正をあなたのコードです:このプログラムで実行した場合

#!/usr/bin/python 

import re 

name = raw_input('Enter file:') 

def percent(part, whole): 
    return 100 * float(part)/float(whole) 

# better way to open files, handles closing the file 
with open(name, 'r') as handle: 
    text = handle.read() 

words = text.split() 

# get rid of non-word characters that are messing up count 
formatted = [] 
for w in words: 
    formatted.extend(re.findall(r'\w+', w)) 

total = len(formatted) 

counts = dict() 
for word in formatted: 
    counts[word] = counts.get(word,0) + 1 

print "\n" 
print"Total Words\n", total 
print"\n" 

# iterate over the counts dict instead of the original word list 
# this way each word is only printed once 
for word,count in counts.iteritems(): 
    print word, percent(counts[word],total),"%" 

出力:

Total Words 
79 


text 2.53164556962 % 
float 2.53164556962 % 
as 1.26582278481 % 
file 1.26582278481 % 
in 3.79746835443 % 
handle 2.53164556962 % 
counts 6.32911392405 % 
total 3.79746835443 % 
open 1.26582278481 % 
findall 1.26582278481 % 
for 3.79746835443 % 
0 1.26582278481 % 
percent 2.53164556962 % 
formatted 5.06329113924 % 
1 1.26582278481 % 
re 2.53164556962 % 
dict 1.26582278481 % 
usr 1.26582278481 % 
Words 1.26582278481 % 
print 5.06329113924 % 
import 1.26582278481 % 
split 1.26582278481 % 
bin 1.26582278481 % 
return 1.26582278481 % 
extend 1.26582278481 % 
get 1.26582278481 % 
python 1.26582278481 % 
len 1.26582278481 % 
iteritems 1.26582278481 % 
part 2.53164556962 % 
words 2.53164556962 % 
Enter 1.26582278481 % 
100 1.26582278481 % 
with 1.26582278481 % 
count 1.26582278481 % 
word 7.59493670886 % 
name 2.53164556962 % 
read 1.26582278481 % 
raw_input 1.26582278481 % 
n 3.79746835443 % 
r 1.26582278481 % 
w 3.79746835443 % 
Total 1.26582278481 % 
whole 2.53164556962 % 
def 1.26582278481 % 

編集 -

をフォーマットする単語の追加説明formatted.extend(re.findall(r'\w+', w))の内訳:

1:リストのextendの機能がリストを取り、それを指定されたリストに追加します。たとえば:

listA = [1,2,3] 
listB = [4,5,6] 
listA.extend(listB) 
print(listA) 
# [1, 2, 3, 4, 5, 6] 

2:re.findall(r'\w+', w))

この式は、私たちが気に文字列の一部だけを抽出するためにregular expressionsを使用しています。ここには、Pythonの正規表現のtutorialがあります。

基本的にre.findall(x, y)は、に記載されている正規表現パターンに一致するyのすべての部分文字列のリストを返します。ここでは、\wはすべての単語文字(英数字)を意味し、+は前述のパターンの1つ以上を意味します。だから一緒に、\w+は、1つ以上の単語の文字を意味します。

wで検索している文字列変数に名前をつけると多少混乱しましたが、パターン内の\wは文字列の変数wとは関係ありません。

word = 'heres some1; called s0mething!' 
re.findall(r'\w+', word) 
# ['heres', 'some1', 'called', 's0mething'] 
+0

"1print"や "totalprint"のような単語をチェックしてください。 ''\'の代わりに' '\ n ''を' '''に置き換えているために表示されます。 – chapelo

+0

@chapelo気づいてくれてありがとう。正規表現が改行を取り除いてから忘れてしまったので、私は余分な 'replace()'呼び出しを取り除くつもりでした。回答が更新されました。 – xgord

+0

'formatted.extend(re.findall( '\ w +'、w))'このためのチュートリアルはありますか?私はそれが動作するが、どのように/理由がわからないことを参照してください –

関連する問題