public static Clasa Jarowklekledistance {* * Modificarea Winkler nu va fi aplicată decât dacă se potrivește meciul * Procentul de la sau peste procentul de Mwightthreshold * fără modificare. * Hârtia Winkler a folosit o valoare implicită de 0,7 * / privat static dublu Mweightthreshold = 0,7; / * Dimensiunea prefixului care urmează să fie conciderată de modificarea Winkler. * Hârtia de la Winkler a folosit o valoare implicită de 4 * / privată statică readonly INT Mnumchars = 4; /// < Rezumat > /// Returnează distanța Jaro-Winkler între șirurile specificate. Distanța este simetrică și va cădea în intervalul 0 (meciul perfect) la 1 (fără meci). /// < / rezumat > /// ivid id = > primul șir < / param > /// < param nume = "astring2" > al doilea șir < / param > ///
returns > iv id = "0fd17c2f04"
/ returns > Distanța dublă statică publică (șir astring1, șir astring2) {return 1.0 - proximitate (astring1, astring2); } /// < Rezumat > /// Returnează distanța Jaro-Winkler între șirurile specificate. Distanța este simetrică și va cădea în intervalul 0 (fără meci) la 1 (potrivire perfectă). /// < / rezumat > /// ivid id = > primul șir < / param > /// < param nume = "astring2" > al doilea șir < / param > ///
returns > iv id = "0fd17c2f04"
/ returns > Proximitate dublă statică statică (șir astring1, șir astring2) {int llen1 = astring1th ™length; int llen2 = astring2.length; Dacă (Llen1 == 0) returnă Llen2 == 0? 1.0: 0,0; int lSearchrange = Math.Max (0, Math.max (Llen1, Llen2) / 2 - 1); // Implicit inițializat la False Bool Latched1 = nou bool; bool matched2 = nou bool; int lnumcommon = 0; pentru (int i = 0; i < llen1; ++ i) {Int Lstart = Math.max (0, I-LSEArchran); int lend = mateth.min (I + LSEArchran + 1, Llen2); pentru (int j = lstart; j < lend; ++ j) {dacă (matched2) continuă; dacă (astring1! = astring2) continuă; matched1 = adevărat; matched2 = adevărat; ++ Lnumecommon; pauză; }} dacă (lnumcommon == 0) returnează 0,0; int lnumhalftranspoty = 0; int k = 0; pentru (int i = 0; i < llen1; ++ i) {if (! matched1) Continuați; în timp ce (! matched2) ++ k; dacă (astring1! = astring2) ++ lnumhalftranspused; ++ k; } // sistem.diagnostics.debug.writeline (numhalftransposed = "+ numhalftranspuse); int lnumtranspoty = lnumhalftranspot / 2; // sistem.diagnostics.debug.writeline ("numcommon =" + numcommon + "NumTransposed =" + num -Transpus); Dublu Lnumcommond = Lnumecommon; Dublu Lwight = (Lnumcommond / Llen1 + Lnumcommond / Llen2 + (Lnumcommon - LnumTranspust) / Lnumcommond) /3.0; dacă (Lweight < = mweighthresholdold) returnare Lweight; int lmax = Math.min (Mnumchars, Math.Min (astring1th 1 lungime, astring2.Length)); INT LPOS = 0; În timp ce (LPO < lmax & & astring1 == astring2) ++ LPO; dacă (LPO == 0) returnați lwight; Returnați Lweight + 0.1 * LPOS * (1.0 - lwight); }}