• Publicidad

Los que compraron este producto... ¿cómo se hace?

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Los que compraron este producto... ¿cómo se hace?

Notapor luisbal » 2008-11-02 22:34 @982

Amigos:

Todos conocen la opción que tienen las tiendas online que dicen "LOS QUE COMPRARON ESTE PRODUCTO TAMBIÉN COMPRARON..". Es decir, de acuerdo al producto que eliges, te muestra las compras de otros clientes quienes incluyeron en sus compras el producto que tu has elegido.

¿Mi pregunta es cómo se hace?

Mi sistema guarda cada orden de compra de los clientes en un archivo texto llamado "ordenX.txt" que coincide con el número de la orden, dentro del directorio ORDERS. La data tiene este formato:

Cada archivo contiene una linea como esta:
Código: Seleccionar todo
orden_1|nombre|direccion|etc|id_1~producto1~precio1~etc1%%id_2~producto2~precio2~etc%%|direccionentrega|destinatario|etc


y es salvado con el número de la orden:
Código: Seleccionar todo
orden1.txt
orden2.txt
orden3.txt
etc. etc.


Lo que quiero es que al darle por ejemplo la variable ID_1 (o sea la referencia del producto 1) el sistema:

1. abra uno a uno los archivos que se encuentran dentro de ORDERS
2. examine si dentro de c/u se encuentra el producto ID_1
3. Si lo encuentra, reconocer los otros productos que encontró en ese mismo archivo
4. arrojarme un listado de todos los productos que encontró en todos los archivos que leyó.

No se si está claro. Me parece que es muy fácil, pero la verdad se muy poco de Perl, solo lo básico.

Agradezco de antemano la ayuda que me puedan proporcionar.
luisbal
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2008-09-12 09:36 @442

Publicidad

Notapor explorer » 2008-11-03 04:37 @234

Pues sí, es fácil. Aquí te mando una respuesta correspondiente al foro Intermedio:

1.- Para recorrer los ficheros te vale con usar opendir(), readdir() y closedir()
2.- Para abrir y leer los correos, te vale con open(), <> y close().
3.- Con una expresión regular sabemos si el fichero contiene el ID_1 del producto
4.- En caso de ser así, guardamos la lista de todos los productos en la lista de productos encontrados, que se puede realizar con un hash
5.- Listar los productos encontrados, que serán las claves de ese hash.

De todos modos, el funcionamiento no es exactamente así. Los sistemas de recomendación no se basan en coincidencias exactas, sino en coincidencias de patrones de comportamiento. Es decir, que mientras que es cierto que los usuarios tienden a reproducir las mismas compras, lo más cierto es que tienden a reproducir los mismos tipos de compras (si un cliente compra libros de Perl, es más probable que siga comprando libros de Perl -> libros de Lenguajes Informáticos -> libros de Informática -> libros de ciencia ficción...). Esto se puede realizar sumando las categorías a las que pertenecen las compras realizadas de usuarios anteriores.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Sobre el tema...

Notapor luisbal » 2008-11-03 18:40 @819

Estimado amigo:
Muchas gracias, pero creo que debí colocar la consulta en principiantes. Sucede que no sé mucho sobre Perl (casi nada).
Yo he tratado de hacer lo que dices, pero llego hasta el momento de abrir el archivo y revisarlo.

Es decir:
Reviso para ver en qué archivos se encuentra el producto.
Una vez que encuentro los archivos donde se encuentra ese producto...
Lo que quiero es que me liste los OTROS productos que se encuentran en ese archivo...
Y me devuelva un listado general (sin incluir el producto que estábamos buscando y SIN QUE LA LISTA SE REPITA (porque obviamente habrá otros productos que los clientes han comprado repetidamente).

Si tu respuesta fuera para principiante te lo agradeceré.
luisbal
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2008-09-12 09:36 @442

Notapor Jenda » 2008-11-03 18:42 @821

Si tuvieras los datos en una base de datos (al menos DBI+DBD::SQLite ... no hay que instalar mas que los módulos) podrías hacerlo simplemente con SQL. Algo así

Sintáxis: [ Descargar ] [ Ocultar ]
Using sql Syntax Highlighting
SELECT id, Nombre
 FROM Productos
 JOIN (
        SELECT TOP 10 OP2.Producto_id, count(*) AS Cnt
         FROM OrdenProductos AS OP1
         JOIN Ordenes AS O1 ON O1.id = OP1.Orden_id
         JOIN Ordenes AS O2 ON O2.cliente_id = O1.cliente_id
         JOIN OrdenProductos AS OP2 ON OP2.Orden_id = O2.id
        WHERE O1.Producto_id = 123456
        GROUP BY OP2.Producto_id
        ORDER BY Cnt
) AS Cnts ON Cnts.Producto_id = Productos.Id
ORDER BY Cnt
 
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


con tablas:

Productos
id, nombre, ...

Ordenes
id, cliente_id, ...

OrdenProductos
Orden_id, Producto_id, Numero, ...


Aun si no lo haces, aprende a trabajar con BDs y guarda los datos allí. Es casi siempre mejor.
-------------------------------------------------------
- Estoy aquí para practicar español. Si te ayudó mi respuesta ayudame con un mensaje privado sobre mis faltas por favor. Seguramente habrá muchas :-)
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa

Notapor explorer » 2008-11-04 06:19 @304

Además de secundar el consejo de Jenda, una posible solución sería:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

my $ID_a_buscar = shift @ARGV
    or do {
        warn "Uso: $0 <id producto a buscar>\n";
        exit 1;
    }
    ;

my %productos_relaccionados;

for my $fichero_de_ordenes ( glob('ORDERS/*.txt') ) {

    open  FICHERO, q{<}, $fichero_de_ordenes
        or do {
            warn "No puedo abrir el fichero $fichero_de_ordenes: $!\n";
            next;
        }
        ;

    my $orden_de_compra = <FICHERO>;

    close FICHERO;

    my $productos_comprados      = (split q{\|}, $orden_de_compra)[4];

    my %productos_comprados;
    while ( $productos_comprados =~ m/(.+?)~.+?%%/simog ) {
        $productos_comprados{$1}++;
    }

    ## Saltamos si en los $productos_comprados no existe el $ID_a_buscar
    next if not exists $productos_comprados{$ID_a_buscar};

    ## Recordamos todos los productos
    for my $ID_producto_comprado ( keys %productos_comprados ) {
        $productos_relaccionados{$ID_producto_comprado}++;
    }
}

for my      $ID_producto_relaccionado (sort keys %productos_relaccionados ) {
    next if $ID_producto_relaccionado eq $ID_a_buscar;
    print  "$ID_producto_relaccionado\n";
}

__END__
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Usamos un hash para recordar qué productos están relacionados con el que buscamos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 23 invitados

cron