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()
và 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]
'cho từ trong text.split (''): stemmer.stem_word (word) '? – birryree
stemmed = cho từ trong text.split (''): stemmer.stem_word (word) sẽ làm việc này? – ChamingaD
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