hola, ¿cómo podemos comparar la Lista 1 con la Lista 2 para calcular la distancia de la cadena usando Jaro Winkler?
El archivo de salida debe tener los nombres de la Lista 1 y la Lista 2 y una tercera columna que tenga la puntuación JW.
https://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance
Lista1
JOHN SMITH
Maderas de tigre
Tony molly
James un
MICKEY MOUSE
PATO DONALD
DUNKIN DONUTS
Tokio
Lista2:
Johnthith smith
TIGER WOO
JOHN MOLLY
JAMES XXXX LLC
JAMES
Tokio
gracias. Voy a probar las opciones y el círculo de vuelta.
JMP proporciona la función Script de edición más corta () y el ejemplo en el Índice de secuencias de comandos proporciona un script para encontrar la secuencia común más larga.
Uno de los guiones escritos para el libro JSL Companion, segunda edición, define la distancia de Levenshtein y proporciona ejemplos; Se adjunta a continuación.
La web no adjuntaría el archivo jsl, así que cambié la extensión a .txt
No veo estadísticas similares, así que encontré un código en otro idioma y lo porté a JMP. A continuación se muestra un script de ejemplo que hace lo que creo que quieres. Cópialo en una ventana de script y ejecútalo. Genera las listas de palabras, en tablas de datos separadas ..... Creo que eso es lo que quieres. Y luego los combina en una sola tabla de datos y crea una nueva columna con la estadística Jaro-Winkler.
names default to here(1);
dt1 = New Table( "Table 1",
Add Rows( 8 ),
New Column( "List 1",
Character,
"Nominal",
Set Values(
{"JOHN SMITH", "TIGER WOODS", "TONY MOLLY", "JAMES A", "MICKEY MOUSE",
"DONALD DUCK", "DUNKIN DONUTS", "TOKYO"}
)
)
);
dt2 = New Table( "Table 2",
Add Rows( 6 ),
New Column( "List 2",
Character,
"Nominal",
Set Values(
{"JOHNTHAN SMITH", "TIGER WOO", "JOHN MOLLY", "JAMES XXXX LLC", "JAMES",
"TOKIO"}
)
)
);
// Join the tables
dtJoined = dt1 << Join(
With( dt2 ),
By Row Number,
Output Table( "Joined Table" )
);
// Create New column
dtJoined << New Column("Jaro-Winkler");
// Add the functions that create the Jaro-Winkler
jaromatch = Function( {string1, string2}, {i},
str1_len = Length( string1 );
str2_len = Length( string2 );
allowedDist = Floor( Max( str1_len, str2_len ) / 2 ) - 1;
//*** walk through string1 and match characters to string2 ***;//
matchChars = "";
For( i = 1, i <= str1_len, i++,
//*** get the part of string2 to search ***;
allowed_start = Max( 1, i - allowedDist );
//*** starting char position ***;
allowed_str2 = Substr( string2, allowed_start, i + allowedDist - allowed_start + 1 );
//*** find i char from string1 in string2 within the allowedDist ***;
position = Contains( allowed_str2, Substr( string1, i, 1 ) );
If( position > 0,
matchChars = Concat( matchChars, Substr( allowed_str2, position, 1 ) );
//*** Once a char is assigned, it can not be assigned again. So, chg char in string2. ***;
string2 = Substr( string2, 1, allowed_start + position - 2 ) || "~" ||
Substr( string2, allowed_start + position );
);
);
Trim( matchChars );
);
/* count the number of "half" transpositions */
jarotrans = Function( {string1, string2},{i},
ntrans = 0;
For( i = 1, i <= Min( Length( Trim( string1 ) ), Length( Trim( string2 ) ) ), i++,
If( Substr( string1, i, 1 ) != Substr( string2, i, 1 ),
ntrans
++)
);
ntrans / 2;
);
/* get the length of the matching characters at the beginning */
getPrefixlen = Function( {string1, string2, maxprelen},{i},
n = Min( maxprelen, Length( string1 ), Length( string2 ) );
If( n == 0,
n = 0,
For( i = 1, i <= n, i++,
If( Substr( string1, i, 1 ) != Substr( string2, i, 1 ),
n = (i - 1)
); //*** all maxprelen characters match ***;
)
);
n;
);
/* calc the jaro distance */
jarodist = Function( {string1, string2}, {i},
//*** get number of matched characters in string1 ***;
m1 = jaromatch( string1, string2 );
m1_len = Length( m1 );
If( m1_len == 0, j_dist = 0 );
//*** get number of matched characters in string2 ***;
m2 = jaromatch( string2, string1 );
m2_len = Length( m2 );
If( m2_len == 0, j_dist = 0 );
//*** get number of transposed characters ***;
ntrans = jarotrans( m1, m2 );
//*** calc jaro distance ***;
j_dist = (m1_len / Length( string1 ) + m2_len / Length( string2 ) + (m1_len - ntrans) / m1_len) / 3;
j_dist;
);
/* calc the jaro-winkler distance */
jarowink = Function( {string1, string2, prefixscale},{i},
string1 = Uppercase( Trim( string1 ) );
string2 = Uppercase( Trim( string2 ) );
//*** check for trivial case and calc JW if needed ***;
If( string1 == string2,
returned = 1.0,
jarodist1 = jarodist( string1, string2 );
prelen = getPrefixlen( string1, string2, 4 );
returned = jarodist1 + prelen * prefixscale * (1 - jarodist1);
);
returned;
);
// Loop through the data table and create the values for the new column
For(i=1,i<=n rows(dtJoined), i++,
dtJoined:Name("Jaro-Winkler")[i] = jarowink(dtJoined:List 1[i], dtJoined:List2[i], 0.1);
)¿Tenemos alguna otra función incorporada en JMP que sea comparable a Jaro-Winkler?
La lectura de 2 listas diferentes de dos archivos diferentes es trivial, y la combinación tampoco es un gran problema. El verdadero trabajo sería el desarrollo de un script que calcula las distancias Jaro-Winkler. No hay una función incorporada para calcular la Distancia Jaro-Winkler. Si bien JMP podría manejar la tarea, tomaría el esfuerzo de desarrollarla.
@vishalparekh ,
No creo que haya una función incorporada en JMP para calcular la distancia que está buscando. Tendrá que definir funciones personalizadas definidas por el usuario para lograr lo que está buscando. Si tengo la oportunidad, más tarde lo intentaré. es posible que desee leer sobre la función () y contiene () en el Índice de secuencias de comandos para obtener algunas ideas.