2010-07-30 3 views
6

Ich habe eine Liste von etwa 300 Wörtern und eine riesige Menge an Text, die ich scannen möchte, um zu wissen, wie oft jedes Wort erscheint.Python: beste/effizienteste Möglichkeit, eine Liste von Wörtern in einem Text zu finden?

Ich bin mit dem re Modul von Python:

for word in list_word: 
    search = re.compile(r"""(\s|,)(%s).?(\s|,|\.|\))""" % word) 
    occurrences = search.subn("", text)[1] 

aber ich möchte wissen, ob es eine effizientere oder elegantere Weg ist, dies zu tun?

+0

können Sie eine Wortmarke verwenden, anstatt nach umgebenden Leerzeichen und Interpunktion zu suchen. '\ bWORD \ b' – mpen

+3

Wenn Sie über die Worthäufigkeit hinausgehen und in die Textklassifizierung schauen möchten, können Sie sich das hier ansehen: http://streamhacker.com/2010/06/16/text-classification-sentiment- Analyse-Eliminieren-Low-Information-Features/ – monkut

+0

Wie ** riesig ** kann der Text sein, wenn Sie es im Speicher halten? – FMc

Antwort

5

Wenn Sie eine riesige Menge an Text, würde ich nicht regexps in diesem Fall benutzen, sondern einfach Split Text:

words = {"this": 0, "that": 0} 
for w in text.split(): 
    if w in words: 
    words[w] += 1 

Worte geben Ihnen die Frequenz für jedes Wort

+0

Definitiv effizienter, um den Text nur einmal zu scannen. Das obige Code-Snippet scheint nur zu fehlen, dass das Wort eines der 300 "wichtigen" ist. – pdbartlett

+0

@pdbartlett 'wenn w in Worten' diese Prüfung macht. – Wilduck

+0

Das Teilen auf Leerzeichen führt nicht immer zu perfekten Ergebnissen.Wenn Sie eine ausgeklügelte Aufteilung benötigen, können Sie sich NLTK anschauen, was unten vorgeschlagen wurde. –

0

Googeln: python Frequenz gibt mir diese Seite als erstes Ergebnis: http://www.daniweb.com/code/snippet216747.html

Welche zu sein, was scheint, die Sie suchen.

+0

Sein un-pythonish mit all diesen Regexes. Die Aufspaltung in einzelne Wörter erfolgt am besten mit str.split() anstelle von benutzerdefinierten Regex –

+0

Sie haben Recht, wenn die Python-String-Funktionen ausreichen, sollten sie anstelle von Regex verwendet werden. –

0

Sie können den Text auch in Wörter aufteilen und die Ergebnisliste durchsuchen.

1

Versuchen Sie, die gesamte Interpunktion aus Ihrem Text zu streichen und dann Leerzeichen zu teilen. Dann machen Sie einfach

for word in list_word: 
    occurence = strippedText.count(word) 

Oder wenn Sie mit Python 3.0 Ich glaube, Sie tun könnte:

occurences = {word: strippedText.count(word) for word in list_word} 
+0

in 2.6 <= Python <3.0 Sie können 'Vorkommen = dict() (Wort, stripedText.count (Wort)) für Wort in list_word)' – Wilduck

0

Wenn Python ist kein Muss, können Sie awk verwenden

$ cat file 
word1 
word2 
word3 
word4 

$ cat file1 
blah1 blah2 word1 word4 blah3 word2 
junk1 junk2 word2 word1 junk3 
blah4 blah5 word3 word6 end 

$ awk 'FNR==NR{w[$1];next} {for(i=1;i<=NF;i++) a[$i]++}END{for(i in w){ if(i in a) print i,a[i] } } ' file file1 
word1 2 
word2 2 
word3 1 
word4 1 
0

Es klingt für mich wie das Natural Language Toolkit könnte haben, was Sie brauchen.

http://www.nltk.org/

+1

Insbesondere die 'nltk.FreqDist' Klasse. –

0

Vielleicht könnten Sie diese meine Multisearch Generator-Funktion anpassen.

from itertools import islice 
testline = "Sentence 1. Sentence 2? Sentence 3! Sentence 4. Sentence 5." 
def multis(search_sequence,text,start=0): 
    """ multisearch by given search sequence values from text, starting from position start 
     yielding tuples of text before sequence item and found sequence item""" 
    x='' 
    for ch in text[start:]: 
     if ch in search_sequence: 
      if x: yield (x,ch) 
      else: yield ch 
      x='' 
     else: 
      x+=ch 
    else: 
     if x: yield x 

# split the first two sentences by the dot/question/exclamation. 
two_sentences = list(islice(multis('.?!',testline),2)) ## must save the result of generation 
print "result of split: ", two_sentences 

print '\n'.join(sentence.strip()+sep for sentence,sep in two_sentences) 
Verwandte Themen