やあ、どうやってJaro Winklerを使って文字列の距離を計算するためにList 1とList 2を比較することができるか?
出力ファイルには、リスト1とリスト2の名前、および3番目の列にJWスコアがあります。
https://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance
リスト1
ジョンスミス
タイガーウッズ
トニーモリー
ジェームズA
ミッキーマウス
ドナルドダック
ダンキンドーナツ
東京
リスト2:
ジョンサンスミス
TIGER WOO
ジョンモリー
JAMES XXXX LLC
JAMES
トキオ
ありがとうございました。私はオプションを試してみて、戻ります。
JMPは関数Shortest Edit Script()を提供し、Scripting Indexの例は最も長い共通のシーケンスを見つけるためのスクリプトを提供します。
『JSLコンパニオン』第2版という本のために書かれたスクリプトの1つは、レーベンシュタイン距離を定義し、例を示しています。それは下に添付されています。
Webはjslファイルを添付しないので、私は拡張子を.txtに変更しました
似たような統計は見られないので、別の言語のコードを見つけてJMPに移植しました。 以下は私があなたが望むと思うことをするサンプルスクリプトです。 スクリプトウィンドウにコピーして実行します。 それは別々のデータテーブルに単語のリストを生成します.....私はそれがあなたが望むものであると信じます。 そして、それらを単一のデータテーブルにまとめ、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);
)に匹敵するJMPの他の組み込み関数はありますか。ジャロウィンクラー?
2つの異なるファイルから2つの異なるリストを読み取ることは簡単です、そしてそれから結合もそれほど問題にはなりません。 本当の仕事はJaro-Winkler距離を計算するスクリプトの開発でしょう。 Jaro-Winkler距離を計算するための組み込み関数はありません。 JMPはそのタスクを処理できますが、それを開発するには努力が必要です。
@vishalparekh 、
JMPには、あとの距離を計算するための組み込み関数はないと思います。あなたがしていることを達成するためには、カスタムのユーザー定義関数を定義する必要があります。チャンスがあれば、後でそれを打つつもりです。いくつかのアイデアを得るために、Scripting Indexのfunction()とcontains()を読んでください。