2016-10-31 17 views
1

私は次のPythonスクリプトを持っている:私は、スクリプトを実行しようとするとKeyError例外: '\ documentclass'

import nltk 
from nltk.probability import FreqDist 
nltk.download('punkt') 

frequencies = {} 
book = open('book.txt') 
read_book = book.read() 
words = nltk.word_tokenize(read_book) 
frequencyDist = FreqDist(words) 

for w in words: 
    frequencies[w] = frequencies[w] + 1 

print (frequencies) 

、私は次を得る:

[nltk_data] Downloading package punkt to /home/abc/nltk_data... 
[nltk_data] Package punkt is already up-to-date! 
Traceback (most recent call last): 
    File "test.py", line 12, in <module> 
    frequencies[w] = frequencies[w] + 1 
KeyError: '\\documentclass' 

私が間違って何をしているのですか?そして、単語とそれがテキストファイルに出現する回数をどのようにして印刷することができますか?

book.txtは、hereからダウンロードできます。

+0

なぜあなたは 'frequencies'とあなたのバギーを持っていますあなたが入手しようとしているすべての情報を含んでいるNLTK 'FreqDist'も使用しているときは' words 'をループしてください。 – user2357112

+0

ループの最初の段階では、(まだ)存在しない '周波数[w]'を取得しようとしています。キーエラーが発生します。 –

答えて

6

frequencies辞書が空です。最初からキーエラーが発生します。

代わりにcollections.Counterを使用することをお勧めします。これは、発生をカウントすることを可能にする特殊な辞書(defaultdictのようなビット)です。

import nltk,collections 
from nltk.probability import FreqDist 
nltk.download('punkt') 

frequencies = collections.Counter() 
with open('book.txt') as book: 
    read_book = book.read() 
words = nltk.word_tokenize(read_book) 
frequencyDist = FreqDist(words) 

for w in words: 
    frequencies[w] += 1 

print (frequencies) 

編集:ntlkパッケージを使用せずにあなたの質問に答えます。私はちょうどnltkパッケージがちょうど文字列トークンだったと答えました。だから、より具体的に、車輪を再発明することなく、あなたのテキスト分析にさらに行くことを許可し、以下の様々なコメントのおかげで、あなただけのこの操作を行う必要がありますします

import nltk 
from nltk.probability import FreqDist 
nltk.download('punkt') 

with open('book.txt') as book: 
    read_book = book.read() 
words = nltk.word_tokenize(read_book) 
frequencyDist = FreqDist(words) # no need for the loop, does the count job 

print (frequencyDist) 

あなたが(私のテキストで)得られます:そう

<FreqDist with 142 samples and 476 outcomes> 

ない単語と辞書=>直接要素の数が、この情報+もっと多くのベアリングより複雑なオブジェクト:

  • frequencyDist.items()は:あなたが得る言葉=> COU NT(およびすべての古典的なdictの方法)
  • frequencyDist.most_common(50)
  • frequencyDist['the']"the"
  • の出現回数を返します50最も一般的な単語を印刷し...
+2

'collections.Counter'を使うのではなく、ビルドされて完全に無視される' FreqDist'を使うことをお勧めします。それは基本的にそれに付随するいくつかのNLTKユーティリティを備えた 'Counter 'です。 – user2357112

+0

@ user2357112あなたはおそらく正しいでしょう。私はOPの問題を基本的なPythonの観点から修正していました。あなたは 'FreqDist'を使って回答を投稿するべきです。私は 'nltk'を知らないので、私はそれについて話すことができません。私はOPがどこかのコードをコピーし、すべての 'nltk'の可能性を知っていないと思います。 –

+0

本当の答えは、 'frequencyDist'は'周波数 'ではなく、逆もまた同様です。彼はカウントしましたが、動作しますが、彼はそれを呼び出さず、空のdictを呼び出します。 – MooingRawr

関連する問題