2010-10-10 36 views
4

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. Existe-t-il des moyens évidents de rendre cela plus rapide? Toute aide serait très appréciée, surtout pour que j'apprenne à mieux coder, mais aussi pour que je puisse faire ce projet plus rapidement!Comment puis-je compter les mots dans un texte en clair de nltk plus rapidement?

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 
+0

Exécutez un profileur comme dans le module 'profile' et voyez ce que cela signifie. – John

Répondre

8

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 au 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. Cela peut être rendu beaucoup plus efficace avec les expressions de générateur, mais je suis utilisé pour les boucles pour plus de lisibilité.