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
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top