Python: лучший / эффективный способ найти список слов в тексте? - PullRequest
6 голосов
/ 30 июля 2010

У меня есть список из примерно 300 слов и огромное количество текста, который я хочу отсканировать, чтобы узнать, сколько раз каждое слово появляется.

Я использую модуль re изpython:

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

но я хочу знать, есть ли более эффективный или более элегантный способ сделать это?

Ответы [ 8 ]

5 голосов
/ 30 июля 2010

Если у вас огромное количество текста, я бы не использовал регулярные выражения в этом случае, а просто разделил текст:

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

слова даст вам частоту для каждого слова

1 голос
/ 30 июля 2010

Попробуйте убрать все знаки препинания из вашего текста, а затем разделить на пробелы. Тогда просто сделай

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

Или, если вы используете python 3.0, я думаю, вы могли бы сделать:

occurences = {word: strippedText.count(word) for word in list_word}
0 голосов
/ 30 июля 2010

Может быть, вы могли бы адаптировать эту функцию моего многопользовательского генератора.

    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)
0 голосов
/ 30 июля 2010

Для меня звучит так, как будто в Natural Language Toolkit есть то, что вам нужно.

http://www.nltk.org/

0 голосов
/ 30 июля 2010

Если Python не обязателен, вы можете использовать awk

$ 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 голосов
/ 30 июля 2010

Регулярные выражения могут не соответствовать вашим ожиданиям. В Python есть ряд встроенных строковых операций, которые на намного быстрее, и я считаю, что .count () имеет то, что вам нужно.

http://docs.python.org/library/stdtypes.html#string-methods

0 голосов
/ 30 июля 2010

Вы также можете разбить текст на слова и выполнить поиск в результирующем списке.

0 голосов
/ 30 июля 2010

Googling: частота питона дает мне эту страницу в качестве первого результата: http://www.daniweb.com/code/snippet216747.html

Что, кажется, то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...