martes, marzo 17, 2009

Implementando algoritmo de la distancia de Levenshtein en C#

La referencia del algoritmo la pueden encontrar en la siguiente ruta
http://en.wikipedia.org/wiki/Levenshtein_distance, es muy ejemplificante y
los links te llevan a algunas modificaciones que existen sobre el mismo algoritmo.


Un poco de teoria:

La distancia de levenshtein permite calcular diferenciala entre 2 cadenas de caracteres, es decir el minimo numero de
operaciones necesarias para que una palabra s se transforme en una palabra t.
La operaciones que necesarias para que esto ocurra son las siguientes:

Td
aba --------->aa eliminacion

Ti
aa ---------->aba inserccion

Ts
aba ---------> ada sustitucion


¿Que es esto? bueno si tienes la palabra:

1. PERRO ---> PERROS : La distancia es 1 por que la diferencia entre perro y perros es 1 que es (s) la operacion es insercción
2. MOTO ----> FOTO : La distancia es 1 por que la diferencia entre MOTO y FOTO es F la operacion es sustitución


   1:          public int LevenshteinDistance(string s, string t)
   2:          {
   3:              // d is a table with m+1 rows and n+1 columns
   4:              int costo = 0;
   5:              int m = s.Length;
   6:              int n = t.Length;
   7:              int[,] d = new int[m + 1, n + 1];
   8:   
   9:              // Verifica que exista algo que comparar
  10:              if (n == 0) return m;
  11:              if (m == 0) return n;
  12:   
  13:              // Llena la primera columna y la primera fila.
  14:              for (int i = 0; i <= m; d[i, 0] = i++) ;
  15:              for (int j = 0; j <= n; d[0, j] = j++) ;
  16:   
  17:   
  18:              /// recorre la matriz llenando cada unos de los pesos.
  19:              /// i columnas, j renglones
  20:              for (int i = 1; i <= m; i++)
  21:              {
  22:                  // recorre para j
  23:                  for (int j = 1; j <= n; j++)
  24:                  {
  25:                      /// si son iguales en posiciones equidistantes el peso es 0
  26:                      /// de lo contrario el peso suma a uno.
  27:                      /// 
  28:                      costo = (s[i - 1] == t[j - 1]) ? 0 : 1;
  29:                      d[i, j] = System.Math.Min(System.Math.Min(d[i - 1, j] + 1,  //Eliminacion
  30:                          d[i, j - 1] + 1),                                       //Inserccion
  31:                          d[i - 1, j - 1] + costo);                               //Sustitucion
  32:   
  33:                  }
  34:              }
  35:          /// Calculamos el porcentaje de cambios en la palabra.
  36:              if (s.Length > t.Length)
  37:                  porcentaje = ((double)d[m, n] / (double)s.Length);
  38:              else
  39:                  porcentaje = ((double)d[m, n] / (double)t.Length);
  40:              return d[m, n];
  41:          }
  42:   
  43:          double _porcentaje = 0;
  44:   
  45:      

miércoles, abril 30, 2008

Uuuuuy, hace años de esto. No todo ha sido codigo.

Aun no me he ido,
sigo aqui esperando regreses por mi,
esta vez no me rehusare a irme de aqui,
espero pacientemente mi partida por el
obscuro tunel al que me has de llevar,
en medio de esa hermosa luna y grandes
catedrales soy yo quien ahora desea irse
espero pacientemente tu arrivo por mi.


Me han dicho, y he escuchado asi como lo he
sentido,
el dolor jamas pasara ,
solo lo asimilaras.

Formo parte neutral entre el bien y el mal, que tu raza ha creado. En
donde, en tu mundo dicen que la luz es la vida y la obscuridad es prohibida.
Soy yo quien a cada paso que tu das le temes, tu sabes que llegare por ti, pero
niegas tu partida de este lugar.
Solo soy el jinete que te ha de llevar al lugar donde perteneces.
Cuando me presente no te niegues, tu ya sabras a que he venido...

martes, septiembre 25, 2007

Import & Export con SQLDMO.

Hola, bueno hace bastante tiempo que no escribo pero bueno, aquí estoy de vuelta.


Hace unos dias estaba haciendo unas pruebas de como subir y bajar datos desde MSQL 2005 con C#, utilizando SQLDMO, y bueno después de un rato lo conseguí.

aquí la reseña.

Primero antes que nada hay que agregar la referencia a SQLDMO ( Interop.SQLDMO.dll).


using SQLDMO;


Bueno vamos a comenzar con bajar la información de una tabla "TBLXX" desde una base "BD_YY", el proceso es simple y a resumidas cuentas es el siguiente: Se genera una conexion a la BD, se configura el objeto BulkCopy, se instancia el objeto de la tabla con un Item de la BD y se exporta a un path elegido.


   1:  public void PaJuera()
   2:  {
   3:  SQLServer server = new SQLServerClass();

   4:  _BulkCopy bcp = new BulkCopyClass();
   5:  _Database db = new DatabaseClass();
   6:  _Table table = new TableClass();
   7:  server.EnableBcp = true; // Abusados si no ponen esto no pifa.
   8:  server.Connect(ServInstance, "usr", "****");
   9:  bcp.DataFileType = AQLDMO_DATAFILE_TYPE.SQLDMODataFile_CommaDelimitedChar;
  10:  bcp.RowDelimiter = @"\n";
  11:  bcp.UseExistingConnection = true;
  12:  bcp.MaximumErrorsBeforeAbort = 1000;
  13:  bcp.UseBulkCopyOption = true;
  14:  bcp.IncludeIdentityValues = true;
  15:  bcp.UseServerSideBCP = false;
  16:  bcp.DataFilePath = "archivo.txt";
  17:  table = server.Databases.Item("BD_YY", "dbo").Tables.Item("TBLXX", "dbo");
  18:  table.ExportData(bcp);
  19:  server.DisConnect();
  20:   
  21:  }


DataFilePath: es el nombre del archivo al que se va exportar la informacion.
No se olviden de cerrar la conexion y vaciar los objetos que ya no van a ocupar.


la parte de pa' dentro es muy parecida, lo unico que cambia es que en DataFilePath se pone el archivo origen y la parte de:

table.ImportData(bcp)

y eso es todo.

Saludos y espero les sirva.

domingo, diciembre 04, 2005

9:50 de por la noche del Domingo, escuchando Nothing Better - The Postal Service y... 7x8= "no se", preguntas de nuevo, 7x8="no se", ¡¡Tercera semana consecutiva que mi pequeña de 8 años nos dice, "Mamá, Papá, la maestra tambien queria que le llevaramos para mañana..." Pin%$"/(/# escuincla - estalla Marina y yo lanzo amenasas de ya ves y todavia que te dejamos que hagas esto... y te llevamos a... !!! -y en eso dice...- Esta bien 56, --Me recargo en la pared..., frase tras frase y amenaza tras amenaza, siempre me sale con que si sabia pero le da hueva--. Ella es lo mas preciado de mi vida, y me da gusto ver y formar parte de estos momentos.

domingo, septiembre 11, 2005


Bastante bien la "Feria de las Enchiladas" en cuanto al paladar se refiere, pero en cuanto a organizacion y distribucion era bastante dificil poder caminar por ahi e insuficientes los lugares para sentarse a comer y escasos los botes de basura para depositar los rastros del delito, de hecho la gente preferia comer en sus vehiculos y algunos aprovechaban las banquillas del quiosco para hechar diente a las enchilada. En mi caso terminamos pidiendo para llevar la comida, ya en el calor de la casa, la tarde lluviosa del domingo y un poco de musica se consumieron esos platos de enchiladas en Nogada, Toluqueñas , Jarochas y Tricolores.

lunes, septiembre 05, 2005

Por favor, no me veas así, posiblemente esta noche no me vaya.

- No quiero lastimarte, y solo quiero decirte, que yo tampoco quiero que te vayas, quédate conmigo,-

-¿por que?

-Por que si volteo y no te veo, me asusta el hecho de que te has ido, y me da miedo equivocarme y por eso te pido que te quedes.


-Solo déjame, que cierre mis ojos, será por un instante, te prometo que cuando los haya abierto, te tendré una respuesta, mientras tanto tómame de la mano y no me sueltes, que quien habrá de soltártela seré yo.

Hoy como te veo, cada vez te siento mas distante pero, me da miedo por que ya no soy yo quien se aleja…

El dolor ya paso, únicamente quedan las cenizas y la yagas que se han de cerrar en cuanto vuelvas tú, o tu lugar sea ocupado.

.