Pregunta

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 indeseable. 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 las 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 agregan a un grupo comunitario sensible. Si pueden buscar `` pene '', entonces probablemente obtendrán muchas fotos 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.

Entonces, 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 totalmente divertida "jirafa de cuello largo". referencia. Nada que puedas hacer allí. :)

¿Fue útil?

Solución

Filtros de obscenidad: mala idea, o ¿Increíblemente mala idea?

Además, uno no puede olvidar La historia no contada del SpeedChat de Toontown , donde incluso se utiliza una" lista blanca de palabras seguras " resultó en un niño de 14 años que lo eludió rápidamente con: " Quiero pegarle a mi jirafa de cuello largo tu conejito blanco y esponjoso. "

Conclusión: 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.

Un sistema que elimina el anonimato e introduce la responsabilidad (algo que Stack Overflow hace bien) también es útil, particularmente para ayudar a combatir REGALO de John Gabriel

También preguntó dónde puede obtener listas de malas palabras para comenzar: un proyecto de código abierto para verificar es Dansguardian - verifique el código fuente de sus listas de malas palabras predeterminadas. También hay una Lista de frases de terceros que puede descargar para el proxy que puede ser una recopilación útil señalar para usted.

Edite en respuesta la edición de preguntas: Gracias por aclarar lo que está intentando hacer. En ese caso, si solo está tratando de hacer un filtro de palabras simple, hay dos formas de hacerlo. Una es crear una única expresión regular larga 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:

$filterRegex = "(boogers|snot|poop|shucks|argh)"

y ejecútelo en su cadena de entrada usando preg_match () para probar al por mayor un golpe,

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 el preg_replace () para ver algunos buenos ejemplos de cómo las matrices se pueden usar de manera flexible.

Para 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 sobre desbordamiento de pila eso 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 encuentra innecesario).

También agregó: " Obtener la lista de palabras en primer lugar es la verdadera pregunta. " - además de algunos de los enlaces Dansgaurdian anteriores, puede encontrar esto práctico .zip de 458 palabras para ser útil.

Otros consejos

Aunque sé que esta pregunta es bastante antigua, pero es una pregunta frecuente ...

Hay una razón y una clara necesidad de filtros de blasfemias (vea entrada de Wikipedia aquí ), pero a menudo caen a menos que sea 100% preciso por razones muy distintas; Contexto y precisión .

Depende (totalmente) de lo que intente lograr: en su forma más básica, probablemente intente cubrir el " siete palabras sucias " y algo más ... Algunas empresas necesitan filtrar la blasfemia más básica: palabrotas básicas, URL o incluso información personal, etc., pero otras necesitan evitar 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:

  • Actos sexuales
  • Orientación sexual
  • Religión
  • Etnia
  • Etc ...

Y potencialmente, en varios idiomas. Shutterstock ha desarrollado listas básicas de palabras sucias en 10 idiomas para fecha, pero sigue siendo básico y 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 como el lenguaje es un desafío en constante evolución, pero uno donde una tasa de captura del 90% es mejor que 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:

  • 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 (generalmente inglés por defecto)
  • 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 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:

  • Construyendo una lista de blasfemias aplicables
  • Desarrollando un método para tratar derivaciones de blasfemias

Un archivador moderadamente complejo implicaría, (además de un filtro básico):

  • Uso de la coincidencia de patrones complejos para lidiar con derivaciones extendidas (usando expresiones regulares avanzadas)
  • Tratar con Leetspeak (l33t)
  • Manejo de falsos positivos

Un filtro complejo implicaría una cantidad de lo siguiente (además de un filtro moderado):

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 " ass " como una subcadena. ¡Esa es una excelente manera de alienar a los usuarios!

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 sucia del idioma inglés.

De alguna manera, todavía recibí la oferta de trabajo, pero luego rastreé una lista de palabras profanas (no a diferencia de este ) y escribió una secuencia de comandos rápida 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.

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:

  1. prepárate para actualizar tu diccionario con frecuencia
  2. contrata a un editor humano para corregir falsos positivos (p. ej., '' clbuttic '' en lugar de '' clásico '') y falsos negativos (¡vaya! ¡Perdió uno!)

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.

Con respecto a su " engañar al sistema " subconsulta, puede manejar eso normalizando tanto la "mala palabra" lista y el texto ingresado por el usuario antes de hacer 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 palabra mala normalizada " lista contra el texto normalizado. 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 las personas citar "La pluma es más poderosa que la espada". mientras bloquea '' p e n i s ''.

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 al alemán 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.

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 el " travieso " usuarios, y bloquearlos si rompen las reglas.

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.

  

Revelación completa, escribí este complemento ...

De todos modos.

El enfoque que he seguido es permitir que un usuario "Opt-In" a su filtro de blasfemias. 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 " l33t sp3 @ k " problema.

El concepto es un simple plugin que es inyectado por el servidor si la cuenta del cliente está habilitando el filtrado 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/

<div id="foo">
    ass will fail but password will not
</div>

<script>
    // code:
    $('#foo').profanityFilter({
        customSwears: ['ass']
    });
</script>

resultado

  

*** fallará pero la contraseña no

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 me estaba "cruzando el puente hacia Hancock durante un par de horas". o algo por el estilo.

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 esto 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 " bloqueado " lista.

En una nota al margen, mientras otros están debatiendo la ética de la censura, debo estar de acuerdo en que es necesaria alguna forma 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!

Una vez que tenga una buena tabla MYSQL de algunas palabras malas que desea filtrar (comencé con uno de los enlaces en este hilo), puede hacer algo como esto:

$errors = array();  //Initialize error array (I use this with all my PHP form validations)

$SCREENNAME = mysql_real_escape_string(

Una vez que tenga una buena tabla MYSQL de algunas palabras malas que desea 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 resolverlo (y esto parece funcionar bien, aunque de manera ineficiente).

Creo que deberías equivocarte al permitir que los usuarios se registren y usar humanos para filtrar y agregar a tu 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.

POST['SCREENNAME']); //Escape the input data to prevent SQL injection when you query the profanity table. $ProfanityCheckString = strtoupper($SCREENNAME); //Make the input string uppercase (so that 'BaDwOrD' is the same as 'BADWORD'). All your values in the profanity table will need to be UPPERCASE for this to work. $ProfanityCheckString = preg_replace('/[_-]/','',$ProfanityCheckString); //I allow alphanumeric, underscores, and dashes...nothing else (I control this with PHP form validation). Pull out non-alphanumeric characters so 'B-A-D-W-O-R-D' shows up as 'BADWORD'. $ProfanityCheckString = preg_replace('/1/','I',$ProfanityCheckString); //Replace common numeric representations of letters so '84DW0RD' shows up as 'BADWORD'. $ProfanityCheckString = preg_replace('/3/','E',$ProfanityCheckString); $ProfanityCheckString = preg_replace('/4/','A',$ProfanityCheckString); $ProfanityCheckString = preg_replace('/5/','S',$ProfanityCheckString); $ProfanityCheckString = preg_replace('/6/','G',$ProfanityCheckString); $ProfanityCheckString = preg_replace('/7/','T',$ProfanityCheckString); $ProfanityCheckString = preg_replace('/8/','B',$ProfanityCheckString); $ProfanityCheckString = preg_replace('/0/','O',$ProfanityCheckString); //Replace ZERO's with O's (Capital letter o's). $ProfanityCheckString = preg_replace('/Z/','S',$ProfanityCheckString); //Replace Z's with S's, another common substitution. Make sure you replace Z's with S's in your profanity database for this to work properly. Same with all the numbers too--having S3X7 in your database won't work, since this code would render that string as 'SEXY'. The profanity table should have the "rendered" version of the bad words. $CheckProfanity = mysql_query("SELECT * FROM DATABASE.TABLE p WHERE p.WORD = '".$ProfanityCheckString."'"); if(mysql_num_rows($CheckProfanity) > 0) {$errors[] = 'Please select another Screen Name.';} //Check your profanity table for the scrubbed input. You could get real crazy using LIKE and wildcards, but I only want a simple profanity filter. if (count($errors) > 0) {foreach($errors as $error) {$errorString .= "<span class='PHPError'>$error</span><br /><br />";} echo $errorString;} //Echo any PHP errors that come out of the validation, including any profanity flagging. //You can also use these lines to troubleshoot. //echo $ProfanityCheckString; //echo "<br />"; //echo mysql_error(); //echo "<br />";

Estoy seguro de que hay una forma más eficiente de hacer todos esos reemplazos, pero no soy lo suficientemente inteligente como para resolverlo (y esto parece funcionar bien, aunque de manera ineficiente).

Creo que deberías equivocarte al permitir que los usuarios se registren y usar humanos para filtrar y agregar a tu 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.

Reuní 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 MySQL, JSON, XML o CSV están disponibles.

https://github.com/turalus/openDB

Te sugiero que ejecutes este SQL en tu base de datos y lo verifiques cada vez que el usuario ingrese algo.

Francamente, les dejaría obtener el "truco del sistema" palabras y prohibirlas en su lugar, que soy solo 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 está prefijada en otros, / [\ s] doob (er | ed | est) [\ s] / . Esto evitaría filtrar palabras como atenuado, que es perfectamente válido, pero también requeriría el conocimiento de 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.

Estoy de acuerdo con la inutilidad del tema, pero si necesita un filtro, consulte Boxwood :

  

Boxwood es una extensión de PHP para el reemplazo rápido de varias palabras en un fragmento de texto. Es compatible con mayúsculas y minúsculas. Requiere que el texto en el que opera se codifique como UTF-8.

Consulte también esta publicación de blog para obtener más detalles:

  

Con Boxwood, puede hacer que su lista de términos de búsqueda sea tan larga como lo desee: el algoritmo de búsqueda y reemplazo no se vuelve más lento con más palabras en la lista de palabras para buscar. Funciona mediante la creación de un trie de todos los términos de búsqueda y luego escanea el texto del tema una sola vez, recorre los elementos del trie y los compara con los caracteres de su texto. Es compatible con US-ASCII y UTF-8, coincidencia entre mayúsculas y minúsculas o insensible, y tiene cierta lógica de verificación de límites de palabras centrada en inglés.

Concluí que, para crear un buen filtro de malas palabras, necesitamos 3 componentes principales, o al menos es lo que voy a hacer. Estos son:

  1. El filtro: un servicio en segundo plano que verifica contra una lista negra, diccionario o algo así.
  2. No permitir cuenta anónima
  3. Informar abuso

Una bonificación, será recompensar de alguna manera a aquellos que contribuyen con reporteros de abuso precisos y castigar al delincuente, p. suspender sus cuentas.

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:

  • Admite muchas localizaciones
  • Siguen actualizando la base de datos, por lo que no tengo que estar al día con los últimos slangs o idiomas (problema de mantenimiento)
  • Cuando hay una alta probabilidad (es decir, 90% o más) simplemente puede negarla pragmáticamente
  • Puede observar la categoría que causa una bandera que puede o no ser una blasfemia, y puede hacer que alguien la revise para enseñar que es o no profana.

Para mi necesidad, se basó / está basado en un servicio comercial amigable al 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 el clásico '' clbuttic '' Lo más probable es que ocurra un problema, ya que los nombres de usuario suelen ser una sola palabra (hasta N caracteres) de a veces varias palabras concatenadas ... Una vez más, el servicio cognitivo de Microsoft no marcará "Asistir". como Text.HasProfanity = true pero puede marcar una de las categorías de probabilidad de ser alta.

A medida que el OP pregunta, ¿qué hay de " un $$ " ;, aquí hay un resultado cuando lo pasé por el filtro: ingrese la descripción de la imagen aquí , como puede ver, ha determinado no es profano, pero tiene una alta probabilidad de que lo sea, por lo que señala como 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 contra la censura o algo así, si no queremos integrar la revisión humana o devolver "Su nombre de usuario ha sido notificado al departamento de operaciones en vivo, puede espere a que su nombre de usuario sea revisado y aprobado 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 a los servicios ML, 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.

No lo hagas

Porque:

  • Clbuttic
  • La blasfemia no es OMG MAL
  • La blasfemia no se puede definir de manera efectiva
  • La mayoría de las personas probablemente no aprecian estar '' protegidas '' de blasfemias

Editar: aunque estoy de acuerdo con el comentarista que dijo que "la censura está mal", esa no es la naturaleza de esta respuesta.

Los filtros de blasfemias son una mala idea. La razón es que no puedes entender todas las palabrotas. Si lo intentas, obtienes falsos positivos.

Palabras de captura

Digamos que quieres atrapar la palabra F. Fácil, verdad? Bueno, veamos.

Puede recorrer una cadena para encontrar "coger". Desafortunadamente, la gente engaña a los filtros hoy en día. El filtro de blasfemias no detectó '' 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 y se ignoran 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 " F.U.C.K. "

Usted ignora la puntuación.

Ahora que es un problema real, ya que una oración como " Hell o, there! " aparecerá como "infierno" y '' Wh ass up? '' recoge como "culo".

Y hay un montón de palabras que debe excluir del filtro, como " Cons tit ution, " porque hay '' tit '' en ella.

Las personas también pueden usar palabras sustitutivas, como "Frack". ¿Tú también bloqueas eso? ¿Qué pasa con la pluma? para " pene " ;? Su programa no tiene inteligencia artificial para saber si la cadena es buena o mala.

No uses filtros de malas palabras. Son difíciles de desarrollar y son tan lentos como un rastreo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top