Domanda

Ho una serie di documenti, e voglio restituire un elenco di tuple, dove ogni tupla ha la data di un determinato documento e il numero di volte in cui compare un determinato termine di ricerca in quel documento. Il mio codice (sotto) funziona, ma è lento, e io sono un n00b. Ci sono modi ovvi per rendere questo più veloce? Qualsiasi aiuto sarebbe molto apprezzato, per lo più in modo che possa imparare meglio la codifica, ma anche in modo che posso ottenere questo progetto fatto più veloce!

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
È stato utile?

Soluzione

Se si desidera solo una frequenza di conteggio delle parole, allora non c'è bisogno di creare oggetti nltk.Text, o l'uso anche nltk.PlainTextReader. Invece, basta andare dritto al nltk.FreqDist.

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)

In alternativa, se non si vuole fare qualsiasi analisi -. Basta usare un dict

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

Questi potrebbe essere reso molto più efficiente con le espressioni del generatore, ma io sono abituato a cicli per facilitarne la lettura.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top