2010-07-30 39 views
6

Tôi có danh sách khoảng 300 từ và một lượng lớn văn bản mà tôi muốn quét để biết số lần mỗi từ xuất hiện.Python: cách tốt nhất/hiệu quả để tìm danh sách các từ trong văn bản?

Tôi đang sử dụng các mô-đun re từ python:

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

nhưng tôi muốn biết nếu có một cách hiệu quả hơn hoặc thêm thanh lịch để làm điều này?

+0

bạn có thể sử dụng từ thay vì kiểm tra dấu cách và khoảng trắng xung quanh. '\ bWORD \ b' – mpen

+3

Nếu bạn muốn vượt ra ngoài tần số từ và xem xét phân loại văn bản, bạn có thể muốn xem xét điều này: http://streamhacker.com/2010/06/16/text-classification-sentiment- phân tích-loại bỏ-thấp-thông tin-feature/ – monkut

+0

Làm thế nào ** lớn ** có thể các văn bản được nếu bạn đang giữ nó trong bộ nhớ? – FMc

Trả lời

5

Nếu bạn có một số lượng lớn các văn bản, tôi sẽ không sử dụng regexps trong trường hợp này nhưng văn bản chỉ đơn giản là chia:

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

lời sẽ cung cấp cho bạn các tần số cho mỗi từ

+0

Chắc chắn hiệu quả hơn khi chỉ quét văn bản một lần. Đoạn mã ở trên dường như thiếu kiểm tra xem từ đó có phải là một trong 300 từ quan trọng không. – pdbartlett

+0

@pdbartlett 'nếu w trong từ' làm cho kiểm tra đó. – Wilduck

+0

Tách trên khoảng trắng không phải lúc nào cũng dẫn đến kết quả hoàn hảo.Nếu bạn cần chia tách tinh vi, bạn có thể xem NLTK, được đề xuất dưới đây. –

0

Googling: python tần mang lại cho tôi trang này là kết quả đầu tiên: http://www.daniweb.com/code/snippet216747.html

Mà dường như là những gì bạn đang tìm kiếm.

+0

Không có python của nó với tất cả các regexes. Chia tách thành các từ riêng biệt được thực hiện tốt nhất với str.split() thay vì regex tùy chỉnh –

+0

bạn nói đúng, nếu các hàm chuỗi Python là đủ, chúng nên được sử dụng thay cho regex. –

0

Bạn cũng có thể chia văn bản thành các từ và tìm kiếm danh sách kết quả.

1

Thử xóa tất cả các dấu câu khỏi văn bản của bạn và sau đó chia nhỏ trên khoảng trắng. Sau đó chỉ cần làm

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

Hoặc nếu bạn đang sử dụng python 3.0 Tôi nghĩ rằng bạn có thể làm:

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

trong 2.6 <= python <3.0 bạn có thể làm 'occurrences = dict ((word, strippedText.count (word)) cho từ trong list_word)' – Wilduck

0

Nếu Python không là điều bắt buộc, bạn có thể sử dụng 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

Nó âm thanh với tôi như Bộ công cụ ngôn ngữ tự nhiên có thể có những gì bạn cần.

http://www.nltk.org/

+1

Cụ thể là 'nltk.FreqDist' lớp. –

0

Có lẽ bạn có thể thích nghi với chức năng này phát multisearch tôi.

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) 
Các vấn đề liên quan