Distancia de Levenshtein
Posted: Mon Jul 17, 2023 9:40 pm
Hola buenas tardes para todos, en este momento tenemos la necesidad de comparar un listado de nombres de productos, con la cadena de un nombre de producto, el problema es que la cadena no viene exacta, la idea es que se pueda sugerir la mas cercana posible.
Estuve consultando con ChatGTP y me sugirió que lo podemos hacer utilizando el algoritmo de Levenshtein, incluso nos dio un ejemplo para usarlo con PHP y Python. Le pregunte si lo podíamos hacer con xharbour/harbour y me dice que no hay una librería que lo tenga, pero que podemos hacer el algoritmo en C++, ya que xharbour esta basado en clipper, que a su vez esta basado en c++.
Buscando en Google encontré el mencionado algoritmo escrito en C++.
https://es.wikipedia.org/wiki/Distancia_de_Levenshtein
De casualidad alguno de los master, nos puede ayudar a traducir ese algoritmo para xharbour/harbour?
ChatGTP nos sugirió este código para hacerlo. Pero salen varios errores.
Error E0021 Incorrect number of arguments: MIN
De antemano gracias
Estuve consultando con ChatGTP y me sugirió que lo podemos hacer utilizando el algoritmo de Levenshtein, incluso nos dio un ejemplo para usarlo con PHP y Python. Le pregunte si lo podíamos hacer con xharbour/harbour y me dice que no hay una librería que lo tenga, pero que podemos hacer el algoritmo en C++, ya que xharbour esta basado en clipper, que a su vez esta basado en c++.
Buscando en Google encontré el mencionado algoritmo escrito en C++.
Code: Select all | Expand
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int levenshtein(const string &s1, const string &s2)
{
int N1 = s1.size();
int N2 = s2.size();
int i, j;
vector<int> T(N2+1);
for ( i = 0; i <= N2; i++ )
T[i] = i;
for ( i = 0; i < N1; i++ )
{
T[0] = i+1;
int corner = i;
for ( j = 0; j < N2; j++ )
{
int upper = T[j+1];
if ( s1[i] == s2[j] )
T[j+1] = corner;
else
T[j+1] = min(T[j], min(upper, corner)) + 1;
corner = upper;
}
}
return T[N2];
}
De casualidad alguno de los master, nos puede ayudar a traducir ese algoritmo para xharbour/harbour?
ChatGTP nos sugirió este código para hacerlo. Pero salen varios errores.
Code: Select all | Expand
//Algoritmo de Levenshtein
FUNCTION LevenshteinDistance(s1, s2)
LOCAL m, n, matriz, i, j, coste
m := Len(s1)
n := Len(s2)
matriz := Array(m+1, n+1)
FOR i := 0 TO m
matriz[i][0] := i
NEXT
FOR j := 0 TO n
matriz[0][j] := j
NEXT
FOR i := 1 TO m
FOR j := 1 TO n
IF s1[i] <> s2[j]
coste := 1
ELSE
coste := 0
ENDIF
matriz[i][j] := Min(matriz[i-1][j] + 1, matriz[i][j-1] + 1, matriz[i-1][j-1] + coste)
NEXT j
NEXT i
RETURN matriz[m][n]
De antemano gracias