2011-11-29 11 views
5

¿Cuál es la forma correcta de quitar palabras profanas de una cadena dada:
1) Tengo una lista de 100 palabras para buscar en una matriz de cadenas. 2) ¿Cuál es la forma correcta de manejar palabras parciales? ¿Cómo la mayoría de las personas manejan esto? Por ejemplo, la palabra masa. Entonces, a veces, una palabra parcial también es mala: supongamos que foobar es una palabra extremadamente profana. Puede que yo quiera rechazar foobar y foobar * y * foobar.Filtro profanidad usando una expresión regular (lista de 100 palabras)

¿Coloca todas las palabras en una sola expresión o recorre la lista?

¿Cuál es la forma correcta de solucionarlo? Estoy usando Groovy/Grails, pero se aceptan ejemplos de idiomas modernos.

+2

Revise este enlace: http://stackoverflow.com/questions/273516/how-do-you-implement-a-good-profanity-filter –

+1

Busque el problema de Scunthorpe: http: //en.wikipedia .org/wiki/Scunthorpe_problem – rossum

Respuesta

2
  1. Concatenate cada palabra en una lista de palabras - (foobar|foobaz|...)
  2. a continuación, poner guardias a cada lado de la agrupación de caracteres extraños

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

Además, es probable que quiere usar una bandera que no distinga entre mayúsculas y minúsculas para que también coincida con palabras como FooBaz y fOObaR.

En lo que respecta al rendimiento, concatenar esto como una gran expresión regular es probablemente el más rápido (aunque no soy un experto). El algoritmo de expresiones regulares es bastante eficiente en la búsqueda de & para manejar las condiciones de las sucursales. Básicamente, tiene que ser mejor que O(mn) (donde m es el número de palabras y n es el tamaño del texto que está buscando)

3

Este es un problema muy difícil de resolver y es necesario determinar si las expresiones regulares funcionarán para usted y cómo maneja la incrustación (cuando agrega una palabra de diccionario a profanidad como frackface excepto con la palabra real F-word).

Las expresiones regulares generalmente tienen un límite de cuánto tiempo pueden estar y esto usualmente le impide usar una sola expresión regular para todas sus palabras. Ejecutar múltiples expresiones regulares contra una cadena es muy lento, dependiendo del rendimiento que necesite y del tamaño de su lista negra. Inicialmente implementamos CleanSpeak como un sistema de expresión regular, pero no escala y lo reescribimos usando un mecanismo diferente.

También debe tener en cuenta frases, signos de puntuación, espacios, leet-speak y otros idiomas. Todos estos hacen que las expresiones regulares sean menos atractivas como solución. He aquí algunos ejemplos que utilizan la palabra hola (asuma que se profanidad para este ejercicio):

  • elemento de la lista
  • hola
  • hola
  • h_e_l_l_o
  • | - | Ello
  • h3llo
  • "hola allí" (esta frase puede no contener palabras profanas pero combinadas son profanas)

También necesita manejar casos de borde donde dos o más palabras de diccionario (lista blanca) contienen una blasfemia cuando están una al lado de la otra.Algunos ejemplos que contienen la s-palabra:

  • fiesta que
  • ssh es tiempo de silencio

Estos, obviamente, no son malas palabras, pero la mayoría de las soluciones comerciales de cosecha propia y muchos tienen problemas con estos casos.

Hemos pasado los últimos 3 años perfeccionando el filtro utilizado por CleanSpeak para asegurarnos de que maneja todos estos casos y seguimos modificando y mejorando. También pasamos 8 meses perfeccionando nuestro sistema para el rendimiento y puede manejar aproximadamente 5,000 mensajes por segundo. No quiere decir que no se puede construir algo utilizable, pero estar preparado para manejar una gran cantidad de problemas que podrían surgir y también para crear un sistema que no utiliza expresiones regulares.

Cuestiones relacionadas