Như tiêu đề nói, tôi có một danh sách các từ, như stopWords = ["the", "and", "with", etc...]
và tôi nhận được văn bản như "Giết con cáo và chó". Tôi muốn đầu ra như "Giết con chó con cáo" rất hiệu quả và nhanh chóng. Làm thế nào tôi có thể làm được điều này (tôi biết tôi có thể lặp sử dụng một vòng lặp for, nhưng thats không phải là rất hiệu quả)Nếu tôi có một danh sách các từ, làm thế nào tôi có thể kiểm tra xem chuỗi không chứa bất kỳ từ nào trong danh sách và có hiệu quả không?
Trả lời
Sự cải thiện imporant nhất là để làm cho stopWords là set
. Điều này có nghĩa là tra cứu sẽ rất nhanh
stopWords = set(["the", "and", "with", etc...])
" ".join(word for word in msg.split() if word not in stopWords)
Nếu bạn chỉ muốn biết nếu một trong các từ dừng là trong văn bản
if any(word in stopWords for word in msg.split()):
...
Sử dụng list comprehension:
stopWords = ["the", "and", "with"]
msg = "kill the fox and the dog"
' '.join([w for w in msg.split() if w not in stopWords])
cho:
'kill fox dog'
'w không stopWords' sẽ nhận được chậm hơn như từ dừng được nữa vì nó đã để lặp qua danh sách để kiểm tra mỗi một. Đây là lý do tại sao làm cho stopWords một bộ là quan trọng –
@gnibbler Ok, do đó, lưu ý, cảm ơn. Luôn vui khi học một cái gì đó mới (Tôi không sử dụng bộ gần như thường xuyên) – Levon
- Đặt danh sách ban đầu của bạn từ trong từ điển.
- Lặp lại các ký tự trong chuỗi đã cho, sử dụng dấu cách làm dấu phân tách cho một từ. Tra cứu từng từ trong từ điển.
Với Python, thao tác nhanh nhất sẽ đặt "stopwords" thành một tập hợp thay vì danh sách và kiểm tra trực tiếp thành viên bằng "x in stopwords". Cấu trúc này được thiết kế để nhanh chóng cho loại hoạt động này.
Có từ dừng của bạn trong một set()
(như những người khác đã gợi ý), tích lũy Nói cách khác bạn thành một công tác thiết lập sau đó chỉ cần lấy chênh lệch bộ sử dụng working = working - stopWords
... để có một thiết lập làm việc với tất cả các stopWords được lọc ra khỏi nó. Hoặc chỉ để kiểm tra sự tồn tại của những từ đó sử dụng một điều kiện. Ví dụ:
#!python
stopWords = set('the a an and'.split())
working = set('this is a test of the one working set dude'.split())
if working == working - stopWords:
print "The working set contains no stop words"
else:
print "Actually, it does"
Thực tế, có cấu trúc dữ liệu hiệu quả hơn, chẳng hạn như một trie mà có thể được sử dụng cho lớn, tương đối dày đặc, tập hợp từ dừng lại. Bạn có thể tìm thấy các mô-đun trie cho Python, mặc dù tôi không thấy bất kỳ phần mở rộng nào được viết dưới dạng nhị phân (C) và tôi tự hỏi đâu là điểm chéo giữa một trie được triển khai bằng Python thuần túy so với sử dụng hỗ trợ set()
của Python. (Cũng có thể là một trường hợp tốt cho Cython, mặc dù).
Thực tế tôi thấy rằng ai đó đã giải quyết riêng câu hỏi đó tại đây SO: How do I create a fixed length mutable array of python objects in cython. Cuối cùng, tất nhiên, bạn nên tạo phiên bản dựa trên tập hợp đơn giản, kiểm tra và cấu hình nó, sau đó, nếu cần thiết, hãy thử các biến thể trie và Cython-trie như những cải tiến có thể có.
Thay vào đó, bạn có thể lắp ráp danh sách của mình trong một regex và thay thế các từ dừng cùng với các khoảng không gian xung quanh bằng một khoảng trắng.
import re
stopWords = ["the", "and", "with"]
input = "Kill the fox and dog"
pattern = "\\s{:s}\\s".format("\\s|\\s".join(stopWords))
print(pattern)
print(re.sub(pattern, " ", input))
chí đầu ra
\sthe\s|\sand\s|\swith\s
Kill fox dog
- 1. Cách kiểm tra danh sách A có chứa bất kỳ giá trị nào từ danh sách B không?
- 2. Kiểm tra xem một chuỗi có chứa một phần tử từ một danh sách (các chuỗi)
- 3. Làm thế nào để kiểm tra nếu có từ trong một danh sách chứa một chuỗi một phần?
- 4. Kiểm tra xem danh sách <t> chứa bất kỳ một danh sách khác
- 5. Nếu chuỗi không chứa bất kỳ danh sách các chuỗi nào trong python
- 6. Cách kiểm tra xem một dòng có một trong các chuỗi trong danh sách không?
- 7. Kiểm tra xem mục danh sách chứa các mục từ danh sách khác
- 8. Kiểm tra xem danh sách đỉnh có chứa đối tượng
- 9. Kiểm tra xem chuỗi có kết thúc bằng một trong các chuỗi từ danh sách
- 10. Haskell: kiểm tra xem danh sách có chứa "danh sách con" cụ thể
- 11. Làm thế nào tôi có thể trích xuất một danh sách các TestCases từ một TestSuite?
- 12. Cách hiệu quả để tìm xem bản đồ có chứa bất kỳ khóa nào từ danh sách/có thể lặp lại
- 13. Kiểm tra xem đối tượng có phải là danh sách các danh sách trong python không?
- 14. Làm thế nào tôi có thể chọn từ danh sách các giá trị trong Oracle
- 15. python làm thế nào để kiểm tra danh sách does't chứa bất kỳ giá trị
- 16. Làm thế nào tôi có thể chọn từ danh sách các giá trị trong SQL Server
- 17. Tìm kiếm một danh sách các chuỗi đối với bất kỳ phụ chuỗi từ một danh sách khác
- 18. Cách hiệu quả nhất để tìm xem một danh sách lớn có chứa một chuỗi cụ thể (Python)
- 19. Sử dụng Java Regex, cách kiểm tra xem chuỗi có chứa bất kỳ từ nào trong tập hợp không?
- 20. Kiểm tra xem danh sách có chứa danh sách khác với Python
- 21. linq nơi danh sách chứa bất kỳ danh sách nào trong danh sách
- 22. Làm cách nào để kiểm tra xem tất cả các mục trong danh sách có trong danh sách khác không?
- 23. Làm cách nào để tôi có thể lặp lại danh sách các danh sách trong Scala?
- 24. .NET có cách kiểm tra xem Danh sách chứa tất cả các mục trong Danh sách b không?
- 25. Kiểm tra xem danh sách có trống không với LINQ
- 26. Python: Kiểm tra xem tất cả các từ điển trong danh sách có trống không
- 27. Kiểm tra xem một Danh sách có chứa một mục hay không?
- 28. Kiểm tra xem một chuỗi trong một danh sách chứa một chuỗi cụ thể với LINQ
- 29. Làm cách nào để xác định xem danh sách có chỉ là một chuỗi hoặc danh sách các chuỗi không?
- 30. Loại trừ mục danh sách có chứa các giá trị từ một danh sách khác
Nó có hiệu quả hơn việc tạo một regex không? – mlt
@mlt, có thể không. Công việc rất khác với điều này mà khó đoán. Bạn nên viết câu trả lời bằng cách sử dụng regexp –