Wie zähle ich Worte in einem nltk plaintextcorpus schneller?
Frage
Ich habe eine Reihe von Dokumenten, und ich möchte eine Liste von Tupeln zurückzukehren, wo jedes Tupel das Datum eines Dokuments hat und die Anzahl der Male ein bestimmter Suchbegriff in diesem Dokument angezeigt wird. Mein Code (unten) funktioniert, aber ist langsam, und ich bin ein n00b. Gibt es offensichtliche Möglichkeiten, dies schneller zu machen? Jede Hilfe wäre sehr willkommen, vor allem so, dass ich lernen kann, besser Kodierung, aber auch so, dass ich dieses Projekt erhalten kann schneller fertig!
def searchText(searchword):
counts = []
corpus_root = 'some_dir'
wordlists = PlaintextCorpusReader(corpus_root, '.*')
for id in wordlists.fileids():
date = id[4:12]
month = date[-4:-2]
day = date[-2:]
year = date[:4]
raw = wordlists.raw(id)
tokens = nltk.word_tokenize(raw)
text = nltk.Text(tokens)
count = text.count(searchword)
counts.append((month, day, year, count))
return counts
Lösung
Wenn Sie nur eine Frequenz von Wort zählt wollen, dann müssen Sie nicht nltk.Text
Objekte oder sogar nutzen nltk.PlainTextReader
erstellen. Stattdessen nur gerade zu nltk.FreqDist
gehen.
files = list_of_files
fd = nltk.FreqDist()
for file in files:
with open(file) as f:
for sent in nltk.sent_tokenize(f.lower()):
for word in nltk.word_tokenize(sent):
fd.inc(word)
Oder, wenn Sie eine Analyse nicht tun wollen -. Nur dict
verwenden
files = list_of_files
fd = {}
for file in files:
with open(file) as f:
for sent in nltk.sent_tokenize(f.lower()):
for word in nltk.word_tokenize(sent):
try:
fd[word] = fd[word]+1
except KeyError:
fd[word] = 1
Diese wesentlich effizienter mit Generator Ausdrücke gemacht werden könnte, aber ich bin für Schleifen zur besseren Lesbarkeit verwendet.