Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Clase para intercambiar por sinonimos, censurar palabras [aporte]

Estas en el tema de Clase para intercambiar por sinonimos, censurar palabras [aporte] en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, esta clase sirve para reemplazar palabras por otras que llamaré "sinónimos". Cada palabra admite un numero indeterminado de sinonimos. Si una palabra se proporciona ...
  #1 (permalink)  
Antiguo 16/07/2009, 17:08
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 8 meses
Puntos: 292
Sonrisa Clase para intercambiar por sinonimos, censurar palabras [aporte]

Hola, esta clase sirve para reemplazar palabras por otras que llamaré "sinónimos". Cada palabra admite un numero indeterminado de sinonimos.

Si una palabra se proporciona sin un sinonimo entonces se considera como "censurada" y se reemplaza por un numero igual de asteriscos '*'

ok... pero por que tanto lio si puedo usar str_replace ? pues bien, porque buscamos palabras y no simplemente substrings, asi que una de las casas que se chequean es que esten delimitadas por espacios, comas, esten entre parentesis (), corchetes [], etc. Sino fuera asi.. podria intentando reemplazar "mente" por "pensamiento", tambien reemplazar "momentaneamente", "torpemente", etc.

Por medio del metodo filter() se pueden directamente filtrar todas las palabras del array que se pasa como parametro.

Se puede especificar que queremos evitar TAGS HTML o XML y sus atributos de modo que no se modifiquen por error, por ejemplo, las ulrs de los links. Para esto se hace uso de la clase HTML editor. Por defecto se ignoran los tags pero para desactivar esta caracteristica tenemos el metodo avoidTagsOFF()

Los metodos basicos serian:

Cita:
->setSearch('palabra'); // seteo palabra a reemplazar
->setOneReplacement('sinonimo'); // agrego un 'sinonimo' mas
->filter(array('censurada1','censurada2',...'censur adaN')); // lista negra
->replace($str); // aplica los reemplazos y filtros sobre una cadena
Tambien se pueden hacer reemplazos combinando setSearch() para las palabras que me interesa sean reemplazadas con setReplacements() que recibe un array asociativo donde para cada palabra ('search') hay una lista (array) de de sinonimos.

Código PHP:
<?
Include "html_editor.class.php";

class 
replacer {
  
// Replacer class for PHP rev 1.00
  // Pablo Bozzolo (2009)

 
  
private $avoidTags=TRUE;
  private 
$wordDict;   // diccionario de 'palabras'
  
private $phraseDict// diccionario de 'frases'
    
  
private $search;      
  private 
$replacement;
  
  function 
avoidTagsOFF(){
    
$this->avoidTags=False;    
  }    
  
  function 
setSubject ($subject){ 
    
$this->subject $subject;        
  }   

  
  function 
setSearch ($search){
    
$this->search $search;    
  }
  
  function 
setReplacements ($replacement){ 
    
$this->wordDict $replacement;    
  }
  
  function 
setOneReplacement ($replacement){   // antes setReplacementOnebyOne()
    
$this->wordDict[$this->search][]=$replacement;
  }    
      
  private function 
take_one($arreglo){ 
    return(
$arreglo[array_rand($arreglo)]);
  }

    
  private function 
buildSentenceDict(){  
       
    foreach (
$this->wordDict as $search => $replacement){    
      if (
strstr($search,' ')){        
        
$this->phraseDict[$search] = $this->wordDict[$search];       
        unset (
$this->wordDict[$search]);        
      }
    }    
    
//print_r ($this->phraseDict);
    
return ($str);
  }  
  
  private function 
replaceUsingphraseDict($str){
    foreach (
$this->phraseDict as $search => $replacement){    
      
$str str_replace ($search,$this->take_one($replacement),$str);
    }  
    return 
$str;
  }
  
  
  function 
replace ($str){  // metodo que da inicio a los reemplazos           
  
     
$this->setSubject($str);              
     
$this->buildSentenceDict(); // creo un diccionario de frases usando el de palabras
     
     
if ($this->avoidTags==FALSE){  
       
$str $this->replaceUsingphraseDict($str); // proceso busquedas de frases     
       
return preg_replace_callback("|[ \[.,;(-]{0,}([\wáéíóúñÑ]+)[ \].,;)-]{0,}|is",array($this"callback"),$str); // aisla palabras con delimitadores
     
}else{      
      
      
$html = new htmlEditor($this->subject); 
      
$cant $html->getNumberOfPieces(); 
       
      for (
$i=0;$i<$cant;$i++){         
        
$sub_before $html->getPieceN($i); 
        
$sub_before $this->replaceUsingphraseDict($sub_before); // proceso busquedas de frases        
        
$sub_after =  preg_replace_callback("|[ \[.,;(]{0,}([\wáéíóúñÑ]+)[ \].,;)]{0,}|is",array($this"callback"),$sub_before); 
        
$html->setPieceN ($sub_after,$i); 
      }      
      return 
$html->getHTML(); 
    } 
     
  }     


  private function 
callback ($matches){  // recibe y envia a procesar palabras individuales  
 
    
$delimitada $matches[0]; // palabra embebida en delimitadores
    
$word $matches[1];
   
    
// algoritmo de reemplazo           ////////
    
$wordAfer $this->word_replacer ($word);  
    if (
$wordAfer==""$wordAfer $word;
    
////////////////////////////////////////////
  
    
return str_replace ($word,$wordAfer,$delimitada);
  }
  
  private function 
word_replacer ($str){           
    
$out='';      
    if (
array_key_exists($str,$this->wordDict)){      
      
$out =  $this->take_one ($this->wordDict[$str]);     
      if (
$out==''){
           
$out =str_repeat('*',strlen($str)); // ****
      
}              
    }
    
    return (
$out);     
  }    
    
  function 
filter (array $words){ // recibe array de palabras a filtrar
    
foreach ($words as $word){
      
$this->wordDict[$word]=array();
    }      
  }  
  
# fin de clase 
 
?>
__________________
Salu2!

Última edición por Italico76; 21/07/2009 a las 14:39
  #2 (permalink)  
Antiguo 16/07/2009, 17:18
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 8 meses
Puntos: 292
Respuesta: Clase para intercambiar por sinonimos, censurar palabras [aporte]

Programa ejemplo:::

aclaro que en este programa se lee un archivo de sinonimos con el siguiente formato:

Cita:
programa,soft,software
computador,computadora,ordenador
movil,celular
Microsoft,
Código PHP:
<?php
 
Include "../clases/str_replace.class.php";

 
$str "Esta es una <i><b>cadena</b></i> de prueba que incluye por ejemplo un enlace a <a href='http://www.yahoo.com' class='pepe'>Google</a> y <u>algo mas</u> de texto";

 
$todo   file_get_contents ("../reemplazos.txt");
 
$lineas   preg_split("/[\r\n]+/",$todo); //  lineas
 
 
$reemplazo = new replacer(); 
 
//$reemplazo->avoidTagsOFF();
  
 
foreach ($lineas as $linea){      
   
$words = (explode (',',$linea));   
   
$a $words[0];   // palabra a buscar
   
   
$reemplazo->setSearch($a); 
 

   for (
$i=1;$i<count($words);$i++){     
       
$ry[$a][]= $words[$i]; // reemplazos     
   
}  
   
   
 } 
    
   
$reemplazo->setReplacements($ry);           
   
   
$reemplazo->setSearch('Google');           // seteo palabra a reemplazar
   
$reemplazo->setOneReplacement('Yahoo'); // agrego un 'sinonimo' mas
    
   
$reemplazo->filter(array('prueba','ejemplo')); // filtra palabras
    
   
echo $reemplazo->replace($str);
 
 
 
?>
Si el texto incluye por ejemplo la palabra "Microsoft", por no tener ningun sinonimo sera considerada palabra censurada.

Espero les sirva!

aH! las palabras se elijen al azar entre los sinonimos
__________________
Salu2!

Última edición por Italico76; 21/07/2009 a las 14:39
  #3 (permalink)  
Antiguo 16/07/2009, 17:31
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Clase para intercambiar por sinonimos, censurar palabras [aporte]

TIP: puedes usar file() en lugar de file_get_contents para que PHP te regrese un array directo del archivo separado por lineas
  #4 (permalink)  
Antiguo 16/07/2009, 17:34
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 8 meses
Puntos: 292
Respuesta: Clase para intercambiar por sinonimos, censurar palabras [aporte]

[ GRACIAS !!!!!! ]
__________________
Salu2!

Última edición por Italico76; 17/07/2009 a las 00:22
  #5 (permalink)  
Antiguo 17/07/2009, 00:20
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 8 meses
Puntos: 292
Respuesta: Clase para intercambiar por sinonimos, censurar palabras [aporte]

Bueno.... y que pasa si uno quiere reemplazar una "frase" por otra ?

Pues... una frase esta formada por varias palabras y la version original de la clase fue pensada para trabajar con un diccionario de palabras y no de frases.

Si bien no es la mejor solucion, con la ultima actualizacion, la clase detecta que una entrada del diccionario es una frase y en este caso hace un str_replace() ordinario en vez de usar expresiones regulares. Sigue respetando los tags asi que no debes preocuparte de que pueda alterarlos.
__________________
Salu2!
  #6 (permalink)  
Antiguo 30/11/2009, 08:54
 
Fecha de Ingreso: noviembre-2009
Mensajes: 1
Antigüedad: 15 años
Puntos: 0
Respuesta: Clase para intercambiar por sinonimos, censurar palabras [aporte]

Hola que tal??? una pregunta esta clase tambien puede servir para los siguientes casos, si tu escribes por ejemplo *c*o*ñ*o* y c#o#ñ#o y todas las combinaciones posibles para sensurar las malas palabras???
  #7 (permalink)  
Antiguo 30/11/2009, 09:42
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 8 meses
Puntos: 2534
Respuesta: Clase para intercambiar por sinonimos, censurar palabras [aporte]

Cita:
Iniciado por Juanlvo Ver Mensaje
Hola que tal??? una pregunta esta clase tambien puede servir para los siguientes casos, si tu escribes por ejemplo *c*o*ñ*o* y c#o#ñ#o y todas las combinaciones posibles para sensurar las malas palabras???
no lo creo, para ello se necesita una clase mas compleja... que utilice expresiones regulares
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #8 (permalink)  
Antiguo 30/11/2009, 21:39
Avatar de emiliodeg  
Fecha de Ingreso: septiembre-2005
Ubicación: Córdoba
Mensajes: 1.830
Antigüedad: 19 años, 3 meses
Puntos: 55
Respuesta: Clase para intercambiar por sinonimos, censurar palabras [aporte]

en este ultimo caso lo q habria q hacer es primero q nada sacar todo lo q no sea texto
Código php:
Ver original
  1. $malaPalabras = 'coño,otra,mala,palabra,separadas,por,comas';
  2. $texto ='coooo|@#~ñ788o';
  3.  
  4. $texto=preg_replace('/[^\wáéíóúñ]+/i','',$texto); //resultado coooño
  5.  
  6. //ahora lo q deberiamos hacer es ver si concuerda con alguna de las palabras prohibidas
  7. //pero haciendo un pequeño retoque para contemplar la repeticion de letras
  8.  
  9. $diccionarioAux = array();
  10.  
  11. foreach(explode(',',$malaPalabras) as $malaPalabra){
  12.  
  13. $aux = '';
  14. for($i=0,$count=strlen($malaPalabra);$i<$count;$i++){
  15. $aux.='['.$malaPalabra[$i].']+';
  16. }
  17.  
  18. $diccionarioAux [] = '/('.$aux.')/i';
  19. }
  20.  
  21. $texto = preg_replace($diccionarioAux,'##PALABRA PROHIBIDA##',$texto);

no es la mejor solucion pero ya va estando cerca habria sq seguirla trabajando y optimizando
__________________
Degiovanni Emilio
developtus.com
  #9 (permalink)  
Antiguo 26/06/2010, 21:46
 
Fecha de Ingreso: agosto-2007
Ubicación: Duitama Boyaca Colombia
Mensajes: 18
Antigüedad: 17 años, 3 meses
Puntos: 1
De acuerdo Respuesta: Clase para intercambiar por sinonimos, censurar palabras [aporte]

Interesante aporte !!

Pero veo que le falta algo para completar la clase y es el manejo de entidades

EJEMPLO quiero cambiar Canción por Tonada

pero en el archivo a cambiar no encuentro Canción sino: Canci&oacute,n

O peor aun entidades del tipo & #64 ; etecetera

seria bueno que la clase tomara la palabra del file de texto
Luego (si hay alguna tilde dentro de la palabra a buscar) la buscase, primero de forma normal y luego reeplazase la tilde por su correspondiente entidad html
  #10 (permalink)  
Antiguo 27/06/2010, 09:50
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Clase para intercambiar por sinonimos, censurar palabras [aporte]

Para eso puedes usar directamente en PHP htmlspecialchars.

Saludos.
  #11 (permalink)  
Antiguo 12/02/2012, 14:51
 
Fecha de Ingreso: abril-2010
Mensajes: 12
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Clase para intercambiar por sinonimos, censurar palabras [aporte]

He probado el script pero me da un error:

Código HTML:
Ver original
  1. Warning: Invalid argument supplied for foreach() in C:\AppServ\www\str_replace.class.php on line 55

He ido a la línea 55 pero no veo lo que pasa....

Código PHP:
Ver original
  1. foreach ($this->phraseDict as $search => $replacement){    
  2.       $str = str_replace ($search,$this->take_one($replacement),$str);
  3.     }  
  4.     return $str;
  5.   }
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 08:58.