Foros del Web » Programando para Internet » PHP »

Comparacion de mayor similitu de cadenas

Estas en el tema de Comparacion de mayor similitu de cadenas en el foro de PHP en Foros del Web. hola que tal, estoy tratando de hacer una funcion que me compare cadenas, exactamente direcciones domiciliarias, ejemplo: Código PHP: <?php $dir1  =  "AVENIDA FAUCETT 365 STAND 5 URB=MARANGA" ; $dir2  ...
  #1 (permalink)  
Antiguo 07/04/2009, 16:00
 
Fecha de Ingreso: febrero-2006
Mensajes: 44
Antigüedad: 18 años, 1 mes
Puntos: 0
Comparacion de mayor similitu de cadenas

hola que tal, estoy tratando de hacer una funcion que me compare cadenas, exactamente direcciones domiciliarias, ejemplo:

Código PHP:
<?php
$dir1 
"AVENIDA FAUCETT 365 STAND 5 URB=MARANGA";
$dir2 "AV FAUCETT 365 STAND 5 URB. MARANGA";
?>
usando mi criterio pense en usar
Código PHP:
function OptimaDir ($cadena){
    
$cadena strtoupper($cadena)
    
$cadena str_replace (" AVENIDA "" "$cadena );
    
$cadena str_replace (" AV. "" "$cadena ); 
    
$cadena str_replace (" AV "" "$cadena ); 
    
$cadena str_replace (" URBANIZACION "" "$cadena );
    
$cadena str_replace (" URBANIZ. "," ",$cadena);
    
$cadena str_replace (" URB="" "$cadena );
    
$cadena str_replace (" URB."" "$cadena );
    
$cadena str_replace ("URB="" "$cadena );
    
$cadena str_replace (" URB "" "$cadena ); 
    
$cadena str_replace (" CALLE "" "$cadena );
    
$cadena str_replace (" CA."" "$cadena );
    
$cadena str_replace (" CA "" "$cadena );
    
$cadena str_replace (" CL "" "$cadena ); 
    
$cadena str_replace (" PASAJE "" "$cadena ); 
    
$cadena str_replace (" PJ."" "$cadena ); 
    
$cadena str_replace (" PJ "" "$cadena ); 
    
$cadena str_replace (" ASOCIACION "" "$cadena ); 
    
$cadena str_replace (" ASOC. "" "$cadena ); 
    
$cadena str_replace (" ASOC "" "$cadena ); 
    
$cadena str_replace (" ASENTAMIENTO HUMANO "" "$cadena ); 
    
$cadena str_replace (" A.HUMANO "" "$cadena );
    
$cadena str_replace (" AA.HH. "" "$cadena ); 
    
$cadena str_replace (" AAHH "" "$cadena );
    
$cadena str_replace (" AH "" "$cadena );
    
$cadena str_replace (" NUMERO "" "$cadena );
    
$cadena str_replace ("LOTE="" "$cadena );
    
$cadena str_replace (" LOTE "" "$cadena );
    
$cadena str_replace (" L.T. "" "$cadena );
    
$cadena str_replace (" LT."" "$cadena );
    
$cadena str_replace (" LT. "" "$cadena );
    
$cadena str_replace (" LT "" "$cadena );
    
$cadena str_replace (" LT-"" "$cadena );
    
$cadena str_replace (" LT="" "$cadena );
    
$cadena str_replace (" INTERIOR "" "$cadena );
    
$cadena str_replace (" INT. "" "$cadena );
    
$cadena str_replace (" INT "" "$cadena );
    
$cadena str_replace (" MZ. "" "$cadena );
    
$cadena str_replace (" MZ-"" "$cadena );
    
$cadena str_replace (" MZ="" "$cadena );
    
$cadena str_replace (" MZ "" "$cadena );
    
$cadena str_replace (" JIRON "" "$cadena );
    
$cadena str_replace (" JR. "" "$cadena );
    
$cadena str_replace (" JR "" "$cadena );
    
$cadena str_replace (" DEP. "" "$cadena );
    
$cadena str_replace (" DEP "" "$cadena );
    
$cadena str_replace (" DP "" "$cadena );
    
$cadena str_replace (" P-"" "$cadena );
    
$cadena str_replace (" P "" ",$cadena);
    return 
$cadena;

para quitar las palabras comunes o preestablecidas como URBANIZACION = URB. = URB y despues comparar asi
Código PHP:
if(OptimaDir($dir1) == OptimaDir($dir2));
echo 
cadenas iguales;

pero necesito hallar una forma mas optima en la cual contemple una variacion minima de caracteres, agradeceria mucho la ayuda
  #2 (permalink)  
Antiguo 07/04/2009, 17:03
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: Comparacion de mayor similitu de cadenas

Tema trasladado desde PHP Orientado a Objetos.
  #3 (permalink)  
Antiguo 07/04/2009, 17:13
Avatar de Genetix  
Fecha de Ingreso: febrero-2002
Ubicación: Lima - Perú
Mensajes: 1.600
Antigüedad: 22 años, 2 meses
Puntos: 45
Respuesta: Comparacion de mayor similitu de cadenas

Hola
Puedes usar la función similar_text para que te muestre la similitud
http://www.php.net/manual/es/function.similar-text.php

Saludos!
__________________
"El conocimiento nos hace responsables."
twitter: @benjamingb
blog personal: http://codigolinea.com
ZF Manual en español http://manual.zfdes.com
  #4 (permalink)  
Antiguo 07/04/2009, 17:26
 
Fecha de Ingreso: enero-2008
Mensajes: 132
Antigüedad: 16 años, 2 meses
Puntos: 6
Respuesta: Comparacion de mayor similitu de cadenas

Esta puede funcionar para lo que necesitas...devuelve el % de similitud

Segun yo lo que hace es

1. Limpiar la cadena dejando solamente letras
2. Eliminando los espacios dobles entre las palabras
3. Compara cada palabra del array mas largo en el mas pequeño y va contando las coincidencias.

Código PHP:

function str_compare($str1$str2) {
    
$count 0;
    
    
$str1 ereg_replace("[^a-z]"' 'strtolower($str1));
    while(
strstr($str1'  ')) {
        
$str1 str_replace('  '' '$str1);
    }
    
$str1 explode(' '$str1);
    
    
$str2 ereg_replace("[^a-z]"' 'strtolower($str2));
    while(
strstr($str2'  ')) {
        
$str2 str_replace('  '' '$str2);
    }
    
$str2 explode(' '$str2);
    
    if(
count($str1)<count($str2)) {
        
$tmp $str1;
        
$str1 $str2;
        
$str2 $tmp;
        unset(
$tmp);
    }
    
    for(
$i=0$i<count($str1); $i++) {
        if(
in_array($str1[$i], $str2)) {
            
$count++;
        }
    }
    
    return 
$count/count($str2)*100;

__________________
surfiction.org

Última edición por Surfiction; 07/04/2009 a las 17:34
  #5 (permalink)  
Antiguo 08/04/2009, 12:45
 
Fecha de Ingreso: febrero-2006
Mensajes: 44
Antigüedad: 18 años, 1 mes
Puntos: 0
Respuesta: Comparacion de mayor similitu de cadenas

Muchas gracias por la ayuda, pero se me olvido decirles que las cadenas que se comparan son de 2 dos vectores el primero aproximadamente de 6500 mas o menos que proviene de una consulta y el segundo de 500 a 1400 mas o menos que proviene de otra consulta, y se comparan cuantas del segundo vector se repiten en el primero pero como comente son direcciones, y al ejecutar el escript el tiempo de respuesta es demasiado.

estaba pensando en usar el motor de base de datos crear tablas temporales y ahi insertartar las consultas y hacer un cruce para compararlas. me imagino que sera mas rapido, otra detalle es que mi servidor es un poco antiguo pIV 3.2 y RAM 521mb el presupuesto hasta ahora no cubre para otro, agradeceria un consejo ante esta situacion pq el proceso es demasiado y hace que mi servidor no responda rapido a tras peticiones.
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 20:40.