كيف يمكنني حساب الكلمات في NLTK PlaintextCorpus بشكل أسرع؟

StackOverflow https://stackoverflow.com/questions/3902044

  •  29-09-2019
  •  | 
  •  

سؤال

لديّ مجموعة من المستندات ، وأريد إرجاع قائمة من 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

يمكن جعلها أكثر كفاءة مع تعبيرات المولدات ، لكنني معتاد على الحلقات لقدرة على القراءة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top