¿Cómo se implementa un buen filtro de malas palabras?
Muchos de nosotros necesitamos lidiar con entradas de usuarios, consultas de búsqueda y situaciones en las que el texto de entrada puede contener malas palabras o lenguaje indeseable. Muchas veces es necesario filtrar esto.
¿Dónde se puede encontrar una buena lista de malas palabras en varios idiomas y dialectos?
¿Hay API disponibles para fuentes que contienen buenas listas? ¿O tal vez una API que simplemente diga "sí, esto está limpio" o "no, esto está sucio" con algunos parámetros?
¿Cuáles son algunos buenos métodos para detectar a personas que intentan engañar al sistema, como a$$, azz o a55?
Puntos de bonificación si ofreces soluciones para PHP. :)
Editar: respuesta a respuestas que dicen simplemente evitar el problema programático:
Creo que hay un lugar para este tipo de filtro cuando, por ejemplo, un usuario puede utilizar la búsqueda de imágenes públicas para encontrar imágenes que se agregan a un grupo comunitario sensible. Si pueden buscar "pene", probablemente obtendrán muchas fotografías de, sí. Si no queremos imágenes de eso, entonces evitar la palabra como término de búsqueda es un buen guardián, aunque hay que reconocer que no es un método infalible. Obtener la lista de palabras en primer lugar es la verdadera cuestión.
Así que realmente me refiero a una forma de determinar si un solo token está sucio o no y luego simplemente rechazarlo. No me molestaría en evitar un sentimiento como la referencia totalmente hilarante a la "jirafa de cuello largo". Nada que puedas hacer allí. :)
Filtros de obscenidad: ¿mala idea o increíblemente mala idea para tener relaciones sexuales?
Además, no se puede olvidar La historia no contada del SpeedChat de Toontown , donde incluso el uso de una "lista blanca de palabras seguras" resultó en que un niño de 14 años la eludiera rápidamente diciendo: "Quiero meter mi jirafa de cuello largo en tu peluda piel". conejito blanco."
En pocas palabras: en última instancia, para cualquier sistema que implemente, no existe absolutamente ningún sustituto para la revisión humana (ya sea entre pares o de otro tipo). Siéntete libre de implementar una herramienta rudimentaria para deshacerte de los vehículos, pero para el troll decidido, es absolutamente necesario tener un enfoque no basado en algoritmos.
Un sistema que elimine el anonimato e introduzca la responsabilidad (algo que Stack Overflow hace bien) también es útil, particularmente para ayudar a combatir el REGALO de John Gabriel.
También preguntó dónde puede obtener listas de malas palabras para comenzar; un proyecto de código abierto que puede consultar es Dansguardian ; consulte el código fuente de sus listas de malas palabras predeterminadas. También hay una lista de frases adicional de terceros que puede descargar para el proxy y que puede resultarle útil.
Editar en respuesta a la pregunta editar: Gracias por la aclaración sobre lo que estás intentando hacer. En ese caso, si sólo estás intentando hacer un filtro de palabras simple, hay dos maneras de hacerlo. Una es crear una única expresión regular larga con todas las frases prohibidas que desea censurar y simplemente buscar/reemplazar una expresión regular con ella. Una expresión regular como:
$filterRegex = "(boogers|snot|poop|shucks|argh)"
y ejecútelo en su cadena de entrada usando preg_match() para probar al por mayor un acierto,
o preg_replace() para borrarlos.
También puede cargar esas funciones con matrices en lugar de una sola expresión regular larga, y para listas de palabras largas, puede ser más manejable. Consulte preg_replace() para ver algunos buenos ejemplos sobre cómo se pueden usar las matrices de manera flexible.
Para obtener ejemplos adicionales de programación PHP, consulte esta página para obtener una clase genérica algo avanzada para el filtrado de palabras que * está fuera de las letras centrales de las palabras censuradas, y esta pregunta anterior de Stack Overflow que también tiene un ejemplo de PHP (la principal parte valiosa allí es el enfoque de palabras filtradas basado en SQL (se puede prescindir del compensador leet-speak si lo considera innecesario).
También agregó: " Obtener la lista de palabras en primer lugar es la verdadera pregunta ". Además de algunos de los enlaces dansgaurdianos anteriores, puede que le resulte útil este práctico archivo .zip de 458 palabras.
Si bien sé que esta pregunta es bastante antigua, es una pregunta que ocurre con frecuencia...
Existe tanto una razón como una clara necesidad de contar con filtros de malas palabras (consulte la entrada de Wikipedia aquí ), pero a menudo no llegan a ser 100% precisos por razones muy distintas; Contexto y precisión .
Depende (totalmente) de lo que estés tratando de lograr: en su forma más básica, probablemente estés tratando de cubrir las " siete palabras sucias " y algo más... Algunas empresas necesitan filtrar las blasfemias más básicas: básicas malas palabras, URL o incluso información personal, etc., pero otros deben evitar nombres de cuentas ilícitos (Xbox live es un ejemplo) o mucho más...
El contenido generado por el usuario no solo contiene posibles malas palabras, sino que también puede contener referencias ofensivas a:
- Actos sexuales
- orientación sexual
- Religión
- Etnicidad
- Etc...
Y potencialmente, en varios idiomas. Shutterstock ha desarrollado listas básicas de palabras sucias en 10 idiomas hasta la fecha, pero sigue siendo básica y está muy orientada a sus necesidades de "etiquetado". Hay varias otras listas disponibles en la web.
Estoy de acuerdo con la respuesta aceptada de que no es una ciencia definida y que el lenguaje es un desafío en continua evolución , pero en el que una tasa de captura del 90% es mejor que el 0%. Depende exclusivamente de tus objetivos: lo que intentas lograr, el nivel de apoyo que tienes y lo importante que es eliminar malas palabras de diferentes tipos.
Al crear un filtro, debe considerar los siguientes elementos y cómo se relacionan con su proyecto:
- Palabras/frases
- Acrónimos (FOAD/LMFAO, etc.)
- Falsos positivos (palabras, lugares y nombres como 'mishit', 'scunthorpe' y 'titsworth')
- URL (los sitios pornográficos son un objetivo obvio)
- Información personal (correo electrónico, dirección, teléfono, etc., si corresponde)
- Elección de idioma (normalmente inglés de forma predeterminada)
- Moderación (cómo, en todo caso, puede interactuar con el contenido generado por el usuario y qué puede hacer con él)
Puedes crear fácilmente un filtro de malas palabras que capture más del 90% de las malas palabras, pero nunca alcanzarás el 100%. Simplemente no es posible. Cuanto más cerca quieras llegar al 100%, más difícil se vuelve... Después de haber construido un complejo motor de malas palabras en el pasado que manejaba más de 500.000 mensajes en tiempo real por día, ofrecería el siguiente consejo:
Un filtro básico implicaría:
- Construyendo una lista de malas palabras aplicables
- Desarrollar un método para abordar las derivaciones de malas palabras.
A moderately complex filer would involve, (In addition to a basic filter):
- Using complex pattern matching to deal with extended derivations (using advanced regex)
- Dealing with Leetspeak (l33t)
- Dealing with false positives
A complex filter would involve a number of the following (In addition to a moderate filter):
- Whitelists and blacklists
- Naive bayesian inference filtering of phrases/terms
- Soundex functions (where a word sounds like another)
- Levenshtein distance
- Stemming
- Human moderators to help guide a filtering engine to learn by example or where matches aren't accurate enough without guidance (a self/continually-improving system)
- Perhaps some form of AI engine