2011-11-29 5 views
5

주어진 문자열에서 욕설의 단어를 제거하는 올바른 방법은 무엇입니까?
1) 문자열 배열에서 찾을 단어 목록이 100 개 있습니다. 2) 부분 단어를 처리하는 올바른 방법은 무엇입니까? 대부분의 사람들은 어떻게 이것을 처리합니까? 예를 들어 질량이라는 단어. 그렇다면 때로는 부분적인 단어도 나쁘다. foobar가 매우 모호한 단어라고 가정하면 foobar와 foobar * 및 * foobar를 허용하지 않을 수 있습니다.정규 표현식을 사용하는 욕설 필터

그래서 모든 단어를 목록을 통해 하나의 표현식이나 루프에 넣으시겠습니까?

어떻게 해결할 수 있습니까? 나는 Groovy/Grails를 사용하고 있지만 현대 언어의 모든 예제를 환영한다.

+2

다음 링크를 확인하십시오. http://stackoverflow.com/questions/273516/how-do-you-implement-a-good-profanity-filter –

+1

Scunthorpe 문제를 찾으십시오. http : //en.wikipedia .org/wiki/Scunthorpe_problem – rossum

답변

2
  1. 연결하여 단어의 목록에 각 단어 - (foobar|foobaz|...)
  2. 그럼 당신은 아마거야,없는 문자 또한

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

에 대한 그룹의 양쪽에 경비를 넣어 대소 문자를 구분하지 않는 플래그를 사용하여 FooBaz 및 fOObaR과 같은 단어도 일치 시키길 원합니다.

퍼포먼스가 진행되는 한, 이것을 하나의 큰 정규 표현식으로 연결하는 것은 아마도 가장 빠릅니다 (전문가는 아니지만). 정규식 알고리즘은 분기 조건을 처리하는 &을 검색 할 때 매우 효율적입니다. O(mn)

3

이 해결하기 매우 어려운 문제이며 정규 표현식이 작동하는지 확인해야합니다 (m 단어의 수이고 n 텍스트 당신이 검색하는의 크기)보다 기본적으로 더 나은해야합니다 당신을 위해 그리고 당신이 embedding을 어떻게 다루는 지 (실제 F-word를 제외하고 frackface와 같은 모독에 사전 단어를 추가 할 때).

정규 표현식은 일반적으로 얼마나 오래 될 수 있는지에 대한 제한이 있으며 일반적으로 모든 단어에 대해 하나의 정규식을 사용할 수 없습니다. 문자열에 대해 여러 개의 정규 표현식을 실행하면 필요한 성능과 블랙리스트의 크기에 따라 실제로 느립니다. 처음에는 CleanSpeak을 정규 표현식 시스템으로 구현했지만 확장되지 않았으며 다른 메커니즘을 사용하여 다시 작성했습니다.

또한 구, 구두점, 공백, 리트 말 및 다른 언어를 고려해야합니다. 이 모든 것들이 정규식을 덜 매력적으로 만들어줍니다. | - |여보세요

  • h3llo
    • 목록 항목
    • 안녕하세요
    • 안녕하세요
    • h_e_l_l_o
    • : 여기 안녕하세요 단어를 사용하는 몇 가지 예입니다 (이이 운동에 대한 욕설 가정)
    • "안녕하세요"(이 구는 모욕적 인 단어는 포함 할 수 없지만 결합하면 모욕적입니다)

    두 개 이상의 사전 (허용 된 사이트) 단어가 서로 옆에있을 때 욕설을 포함하는 경우도 처리해야합니다.의 S-단어가 포함 된 몇 가지 예 :

    • 배쉬는
    • SSH 그것의 조용한 시간은

    이 분명 욕설 아니지만, 대부분의 자체 개발 및 많은 상용 솔루션은 이러한 경우에 문제가있다.

    우리는 지난 3 년간 CleanSpeak에 사용 된 필터를 완벽하게 처리하여 이러한 모든 문제를 처리하고 계속 개선하고 개선하기 위해 노력했습니다. 또한 성능을 위해 시스템을 완성하는 데 8 개월을 소비했으며 초당 약 5,000 개의 메시지를 처리 ​​할 수있었습니다. 쓸만한 것을 만들 수는 없지만 올 수있는 많은 문제를 처리하고 정규 표현식을 사용하지 않는 시스템을 만들 준비를하십시오.

    관련 문제