Как мне быстрее подсчитать слова в текстовом формате? - PullRequest
5 голосов
/ 11 октября 2010

У меня есть набор документов, и я хочу вернуть список кортежей, где у каждого кортежа есть дата данного документа и количество раз, когда данный термин поиска появляется в этом документе. Мой код (ниже) работает, но медленно, и я n00b. Есть ли очевидные способы сделать это быстрее? Любая помощь будет высоко ценится, в основном для того, чтобы я мог лучше изучить кодирование, но также для того, чтобы я мог сделать этот проект быстрее!

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

1 Ответ

8 голосов
/ 11 октября 2010

Если вам нужна частота подсчета слов, вам не нужно создавать nltk.Text объекты или даже использовать nltk.PlainTextReader. Вместо этого просто идите прямо к 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)

Или, если вы не хотите делать какой-либо анализ - просто используйте 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

Это можно сделать гораздо эффективнее с помощью выражений генератора, но я использую циклы для удобства чтения.

...