Как считать слова в NLTK PlainTextCorpus быстрее?
Вопрос
У меня есть набор документов, и я хочу вернуть список кортежей, где каждый кортеж имеет дату данного документа, и количество раз, когда данный поисковый термин появляется в этом документе. Мой код (ниже) работает, но медленно, а я 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
Решение
Если вам просто нужна частота количества слов, вам не нужно создавать 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
Они могут быть сделаны гораздо более эффективными с выражениями генератора, но я использую петли для читаемости.