Question

J'ai un ensemble de documents, et je veux retourner une liste de tuples où chaque tuple a la date d'un document donné et le nombre de fois qu'un terme de recherche donné apparaît dans ce document. Mon code (ci-dessous) fonctionne, mais il est lent, et je suis un n00b. Y at-il des moyens évidents pour faire de ce plus rapide? Toute aide serait très apprécié, la plupart du temps pour que je puisse apprendre mieux coder, mais aussi pour que je puisse obtenir ce projet fait plus vite!

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
Était-ce utile?

La solution

Si vous voulez juste une fréquence de nombre de mots, alors vous n'avez pas besoin de créer des objets nltk.Text, ou même utiliser nltk.PlainTextReader. Au lieu de cela, allez directement à 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)

Ou, si vous ne voulez pas faire une analyse -. Il suffit d'utiliser 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

Ceux-ci pourraient être beaucoup plus efficace avec des expressions du générateur, mais je suis utilisé pour les boucles pour une meilleure lisibilité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top