Foros del Web » Programando para Internet » PHP »

[APORTE] Función extraer etiquetas cadena de texto usando artículos y preposiciones

Estas en el tema de [APORTE] Función extraer etiquetas cadena de texto usando artículos y preposiciones en el foro de PHP en Foros del Web. Buen dia, Pues, yo se que debe haber una forma mas sencilla de lograrlo, o talvez esta no sea la mejor manera y todas esas ...
  #1 (permalink)  
Antiguo 19/07/2011, 14:08
Avatar de jotaincubus  
Fecha de Ingreso: mayo-2005
Ubicación: Medellin - Colombia
Mensajes: 1.797
Antigüedad: 18 años, 10 meses
Puntos: 394
[APORTE] Función extraer etiquetas cadena de texto usando artículos y preposiciones

Buen dia,

Pues, yo se que debe haber una forma mas sencilla de lograrlo, o talvez esta no sea la mejor manera y todas esas cosas.

Quiero compartirles algo que hice para extraer las palabras realmente importantes para crear etiquetas o keywords ya sea para un campo en la base de datos para hacer un buscador, o para lo que pueda servir.

este es el código:

Código PHP:
Ver original
  1. <?php
  2. function conseguirEtiquetas($texto){
  3.  
  4.     //separamos la cadena de texto por espacios
  5.     $separarTexto = explode(" ", $texto);
  6.  
  7.     /* con este foreach lo que hago es que quito las palabras que sean
  8.     de menos de 3 caracteres como lo son las, los, un, una y todas esas */
  9.     foreach($separarTexto as $valor){
  10.         $caracteres = strlen($valor); // cuento el numero de caracteres
  11.         if($caracteres > '3'){ // verifico que sea mayo que 3
  12.             $etiquetas[] = $valor; // agrego la palabra al array etiquetas si es mayor que 3
  13.         }  
  14.     }
  15. // pasamos todos las palabras que existan dentro del array a minusculas
  16. $etiquetas = unserialize(strtolower(serialize($etiquetas)));
  17.  
  18. /* defino los arrays para las palabras que no deben estar dentro
  19. de las etiquetas utilice articulos y preposiciones del idioma español
  20. pueden colocar mas palabras o lo que quieran dentro de los arrays para
  21. que las palabras sean eliminadas del resultado final */
  22. $articulosPreposiciones = array(
  23.     "articulos" => array('unos', 'unas', 'este','estos', 'esos', 'aquel', 'aquellos', 'esta', 'estas', 'esas', 'aquella', 'aquellas', 'éste', 'éstos', 'ésos', 'aquél', 'aquéllos', 'ésta', 'éstas', 'ésas', 'aquélla', 'aquéllas'),
  24.     "preposiciones" => array('ante', 'bajo', 'cabe', 'desde', 'contra', 'entre', 'hacia', 'hasta', 'para', 'según', 'segun', 'sobre', 'tras')
  25. );
  26.  
  27. /*- utilizo la funcion de PHP array_dif para que me compare las palabras
  28. con las preposiciones y los articulos y me devuelva solo lo que en
  29. realidad necesitamos, osea las palabras que merecen ser etiquetas */
  30. $resultado = array_diff($etiquetas, $articulosPreposiciones['articulos'], $articulosPreposiciones['preposiciones']);
  31.  
  32. // retorno el resultado
  33. return $resultado;
  34. }
  35.  
  36. /* UTILIZANDO LA FUNCION */
  37.  
  38. $probando = "Este es un texto muy largo que quiero ver si funciona";
  39. $etiquetas = conseguirEtiquetas($probando);
  40. print_r($etiquetas); // imprime Array ( [1] => texto [2] => largo [3] => quiero [4] => funciona )
  41. ?>

Si alguien quiere meterle la mano, o quiere por ejemplo hacer algun comentario o arreglo pues BIENVENIDO SEA...

Espero que les ayude en sus desarrollos.

ATT: Juan Esteban
__________________
Por que existe gente que no agradece después de que se le ha brindado tiempo y ayuda ???
  #2 (permalink)  
Antiguo 19/07/2011, 15:57
 
Fecha de Ingreso: agosto-2010
Ubicación: Tenerife
Mensajes: 893
Antigüedad: 13 años, 7 meses
Puntos: 202
Respuesta: [APORTE] Función extraer etiquetas cadena de texto usando artículos y prep

Gracias por compartir. +K

Un par de puntos:

-Eliminas palabras que ortográficamente no son correctas como por ejemplo "aquéllas"

-Te faltan preposiciones importantes como DE

- Los advervios y pronombres también deberían sustraerse de la cadena

-Lo que llamas artículos no lo son determinates artículos, los cuales además faltan: (el, la, lo, los, las).
En conclusión te faltan y no son lo que nombras, no los citaré todos, pero te quedan unos cuantos.

Preposiciones:
http://es.wikipedia.org/wiki/Preposici%C3%B3n

Determinantes:
http://es.wikipedia.org/wiki/Determi...%C3%ADstica%29

Saludos.
__________________
Pensaba que internet era una gran biblioteca de sabiduría, hasta que comprendí que un libro no puede tener mil páginas llenas de faltas de ortografía... :(

Última edición por IEKK; 19/07/2011 a las 16:07
  #3 (permalink)  
Antiguo 19/07/2011, 17:01
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: [APORTE] Función extraer etiquetas cadena de texto usando artículos y prep

Muy bueno me gustó mucho, hice una versión, se puede mejorar un poco más pero es lo que pude hacer rapido
Código PHP:
Ver original
  1. <?php
  2. function tags($string, $encoding = 'ISO-8859-1'){
  3.     $string = trim(strip_tags(html_entity_decode(urldecode($string))));
  4.     if(empty($string)){ return false; }
  5.  
  6.     $extras = array(
  7.         'p'=>array('ante', 'bajo', 'con', 'contra', 'desde', 'durante', 'entre',
  8.                    'hacia', 'hasta', 'mediante', 'para', 'por', 'pro', 'segun',
  9.                    'sin', 'sobre', 'tras', 'via'
  10.         ),
  11.         'a'=>array('los', 'las', 'una', 'unos', 'unas', 'este', 'estos', 'ese',
  12.                    'esos', 'aquel', 'aquellos', 'esta', 'estas', 'esa', 'esas',
  13.                    'aquella', 'aquellas', 'usted', 'nosotros', 'vosotros',
  14.                    'ustedes', 'nos', 'les', 'nuestro', 'nuestra', 'vuestro',
  15.                    'vuestra', 'mis', 'tus', 'sus', 'nuestros', 'nuestras',
  16.                    'vuestros', 'vuestras'
  17.         ),
  18.         'o'=>array('esto', 'que'),
  19.     );
  20.  
  21.     $string = strtr(mb_strtolower((string)$string, $encoding),
  22.                     'âàåáäèéêëïîìíôöòóúûüùñ',
  23.                     'aaaaaeeeeiiiioooouuuun'
  24.     );
  25.     if(preg_match_all('/\pL{3,}/s', $string, $m)){
  26.         $m = array_diff(array_unique($m[0]), $extras['p'], $extras['a'], $extras['o']);
  27.     }
  28.     return $m;
  29. }
  30. print_r(tags('Esto es un prueba, NO IMPORTA EL TAMAÑO se supone que muestre toda la prueba y únicas palabras.'));
En las preposiciones no le coloqué los acentos porque los quito antes de verificar si se encuentra.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #4 (permalink)  
Antiguo 20/07/2011, 05:33
Avatar de jotaincubus  
Fecha de Ingreso: mayo-2005
Ubicación: Medellin - Colombia
Mensajes: 1.797
Antigüedad: 18 años, 10 meses
Puntos: 394
Respuesta: [APORTE] Función extraer etiquetas cadena de texto usando artículos y prep

Cita:
Iniciado por IEKK Ver Mensaje
-Te faltan preposiciones importantes como DE

-Lo que llamas artículos no lo son determinates artículos, los cuales además faltan: (el, la, lo, los, las).
En conclusión te faltan y no son lo que nombras, no los citaré todos, pero te quedan unos cuantos.
Hola amigo muchas gracias por tu información, la verdad no coloque algunas cosas porque estas serán eliminadas con el foreach... si te fijas este solo tomas las palabras que sean mayores de 3 letras, entonces no vi la necesidad de colocar esos tipos de artículos en los array de comparación.

De todas formas esta función es sencilla de modificar, solo seria colocar la palabra que se quiere eliminar en uno de los arrays y esta sera sacada de la cadena, solo la hice como ejemplo para que la gente tenga una base de para poder trabajar.

Muchas gracias por tu aporte.
__________________
Por que existe gente que no agradece después de que se le ha brindado tiempo y ayuda ???
  #5 (permalink)  
Antiguo 20/07/2011, 05:38
Avatar de jotaincubus  
Fecha de Ingreso: mayo-2005
Ubicación: Medellin - Colombia
Mensajes: 1.797
Antigüedad: 18 años, 10 meses
Puntos: 394
Respuesta: [APORTE] Función extraer etiquetas cadena de texto usando artículos y prep

Cita:
Muy bueno me gustó mucho, hice una versión, se puede mejorar un poco más pero es lo que pude hacer rapido
O.o este esta muy bueno, muchas gracias por mejorarlo abimaelrc es un gusto que le puedas hacer una mejora tan sustancial al código que plantee.

Una pregunta: No es mejor sacar las palabras que tengan menos de 3 caracteres ? así como lo hace foros del web ?
__________________
Por que existe gente que no agradece después de que se le ha brindado tiempo y ayuda ???
  #6 (permalink)  
Antiguo 20/07/2011, 05:47
Avatar de jotaincubus  
Fecha de Ingreso: mayo-2005
Ubicación: Medellin - Colombia
Mensajes: 1.797
Antigüedad: 18 años, 10 meses
Puntos: 394
Respuesta: [APORTE] Función extraer etiquetas cadena de texto usando artículos y prep

Cita:
Una pregunta: No es mejor sacar las palabras que tengan menos de 3 caracteres ? así como lo hace foros del web ?
Estuve pensando y creo que es un error lo que yo planteo de sacar las palabras de menos de 3 caracteres.

Si la persona coloca "Curso de PHP" entonces PHP seria sacado de la cadena, quedando solo Curso entonces seria un grave error sacar esa etiqueta.

En este caso seria mejor manejar los artículos como (los, las, les... etc) en el array artículos y eliminar el foreach.

De todas formas esperare mas opiniones para ver como podemos mejorar el código.

Gracias.
__________________
Por que existe gente que no agradece después de que se le ha brindado tiempo y ayuda ???
  #7 (permalink)  
Antiguo 20/07/2011, 05:49
 
Fecha de Ingreso: agosto-2010
Ubicación: Tenerife
Mensajes: 893
Antigüedad: 13 años, 7 meses
Puntos: 202
Respuesta: [APORTE] Función extraer etiquetas cadena de texto usando artículos y prep

Cita:
Iniciado por jotaincubus Ver Mensaje
Hola amigo muchas gracias por tu información, la verdad no coloque algunas cosas porque estas serán eliminadas con el foreach... si te fijas este solo tomas las palabras que sean mayores de 3 letras, entonces no vi la necesidad de colocar esos tipos de artículos en los array de comparación.

De todas formas esta función es sencilla de modificar, solo seria colocar la palabra que se quiere eliminar en uno de los arrays y esta sera sacada de la cadena, solo la hice como ejemplo para que la gente tenga una base de para poder trabajar.

Muchas gracias por tu aporte.
Sí me he fijado que quitan palabras menores de 3 letras, pero ¿Por qué?
Hay muchas palabras que podrían ser tags de 3 letras.
Sin ir muy lejos: php(aunque son siglas), sol, ajo... y tantísimas más.

Por eso los ejemplos que había visto eliminaban por tipo de palabra no por longitud, lo comentaba por eso
__________________
Pensaba que internet era una gran biblioteca de sabiduría, hasta que comprendí que un libro no puede tener mil páginas llenas de faltas de ortografía... :(
  #8 (permalink)  
Antiguo 20/07/2011, 07:57
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: [APORTE] Función extraer etiquetas cadena de texto usando artículos y prep

Muy buen aporte, agregado a los aportes
  #9 (permalink)  
Antiguo 21/07/2011, 10:30
Avatar de jotaincubus  
Fecha de Ingreso: mayo-2005
Ubicación: Medellin - Colombia
Mensajes: 1.797
Antigüedad: 18 años, 10 meses
Puntos: 394
Respuesta: [APORTE] Función extraer etiquetas cadena de texto usando artículos y prep

Buen día, decidí utilizar el código aportado por abimaelrc y lo coloque en mi proyecto, y O.o sorpresa, yo utilizo UTF-8 en mis paginas y en mi base de datos, entonces no me funciono con los caracteres especiales como son tildes, diéresis y esas cosas.

Asi, que utilie la codificacion UTF-8 en:

Código PHP:
Ver original
  1. function tags($string, $encoding = 'UTF-8'){

Pero resulta que no me funcionaba, después realice pruebas y me encontré que strtr de PHP era el que ponía el problema a la hora de trabajar con UTF-8

Me toco hacerle unos cambios al codigo de nuestro amigo para que me funcionara con UTF-8.

Si alguien tiene una mejor forma de arreglarlo pues estare muy atento y agradecido.

Código PHP:
Ver original
  1. <?php
  2.     function tags($string, $encoding = 'UTF-8'){
  3.         $string = trim(strip_tags(html_entity_decode(urldecode($string))));
  4.         if(empty($string)){ return false; }
  5.      
  6.         $extras = array(
  7.             'p'=>array('ante', 'bajo', 'con', 'contra', 'desde', 'durante', 'entre',
  8.                        'hacia', 'hasta', 'mediante', 'para', 'por', 'pro', 'segun',
  9.                        'sin', 'sobre', 'tras', 'via'
  10.             ),
  11.             'a'=>array('los', 'las', 'una', 'unos', 'unas', 'este', 'estos', 'ese',
  12.                        'esos', 'aquel', 'aquellos', 'esta', 'estas', 'esa', 'esas',
  13.                        'aquella', 'aquellas', 'usted', 'nosotros', 'vosotros',
  14.                        'ustedes', 'nos', 'les', 'nuestro', 'nuestra', 'vuestro',
  15.                        'vuestra', 'mis', 'tus', 'sus', 'nuestros', 'nuestras',
  16.                        'vuestros', 'vuestras'
  17.             ),
  18.             'o'=>array('esto', 'que'),
  19.         );     
  20.        
  21.         $string = mb_strtolower((string)$string, $encoding);
  22.         $string = utf8_decode($string);
  23.         $string = strtr($string,
  24.                         utf8_decode(âàåáäèéêëïîìíôöòóúûüùñ),
  25.                         'aaaaaeeeeiiiioooouuuun'
  26.         );
  27.         if(preg_match_all('/\pL{3,}/s', $string, $m)){
  28.             $m = array_diff(array_unique($m[0]), $extras['p'], $extras['a'], $extras['o']);
  29.         }
  30.         return $m;
  31.     }
  32. ?>

Espero le sirva a alguien.
__________________
Por que existe gente que no agradece después de que se le ha brindado tiempo y ayuda ???
  #10 (permalink)  
Antiguo 21/07/2011, 10:51
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: [APORTE] Función extraer etiquetas cadena de texto usando artículos y prep

Si le estas colocando ut8_decode es porque el archivo no esta codificado como tal. Codifica el archivo a utf8 sin BOM y dejanos saber si funciona sin el utf8_decode.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #11 (permalink)  
Antiguo 21/07/2011, 12:35
Avatar de jotaincubus  
Fecha de Ingreso: mayo-2005
Ubicación: Medellin - Colombia
Mensajes: 1.797
Antigüedad: 18 años, 10 meses
Puntos: 394
Respuesta: [APORTE] Función extraer etiquetas cadena de texto usando artículos y prep

Cita:
Iniciado por abimaelrc Ver Mensaje
Si le estas colocando ut8_decode es porque el archivo no esta codificado como tal. Codifica el archivo a utf8 sin BOM y dejanos saber si funciona sin el utf8_decode.
Hola, muchas gracias por responder, mira que no tengo nada de nada raro en la pagina, solo tengo el meta asi:

Código HTML:
Ver original
  1. <meta http-equiv="Content-Type" content="text/hatml; charset=utf-8" />

Y dentro de las etiquetas <body></body> tengo la función tal cual la desarrollaste, entonces si le hago un echo a $m me sale mal si le colocaba UTF-8 entonces me toco hacerle el decode.

Pero si en el juego de caracteres colocaba esto:

Código HTML:
Ver original
  1. <meta http-equiv="Content-Type" content="text/hatml; charset=ISO-8859-1" />

Si que funcionaba perfecto el codigo.

Pero si coloco en el body una palabra cualquiera como "Niño" me aparece muy bien la palabra cuando coloco el UTF-8.

No se que este pasando la verdad.
__________________
Por que existe gente que no agradece después de que se le ha brindado tiempo y ayuda ???
  #12 (permalink)  
Antiguo 21/07/2011, 12:38
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: [APORTE] Función extraer etiquetas cadena de texto usando artículos y prep

Como te indiqué el archivo tiene que ser utf8 sin BOM, pero el archivo no que dentro del archivo ingreses ese código, si no que el archivo tiene que ser utf8 sin BOM.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #13 (permalink)  
Antiguo 21/07/2011, 12:44
Avatar de jotaincubus  
Fecha de Ingreso: mayo-2005
Ubicación: Medellin - Colombia
Mensajes: 1.797
Antigüedad: 18 años, 10 meses
Puntos: 394
Respuesta: [APORTE] Función extraer etiquetas cadena de texto usando artículos y prep

Cita:
Iniciado por abimaelrc Ver Mensaje
Como te indiqué el archivo tiene que ser utf8 sin BOM, pero el archivo no que dentro del archivo ingreses ese código, si no que el archivo tiene que ser utf8 sin BOM.
Hola, verifique con el NOTEPAD++ y en la parte codificación dice claritico "Codificar en UTF-8 sin BOM"

Raro por que solo me esta pasando con la letra "ñ" las tildes funcionan bien.
__________________
Por que existe gente que no agradece después de que se le ha brindado tiempo y ayuda ???

Última edición por jotaincubus; 21/07/2011 a las 12:50 Razón: Mas informacion

Etiquetas: articulos, español, etiquetas, preposiciones
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 4 personas




La zona horaria es GMT -6. Ahora son las 09:30.