2012-05-08 53 views
6

Giả sử tôi có một chuỗi text = "A compiler translates code from a source language". Tôi muốn làm hai việc:Làm thế nào để lặp qua câu của chuỗi trong Python?

  1. Tôi cần lặp qua từng từ và gốc bằng thư viện NLTK. Chức năng xuất phát là PorterStemmer().stem_word(word). Chúng ta phải vượt qua đối số 'từ'. Làm thế nào tôi có thể bắt nguồn từ mỗi từ và lấy lại câu gốc?

  2. Tôi cần xóa một số từ dừng nhất định khỏi chuỗi text. Danh sách có chứa các từ dừng được lưu trữ trong một tập tin văn bản (không gian tách)

    stopwordsfile = open('c:/stopwordlist.txt','r+') 
    stopwordslist=stopwordsfile.read() 
    

    Làm thế nào tôi có thể loại bỏ những lời thẳng từ text và nhận được một chuỗi mới sạch?

+0

'cho từ trong text.split (''): stemmer.stem_word (word) '? – birryree

+0

stemmed = cho từ trong text.split (''): stemmer.stem_word (word) sẽ làm việc này? – ChamingaD

+1

Không chính xác. Nếu bạn muốn một danh sách các thân cây, bạn có thể làm 'stemmed = [stemmer.stem_word (w) cho w trong text.split ('')]'. Nếu bạn muốn một câu của nó, bạn có thể làm 'sente = '' .join (bắt nguồn)', mà sẽ trả về một câu của tất cả các thân cây. Hãy cho tôi biết nếu nó giúp được bạn. – birryree

Trả lời

9

Tôi đăng này như một bình luận, nhưng nghĩ rằng tôi cũng có thể xác thịt nó ra thành một câu trả lời đầy đủ với một số giải thích:

Bạn muốn sử dụng str.split() để chia chuỗi thành các từ, và sau đó xuất phát mỗi từ:

for word in text.split(" "): 
    PorterStemmer().stem_word(word) 

Khi bạn muốn nhận được một chuỗi tất cả các từ được đặt vào nhau, nó không đáng kể để sau đó tham gia các nhánh này lại với nhau. Để làm điều này một cách dễ dàng và hiệu quả chúng tôi sử dụng str.join()generator expression:

" ".join(PorterStemmer().stem_word(word) for word in text.split(" ")) 

Edit:

Đối với vấn đề khác của bạn:

with open("/path/to/file.txt") as f: 
    words = set(f) 

Ở đây chúng ta hãy mở tệp bằng the with statement (đó là tốt nhất cách mở tệp, vì nó xử lý việc đóng chúng một cách chính xác, ngay cả trên các ngoại lệ, và dễ đọc hơn) và đọc nội dung trong một tập hợp. Chúng tôi sử dụng một bộ như chúng tôi không quan tâm đến thứ tự của các từ, hoặc trùng lặp, và nó sẽ có hiệu quả hơn sau này. Tôi giả sử một từ trên mỗi dòng - nếu đây không phải là trường hợp, và chúng được phân cách bằng dấu phẩy hoặc khoảng trống được phân tách thì sử dụng str.split() như chúng ta đã làm trước đây (với các đối số thích hợp) có lẽ là một kế hoạch tốt.

stems = (PorterStemmer().stem_word(word) for word in text.split(" ")) 
" ".join(stem for stem in stems if stem not in words) 

Ở đây chúng tôi sử dụng mệnh đề if của biểu thức trình tạo để bỏ qua các từ nằm trong tập hợp các từ mà chúng tôi đã tải từ tệp. Kiểm tra thành viên trên một bộ là O (1), vì vậy điều này sẽ tương đối hiệu quả.

Chỉnh sửa 2:

Để loại bỏ dòng chữ trước khi chúng được bắt nguồn, nó thậm chí còn đơn giản hơn:

" ".join(PorterStemmer().stem_word(word) for word in text.split(" ") if word not in words) 

Việc loại bỏ các từ cho trước chỉ đơn giản là:

filtered_words = [word for word in unfiltered_words if not in set_of_words_to_filter] 
+0

Tôi cần làm một việc khác. Để loại bỏ các từ dừng từ chuỗi đó. Danh sách các từ dừng được lưu trữ trong tệp văn bản (cách nhau bằng dấu cách) stopwordsfile = open ('c: /stopwordlist.txt', 'r +') stopwordslist = stopwordsfile.read() Tôi cần phải loại bỏ các từ dừng đó khỏi văn bản 'và nhận chuỗi mới được làm sạch. – ChamingaD

+0

@ChamingaD Tôi đề nghị đó là một vấn đề khác và bạn nên mở một câu hỏi mới. Nếu bạn làm điều đó, nó sẽ hữu ích hơn cho những người khác trong tương lai với một vấn đề tương tự, và dễ dàng hơn cho chúng tôi để làm việc với. –

+0

Vấn đề là tôi phải chờ thêm 20 phút để bắt đầu qustion mới:/ – ChamingaD

4

Để đi qua trên mỗi từ trong chuỗi: tham gia phương pháp

for word in text.split(): 
    PorterStemmer().stem_word(word) 

Sử dụng chuỗi của (khuyến cáo của Lattyware) để ghép mảnh để một chuỗi lớn.

" ".join(PorterStemmer().stem_word(word) for word in text.split(" ")) 
+2

Câu hỏi không hỏi 'và nhận được một câu gốc có chữ' trở lại đầy đủ câu trả lời sẽ là '" ".join (PorterStemmer(). stem_word (word) cho từ trong text.split (" "))'. –

Các vấn đề liên quan