Foros del Web » Programando para Internet » PHP »

Definir palabras técnicas PHP + JS

Estas en el tema de Definir palabras técnicas PHP + JS en el foro de PHP en Foros del Web. Hola a todos. Tengo una tabla en mi base de datos que almacena noticias, la estructura es: id (INT 6) titulo (VARCHAR 255) textonoticia (TEXT) ...
  #1 (permalink)  
Antiguo 22/11/2004, 17:57
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 13 años, 2 meses
Puntos: 5
Definir palabras técnicas PHP + JS

Hola a todos.

Tengo una tabla en mi base de datos que almacena noticias, la estructura es:

id (INT 6)
titulo (VARCHAR 255)
textonoticia (TEXT)
fecha (DATE)

Y tengo una tabla que almacena muchas definiciones (DEFINICIONES) de palabras técnicas:

id (INT 6)
palabra (VARCHAR 40)
definicion (TEXT)

Lo que quiero hacer, es que al mostrar todas mis noticias en la página principal, PHP procese el texto de la noticia (palabra por palabra) y busque en ella las palabras técnicas que existan en la tabla DEFINICIONES, de tal forma que con JavaScript, al pasar el mouse sobre dicha palabra aparezca la definición.

La verdad me gustaría que me ayudaran a buscar la mejor forma de hacer esto, quizás una consulta SQL sería muy pesada. ¿Qué me sugieren?

Un saludo y gracias de antemano!
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #2 (permalink)  
Antiguo 23/11/2004, 06:15
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 13 años, 2 meses
Puntos: 5
Muy disimuladamente, subo el post a ver si alguien me ayuda.
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #3 (permalink)  
Antiguo 23/11/2004, 06:38
 
Fecha de Ingreso: junio-2004
Mensajes: 84
Antigüedad: 13 años, 5 meses
Puntos: 0
te recomiendo hacer lo siguiente:
Código PHP:
<?
$texto
// contiene el texto de la noticia.
$definiciones
/* Array con la siguiente estructura
$definiciones["palabra_clave"] = "Codigo JS";
*/

/* De esta forma remplazas todas las apariciones de una definicion, por el codgio JS correspondiente */
foreach ($definiciones as $definion => $js)
      
$texto str_replace ($definicion,$js,$texto)

?>
No es la solucion mas eficiente, pero.. resuelve tu problema.
__________________
Repositorio de funciones utiles para programadores y administradores
http://www.particle.com.ar

Última edición por eqsoftware; 23/11/2004 a las 06:39
  #4 (permalink)  
Antiguo 23/11/2004, 06:55
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 13 años, 2 meses
Puntos: 5
Ok, entonces al inicio de ese script, deberá almacenar todas las definiciones con su respectiva palabra clave en un array. Supongamos que tenemos 1000 definiciones (son definiciones cortas, no más de 200 chars) ¿eso no realentizaría la carga de la página y sobrecargaría la BD?

La verdad la solución que propones me parece bastante eficiente y fácil. ¿Qué dicen los demás?
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #5 (permalink)  
Antiguo 23/11/2004, 08:21
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Desde SQL podrías obtener las palabras que no se repiten y están en tu BD para que sobre ese grupo reducido de terminos .. obtengas su descripción .. así que en una página típica que sólo aparecen N terminos .. sólo tendras un array de javascript con esos N terminos para esa página .. Recordemos que las páginas las generas dinámicamente así que no es necesario y será más optimo que intentes hacerlo así que no generar ese "array" de javascript con esas 1000 definiciones * su tamaño.

No sé muy bien como afrontar la sentencia SQL (o sentencias) necesaria para obtener esas palabras que hay en el texto .. pero podría usar las técnicas de busqueda FULL Text search (busqueda de texto completo) que describe este tutorial:

http://www.mysql-hispano.org/page.php?id=15

También podrías preguntar en el foro de Base de datos al respecto ya que pueden existir soluciones PHP+SQL o más SQL que PHP.

Un saludo,
  #6 (permalink)  
Antiguo 23/11/2004, 20:15
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 13 años, 2 meses
Puntos: 5
Cluster no entendí esta parte de tu mensaje donde dices:

"Recordemos que las páginas las generas dinámicamente así que no es necesario y será más optimo que intentes hacerlo así que no generar ese "array" de javascript con esas 1000 definiciones * su tamaño."

¿Es más optimo tener el array con las 1000 definiciones? ¿o es más optimo hacer la super consulta SQL que mencionas?

No se que tan relativos serían los procesos. Realizar esa consulta SQL de comparación que mencionas tomará tiempo y cargará el servidor. Almacenar todas las definiciones en un array también implica una carga al servidor.

¿Qué me dicen?
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #7 (permalink)  
Antiguo 24/11/2004, 10:04
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 13 años
Puntos: 34
Creo que el proceso deberá hacerlo php y no sql, por mas que uses pl en sql server , y la manera es usar vectores.
Había pensado en hacer dos vectores, uno con las key, o otro con el texto y luego con array_search y buscando en el foreach del texto, pero me parece que el metodo de eqsoftware es mejor.
  #8 (permalink)  
Antiguo 24/11/2004, 13:20
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Pero .. cuando dices "array" .. es lo mismo que tener tus datos en una tabla de tu BD y consultarla para obtener esas "1000" definiciones * espacio que ocupe su descripción ... cuando realmente en cierta página que generas (con tu "textonoticia") ¿cuantas de esas 1000 definiciones podrías tener promédio?

A eso es lo que me refiero .. La consulta SQL de esas características tal vez no es tan pesada para tu BD .. es cosa de probarlo. Todavía desconozco que tipo de sentencia SQL tendrías que usar para tal fin.

Una vez que tienes ese margen -reducido- de definiciones que corresponden para esa página generada .. entronces aplicas él str_replace() bajo el bucle que lea las definiciones obtenidas de tu consulta SQL.

Un saludo,
  #9 (permalink)  
Antiguo 24/11/2004, 17:51
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 13 años, 2 meses
Puntos: 5
En el foro de SQL, comentan que para lograr eso el motor SQL debe hacer X cantidad de querys lo cual seria un desperdicio de recursos. Y si nos ponemos a ver, comparar cada noticia, cada palabra, con x cantidad de terminos, es un proceso bastante largo.
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #10 (permalink)  
Antiguo 08/12/2004, 09:10
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 13 años, 2 meses
Puntos: 5
Probando y probando el código que me proporcionaron me he encontrado con un pequeño fallo que no deja funcionar bien al script... y la verdad no se me ocurre nada para solucionarlo. He aqui el code que uso:

Código PHP:
// llenamos el array en base a la base de datos. Tenemos el array con todas las definiciones y palabras claves.
$ssql="SELECT * FROM definitions";
$rs=mysql_query($ssql);
while(
$row=mysql_fetch_array($rs)){
  
$definitions[$row['keyword']]=$row['textD'];
}

//Ahora buscamos en el texto de la noticia la palabra clave y lo reemplazamos por su codigo en HTML y la definición.
foreach($definitions as $keyword => $text){
  
$textonoticia=str_replace($keyword,"<acronym title=\"$text\">$keyword</acronym>",$textonoticia);

El problema, es que si en mi tabla "definitions" existe un término llamado "EFI", entonces cuando se hace el str_replace() se reemplazan pedazos de palabras como "efimeros", "eficaz", etc...

¿Qué puedo hacer para que esto no ocurra? Un saludo!
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #11 (permalink)  
Antiguo 08/12/2004, 09:41
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 15 años
Puntos: 1
Pues mira

Esta es mi solución a tu problema, palabraclave es la columna que contiene el elemento que debera ser mostrado al pasar el mouse sobre la palabra y $palabrastexto es el texto previamente sacado de la BDatos, o sea, el texto original. Luego es solo hacer esto
Código PHP:
$ssql="SELECT * FROM definitions WHERE palabraclave LIKE '".$palabrastexto."'";
$rs=mysql_query($ssql);
while(
$row=mysql_fetch_array($rs)){
  echo 
"<span class='info' title='".$row['palabraclave' ]."'>".$texto."</span>";

tambien puedes usar el FULLTEXT como dice Cluster. Si lo que quieres hacer es poner algo así como un ALT para las imágenes entonces no sería un str_replace ya que este remplaza el texto encontrado por el que tu quieres , sino con un elemento SPAN de HTML lo puedes hacer.
Salu2
__________________
Ing. Reynier Pérez Mira
  #12 (permalink)  
Antiguo 08/12/2004, 09:49
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 13 años, 2 meses
Puntos: 5
Las descripciones solo serán para palabras, no imágenes. La solución que planteas no es fiable, debido a que hay que hacer muchísimas consultas SQL para agregarle span a cada palabra clave del texto de la noticia, teniendo en cuenta que son miles. Sin embargo, mil gracias!

Estuvimos entre todos estudiando las distintas posibilidades, en conjunto con el foro de Bases de datos, y todos coinciden en que la forma más eficaz es llenar un array con las definiciones y palabras claves, y luego con str_replace() buscar en el texto las que coincidan.

Eso funciona perfectamente, pero, el problema esta en que str_replace() esta tomando pedazos de palabras, y yo solo quiero que tome palabras completas.

Un saludo!
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
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




La zona horaria es GMT -6. Ahora son las 00:33.