2011-11-29 49 views
5

Cách chính xác để loại bỏ các từ tục tĩu từ một chuỗi được cho:
1) Tôi có danh sách 100 từ cần tìm trong một chuỗi. 2) Cách chính xác để xử lý một phần từ là gì? Làm thế nào để hầu hết mọi người xử lý điều này? Ví dụ khối lượng từ. Sau đó, đôi khi một từ một phần cũng là xấu - giả sử foobar là một từ rất vô cùng tôi có thể muốn không cho phép foobar và foobar * và * foobar.Bộ lọc thô tục sử dụng cụm từ thông dụng (danh sách 100 từ)

Vì vậy, bạn có đặt tất cả các từ vào một biểu thức hoặc vòng lặp qua danh sách không?

Cách nào đúng để giải quyết? Tôi đang sử dụng Groovy/Grails nhưng mọi ngôn ngữ hiện đại đều được chào đón.

+2

Kiểm tra liên kết này: http://stackoverflow.com/questions/273516/how-do-you-implement-a-good-profanity-filter –

+1

Tìm hiểu vấn đề về Scunthorpe: http: //en.wikipedia .org/wiki/Scunthorpe_problem – rossum

Trả lời

2
  1. CONCATENATE mỗi từ vào một danh sách các từ - (foobar|foobaz|...)
  2. Sau đó, đặt lính gác ở hai bên của nhóm cho các ký tự không liên quan

    [^[email protected]#$%^&*]*(foobar|foobaz|foofii)[^[email protected]#$%^&*]*

Ngoài ra, có thể bạn sẽ muốn sử dụng cờ không phân biệt chữ hoa chữ thường để nó cũng khớp với các từ như FooBaz và fOObaR.

Theo như hiệu suất hoạt động, việc ghép nối nó thành một regex lớn có lẽ là nhanh nhất (mặc dù tôi không phải là chuyên gia). Thuật toán regex khá hiệu quả trong việc tìm kiếm các điều kiện chi nhánh của việc xử lý các điều kiện chi nhánh &. Về cơ bản, nó phải tốt hơn O(mn) (trong đó m là số từ và n là kích thước của văn bản bạn đang tìm kiếm)

3

Đây là một vấn đề khó giải quyết và bạn cần xác định xem cụm từ thông dụng có hoạt động không cho bạn và cách bạn xử lý nhúng (khi bạn thêm từ điển vào từ thô tục như frackface ngoại trừ từ F thực).

Cụm từ thông dụng thường có giới hạn về độ dài của chúng và điều này thường ngăn bạn sử dụng một regex cho tất cả các từ của bạn. Thực thi nhiều biểu thức chính quy với một chuỗi thực sự chậm, tùy thuộc vào hiệu suất bạn cần và danh sách đen của bạn lớn đến mức nào. Ban đầu chúng tôi triển khai CleanSpeak làm hệ thống biểu thức chính quy, nhưng nó không được mở rộng và chúng tôi viết lại nó bằng một cơ chế khác.

Bạn cũng cần xem xét các cụm từ, dấu chấm câu, dấu cách, ngôn ngữ nói và các ngôn ngữ khác. Tất cả những điều này làm cho các biểu thức chính quy kém hấp dẫn hơn như một giải pháp. Dưới đây là một số ví dụ sử dụng từ hello (giả định nó là thô tục cho bài tập này):

  • List item
  • chào
  • chào
  • h_e_l_l_o
  • | - | ello
  • h3llo
  • "xin chào" (cụm từ này có thể không chứa bất kỳ từ tục tĩu nào nhưng kết hợp chúng là tục tĩu)

Bạn cũng cần xử lý các trường hợp cạnh trong đó hai hoặc nhiều từ điển (danh sách trắng) chứa từ thô tục khi nằm cạnh nhau.Một số ví dụ có chứa các s-từ:

  • bash nó
  • ssh đó là thời gian yên tĩnh

Đây là rõ ràng không thô tục, nhưng hầu hết các giải pháp thương mại cây nhà lá vườn và nhiều người có vấn đề với những trường hợp này.

Chúng tôi đã dành 3 năm qua để hoàn thiện bộ lọc được sử dụng bởi CleanSpeak để đảm bảo bộ lọc xử lý tất cả các trường hợp này và chúng tôi tiếp tục tinh chỉnh và làm cho nó tốt hơn. Chúng tôi cũng đã dành 8 tháng để hoàn thiện hệ thống của mình cho hiệu suất và có thể xử lý khoảng 5.000 tin nhắn mỗi giây. Không phải để nói rằng bạn không thể xây dựng một cái gì đó có thể sử dụng, nhưng được chuẩn bị để xử lý rất nhiều vấn đề mà có thể đi lên và cũng để tạo ra một hệ thống không sử dụng các biểu thức thông thường.

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