Muchos de nosotros necesitamos lidiar con la entrada del usuario, las consultas de búsqueda y las situaciones en las que el texto de entrada puede contener malas palabras o lenguaje no deseado. A menudo esto necesita ser filtrado.
¿Dónde se puede encontrar una buena lista de malas palabras en varios idiomas y dialectos?
¿Hay API disponibles para las fuentes que contienen buenas listas? ¿O tal vez una API que simplemente dice "sí, esto está limpio" o "no, esto está sucio" con algunos parámetros?
¿Cuáles son algunos buenos métodos para atrapar a personas que intentan engañar al sistema, como $$, azz o a55?
Puntos de bonificación si ofrece 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 usar la búsqueda de imágenes públicas para encontrar imágenes que se agreguen a un grupo comunitario sensible. Si pueden buscar "pene", entonces probablemente obtendrán muchas imágenes 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 ciertamente no es un método infalible. Obtener la lista de palabras en primer lugar es la verdadera pregunta.
Así que realmente me estoy refiriendo a una forma de descubrir que un solo token está sucio o no y luego simplemente no lo permites. No me molestaría en evitar un sentimiento como la referencia totalmente hilarante de "jirafa de cuello largo". Nada que puedas hacer allí. :)
fuente
Respuestas:
Filtros de obscenidad: ¿una mala idea o una mala idea increíblemente interesante?
Además, no se puede olvidar La historia no contada de SpeedChat de Toontown , donde incluso el uso de una "lista blanca de palabras seguras" resultó en que un niño de 14 años lo eludiera rápidamente con: "Quiero meter a mi jirafa de cuello largo en tu conejito blanco y esponjoso ".
En pocas palabras: en última instancia, para cualquier sistema que implemente, no hay absolutamente ningún sustituto para la revisión humana (ya sea por pares o de otra manera). Siéntase libre de implementar una herramienta rudimentaria para deshacerse de los drive-by's, pero para el troll determinado, absolutamente debe tener un enfoque no basado en algoritmos.
También es útil un sistema que elimine el anonimato e introduzca la responsabilidad (algo que Stack Overflow hace bien), particularmente para ayudar a combatir el REGALO de John Gabriel
También preguntó dónde puede obtener listas de blasfemias para comenzar: un proyecto de código abierto para revisar es Dansguardian , consulte el código fuente de sus listas de blasfemias predeterminadas. También hay una Lista de frases de terceros adicional que puede descargar para el proxy que puede ser un punto de ayuda útil para usted.
Edite en respuesta la edición de preguntas: Gracias por la aclaración sobre lo que está tratando de hacer. En ese caso, si solo está tratando de hacer un filtro de palabras simple, hay dos formas de hacerlo. Una es crear una expresión regular larga y única con todas las frases prohibidas que desea censurar, y simplemente hacer una búsqueda / reemplazo de expresiones regulares con ella. Una expresión regular como:
y ejecútelo en su cadena de entrada usando preg_match () para probar al por mayor un hit,
o preg_replace () para dejarlos en blanco.
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 de cómo las matrices se pueden usar de manera flexible.
Para ver ejemplos de programación PHP adicionales, 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 sobre el desbordamiento de pila que también tiene un ejemplo de PHP (la principal parte valiosa 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 encontrar útil este .zip útil de 458 palabras.
fuente
Si bien sé que esta pregunta es bastante antigua, pero es una pregunta común ...
Hay una razón y una clara necesidad de filtros de blasfemias (vea la entrada de Wikipedia aquí ), pero a menudo no son 100% precisos por razones muy distintas; Contexto y precisión .
Depende (totalmente) de lo que intente lograr: en su forma más básica, probablemente esté tratando de cubrir las " siete palabras sucias " y luego algunas ... Algunas empresas necesitan filtrar la blasfemia más básica: básica palabrotas, URL o incluso información personal, etc., pero otros deben evitar los nombres ilícitos de cuentas (Xbox live es un ejemplo) o mucho más ...
El contenido generado por el usuario no solo contiene posibles malas palabras, también puede contener referencias ofensivas a:
Y potencialmente, en varios idiomas. Shutterstock ha desarrollado listas básicas de palabras sucias en 10 idiomas hasta la fecha, pero sigue siendo básico y está muy orientado 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 constante evolución , pero uno en el que una tasa de captura del 90% es mejor que el 0%. Depende exclusivamente de sus objetivos: lo que está tratando de lograr, el nivel de soporte que tiene y la importancia de eliminar las blasfemias de diferentes tipos.
Al crear un filtro, debe tener en cuenta los siguientes elementos y cómo se relacionan con su proyecto:
Puedes crear fácilmente un filtro de blasfemias que capture más del 90% de blasfemias, pero nunca alcanzarás el 100%. Simplemente no es posible. Cuanto más cerca quieras llegar al 100%, más difícil se vuelve ... Habiendo construido un motor blasfemo complejo en el pasado que manejaba más de 500 mil mensajes en tiempo real por día, te ofrecería los siguientes consejos:
Un filtro básico implicaría:
Un archivador moderadamente complejo implicaría, (además de un filtro básico):
Un filtro complejo implicaría una cantidad de lo siguiente (además de un filtro moderado):
fuente
No conozco ninguna buena biblioteca para esto, pero hagas lo que hagas, asegúrate de equivocarte en la dirección de dejar pasar las cosas. He tratado con sistemas que no me permitirían usar "mpassell" como nombre de usuario, porque contiene "culo" como una subcadena. ¡Esa es una excelente manera de alienar a los usuarios!
fuente
Durante una entrevista de trabajo mía, el CTO de la compañía que me estaba entrevistando probó un juego de palabras / web que escribí en Java. De una lista de palabras de todo el diccionario de inglés de Oxford, ¿cuál fue la primera palabra que se llegó a adivinar?
Por supuesto, la palabra más asquerosa en el idioma inglés.
De alguna manera, todavía recibí la oferta de trabajo, pero luego rastreé una lista de palabras profanas (no muy diferente a esta ) y escribí un script rápido para generar un nuevo diccionario sin todas las malas palabras (sin siquiera tener que mirar la lista) .
Para su caso particular, creo que comparar la búsqueda con palabras reales suena como el camino a seguir con una lista de palabras como esa. Los estilos / puntuación alternativos requieren un poco más de trabajo, pero dudo que los usuarios lo usen con la suficiente frecuencia como para ser un problema.
fuente
un sistema de filtrado de malas palabras nunca será perfecto, incluso si el programador es seguro y se mantiene al tanto de todos los desarrollos desnudos
Dicho esto, es probable que cualquier lista de "palabras traviesas" funcione tan bien como cualquier otra lista, ya que el problema subyacente es la comprensión del lenguaje, que es bastante difícil de resolver con la tecnología actual
entonces, la única solución práctica es doble:
fuente
La única forma de evitar la entrada ofensiva del usuario es evitar toda entrada del usuario.
Si insiste en permitir la entrada del usuario y necesita moderación, incorpore moderadores humanos.
fuente
Eche un vistazo al servicio web de filtro de blasfemias de CDYNE
URL de prueba
fuente
Con respecto a su subpregunta "engañar al sistema", puede manejarlo normalizando tanto la lista de "malas palabras" como el texto ingresado por el usuario antes de realizar su búsqueda. por ejemplo, use una serie de expresiones regulares (o tr si PHP lo tiene) para convertir [z $ 5] a "s", [4 @] a "a", etc., luego compare la lista normalizada de "malas palabras" con la normalizada texto. Tenga en cuenta que la normalización podría conducir a falsos positivos adicionales, aunque no puedo pensar en ningún caso real en este momento.
El desafío más grande es encontrar algo que permita a la gente citar "El bolígrafo es más poderoso que la espada" mientras bloquea "penis".
fuente
Tenga cuidado con los problemas de localización: lo que es una palabrota en un idioma puede ser una palabra perfectamente normal en otro.
Un ejemplo actual de esto: eBay utiliza un enfoque de diccionario para filtrar "malas palabras" de los comentarios. Si intenta ingresar la traducción alemana de "esta fue una transacción perfecta" ("das war eine perfekte Transaktion"), eBay rechazará los comentarios debido a malas palabras.
¿Por qué? Porque la palabra alemana para "era" es "guerra", y "guerra" está en el diccionario de eBay de "malas palabras".
Así que tenga cuidado con los problemas de localización.
fuente
Si puede hacer algo como Digg / Stackoverflow donde los usuarios pueden votar / marcar contenido obsceno ... hágalo.
Entonces, todo lo que necesita hacer es revisar a los usuarios "traviesos" y bloquearlos si rompen las reglas.
fuente
Llego un poco tarde a la fiesta, pero tengo una solución que podría funcionar para algunos que leen esto. Está en JavaScript en lugar de PHP, pero hay una razón válida para ello.
De todos modos
El enfoque que utilicé es permitir que un usuario "se suscriba" a su filtro de malas palabras. Básicamente, las blasfemias se permitirán por defecto, pero si mis usuarios no quieren leerlo, no tienen que hacerlo. Esto también ayuda con el problema "l33t sp3 @ k".
El concepto es simple jqueryplugin que el servidor inyecta si la cuenta del cliente habilita el filtro de malas palabras. A partir de ahí, son solo un par de líneas simples las que borran las palabrotas.
Aquí está la página de demostración
https://chaseflorell.github.io/jQuery.ProfanityFilter/demo/
resultado
fuente
a$$
a$$
, entonces lo agrega a la lista de filtros.Recopilé 2200 malas palabras en 12 idiomas: en, ar, cs, da, de, eo, es, fa, fi, fr, hi, hu, it, ja, ko, nl, no, pl, pt, ru, sv , th, tlh, tr, zh.
Las opciones de volcado de MySQL, JSON, XML o CSV están disponibles.
https://github.com/turalus/openDB
Le sugiero que ejecute este SQL en su base de datos y verifique cada vez que el usuario ingrese algo.
fuente
No lo hagas Simplemente lleva a problemas. Una experiencia personal clbuttic que tengo con los filtros de blasfemias es el momento en que fui expulsado / expulsado de un canal de IRC por mencionar que estaba "cruzando el puente hacia Hancock durante un par de horas" o algo por el estilo.
fuente
Estoy de acuerdo con la publicación de HanClinto más arriba en esta discusión. Generalmente uso expresiones regulares para hacer coincidir cadenas de texto de entrada. Y este es un esfuerzo vano, ya que, como mencionaste originalmente, tienes que dar cuenta explícitamente de cada forma trucada de escritura popular en la red en tu lista "bloqueada".
En una nota al margen, mientras que otros están debatiendo la ética de la censura, debo estar de acuerdo en que alguna forma es necesaria en la web. Algunas personas simplemente disfrutan publicar vulgaridad porque puede ser instantáneamente ofensivo para un gran grupo de personas, y no requiere absolutamente ningún pensamiento por parte del autor.
Gracias por las ideas.
HanClinto gobierna!
fuente
Una vez que tenga una buena tabla MYSQL de algunas palabras malas que desee filtrar (comencé con uno de los enlaces en este hilo), puede hacer algo como esto:
Estoy seguro de que hay una forma más eficiente de hacer todos esos reemplazos, pero no soy lo suficientemente inteligente como para descubrirlo (y esto parece funcionar bien, aunque de manera ineficiente).
Creo que debería equivocarse al permitir que los usuarios se registren, y usar humanos para filtrar y agregar a su tabla de malas palabras, según sea necesario. Aunque todo depende del costo de un falso positivo (palabra correcta marcada como mala) versus un falso negativo (la palabra mala se transmite). En última instancia, eso debería determinar qué tan agresivo o conservador eres en tu estrategia de filtrado.
También sería muy cuidadoso si desea utilizar comodines, ya que a veces pueden comportarse de manera más onerosa de lo que pretende.
fuente
Francamente, les dejaría pronunciar las palabras "engañar al sistema" y prohibirlas, que soy yo. Pero también simplifica la programación.
Lo que haría es implementar un filtro regex así:
/[\s]dooby (doo?)[\s]/i
o si la palabra tiene el prefijo en otros,/[\s]doob(er|ed|est)[\s]/
. Esto evitaría filtrar palabras como atenuado, lo cual es perfectamente válido, pero también requeriría conocer las otras variantes y actualizar el filtro real si aprende uno nuevo. Obviamente estos son todos ejemplos, pero tendrías que decidir cómo hacerlo tú mismo.No estoy a punto de escribir todas las palabras que sé, no cuando en realidad no quiero saberlas.
fuente
Estoy de acuerdo con la inutilidad del tema, pero si tienes que tener un filtro, echa un vistazo a Ning's Boxwood :
También vea esta publicación de blog para más detalles:
fuente
Concluí que, para crear un buen filtro de blasfemias, necesitamos 3 componentes principales, o al menos es lo que voy a hacer. Estos son:
Una ventaja adicional será recompensar de alguna manera a aquellos que contribuyen con reporteros de abuso precisos y castigar al delincuente, por ejemplo, suspender sus cuentas.
fuente
También tarde en el juego, pero haciendo algunas investigaciones y tropecé aquí. Como otros han mencionado, es casi casi imposible si estuviera automatizado, pero si su diseño / requisito puede involucrar en algunos casos (pero no todo el tiempo) interacciones humanas para revisar si es profano o no, puede considerar el LD. https://docs.microsoft.com/en-us/azure/cognitive-services/content-moderator/text-moderation-api#profanity es mi opción actual en este momento por múltiples razones:
Para mi necesidad, se basó / está basado en un servicio comercial amigable para el público (OK, videojuegos) que otros usuarios pueden / verán el nombre de usuario, pero el diseño requiere que tenga que pasar por un filtro profano para rechazar el nombre de usuario ofensivo. La parte triste de esto es que el clásico problema "clbuttic" probablemente ocurrirá ya que los nombres de usuario son generalmente una sola palabra (hasta N caracteres) de a veces múltiples palabras concatenadas ... Nuevamente, el servicio cognitivo de Microsoft no marcará "Asistir" como texto. HasProfanity = verdadero pero puede marcar una de las categorías de probabilidad de ser alta.
A medida que el OP pregunta, ¿qué pasa con "un $$"? Aquí hay un resultado cuando lo pasé por el filtro: como puede ver, ha determinado que no es profano, pero tiene una alta probabilidad de que lo sea, por lo que señala las recomendaciones. de revisión (interacciones humanas).
Cuando la probabilidad es alta, puedo regresar "Lo siento, ese nombre ya está en uso" (incluso si no lo es) para que sea menos ofensivo para las personas anti-censura o algo así, si no queremos para integrar la revisión humana o devolver "Su nombre de usuario ha sido notificado al departamento de operaciones en vivo, puede esperar a que se revise y apruebe su nombre de usuario o elija otro nombre de usuario". O lo que sea...
Por cierto, el costo / precio de este servicio es bastante bajo para mi propósito (¿con qué frecuencia se cambia el nombre de usuario?), Pero de nuevo, para OP, tal vez el diseño exige consultas más intensas y puede no ser ideal para pagar / suscribirse ML-services, o no puede tener interacciones / revisión humana. Todo depende del diseño ... Pero si el diseño se ajusta a la factura, quizás esta sea la solución de OP.
Si está interesado, puedo enumerar los inconvenientes en el comentario en el futuro.
fuente
Los filtros de blasfemias son una mala idea.La razón es que no puedes entender todas las malas palabras. Si lo intentas, obtienes falsos positivos.
Atrapando palabras
Digamos que quieres atrapar la palabra F. Fácil, verdad? Bien, veamos.
Puedes recorrer una cadena para encontrar "joder". Desafortunadamente, la gente engaña a los filtros hoy en día. El filtro de malas palabras no captaba "fuk".
Uno puede intentar verificar la ortografía y las variantes múltiples de la palabra, pero eso ralentizará el rendimiento de su código. Para atrapar la palabra F, debe buscar "fuc", "Fuc", "fuk", "Fuk", "F ***", etc. Y la lista sigue y sigue.
Evitar la inocencia
Bien, entonces, ¿qué tal si se distingue entre mayúsculas y minúsculas e ignora los espacios para que atrape "F u C k"? Puede parecer una buena idea, pero alguien puede pasar por alto el filtro de blasfemias con "FUCK"
Ignoras la puntuación.
Ahora que es un problema real, ya que una oración como "¡ Diablos , ahí!" aparecerá como "infierno" y " ¿Qué culo ?" recoge como "culo".
Y hay un montón de palabras que debe excluir del filtro, tales como "Cons tit ution", porque contiene "tit".
Las personas también pueden usar palabras sustitutas, como "Frack". ¿Tú también bloqueas eso? ¿Qué pasa con "pluma es" para "pene"? Su programa no tiene inteligencia artificial para saber si la cadena es buena o mala.
No uses filtros profanos. Son difíciles de desarrollar y son tan lentos como un rastreo.
fuente
No lo hagas
Porque:
Editar: Si bien estoy de acuerdo con el comentarista que dijo "la censura está mal", esa no es la naturaleza de esta respuesta.
fuente