كيف يمكنني حساب الكلمات في NLTK PlaintextCorpus بشكل أسرع؟
سؤال
لديّ مجموعة من المستندات ، وأريد إرجاع قائمة من tuples حيث يكون لكل tuple تاريخ مستند معين وعدد المرات التي يظهر فيها مصطلح بحث معين في هذا المستند. يعمل الكود الخاص بي (أدناه) ، لكنه بطيء ، وأنا 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
يمكن جعلها أكثر كفاءة مع تعبيرات المولدات ، لكنني معتاد على الحلقات لقدرة على القراءة.
لا تنتمي إلى StackOverflow