2016-10-31 7 views
1

Ich habe das folgende Python-Skript:KeyError: '\ document'

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) 

Wenn ich versuche, um das Skript auszuführen, erhalte ich die folgende:

[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' 

Was mache ich falsch? Und, wie kann ich das Wort und die Häufigkeit drucken, wie oft es in der Textdatei vorkommt.

Sie können book.txt von here herunterladen.

+0

Warum Sie 'frequencies' und Ihren Buggy haben Schleife über "Wörter", wenn Sie auch eine NLTK 'FreqDist' verwenden, die alle Informationen enthält, die Sie erhalten möchten? – user2357112

+0

Beim allerersten Mal durch Ihre Schleife versuchen Sie, 'frequences [w]' zu holen, was (noch) nicht existiert. Sie erhalten also einen Schlüsselfehler. –

Antwort

6

Ihr frequencies Wörterbuch ist leer. Sie erhalten von Anfang an einen Schlüsselfehler, der erwartet wird.

Ich schlage vor, dass Sie stattdessen collections.Counter verwenden. Es ist ein spezialisiertes Wörterbuch (ein bisschen wie defaultdict), das das Zählen von Vorkommen erlaubt.

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) 

EDIT: Das beantwortet Ihre Frage ohne ntlk Paket überhaupt verwendet wird. Ich antwortete wie nltk Paket war nur ein String Tokenizer. So um genauer zu sein und lassen Sie in Ihren Textanalyse weiter gehen, ohne das Rad neu zu erfinden, und dank der verschiedenen Kommentaren unten, sollten Sie nur dies tun:

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) 

Sie erhalten (mit meinem Text):

<FreqDist with 142 samples and 476 outcomes> 

so kein Wörterbuch mit Wort => Anzahl der Elemente direkt, sondern ein komplexeres Objekt trägt diese Informationen + viel mehr:

  • frequencyDist.items(): Sie Wörter erhalten => cou nt (und alle klassischen dict Methoden)
  • frequencyDist.most_common(50) druckt die 50 häufigsten Wörter
  • frequencyDist['the'] gibt die Anzahl der Vorkommen von "the"
  • ...
+2

Anstatt einen 'collections.Counter' zu verwenden, würde ich empfehlen,' FreqDist' zu verwenden, das erstellt und dann komplett ignoriert wird. Es ist im Grunde ein 'Counter' mit ein paar zusätzlichen NLTK Utilities. – user2357112

+0

@ user2357112 Sie haben wahrscheinlich Recht. Ich habe das OP-Problem von einem grundlegenden Python-Gesichtspunkt aus behoben. Sie sollten eine Antwort mit 'FreqDist' posten. Ich kann nicht darüber reden, weil ich 'nltk' nicht kenne. Ich nehme an, das OP hat irgendwo Code kopiert und kennt nicht alle Möglichkeiten. –

+0

Die wirkliche Antwort ist, dass 'frequencyDist' nicht' frequency' ist oder umgekehrt, er hat gezählt, es funktioniert, aber er nennt es nicht, er ruft ein leeres Diktat an. – MooingRawr