double jarowinkler_core(const char * str_1, const char * str_2, double W_1, double W_2, double W_t, double r) { int str_len_1=strlen(str_1); int str_len_2=strlen(str_2); /* Standard-Jaro-Score berechnen */ // Rprintf("Berechne Standard-Jaro-Gewicht\n"); // Debug-Ausgabe double jaro_score=jaro(str_1, str_2, W_1, W_2, W_t, r, 0); // Rprintf("Berechne daraus Jaro-Winkler\n"); // Debug-Ausgabe /* wenn jaro() 1 oder 0 zurückgibt, ist das der endgültige Wert */ if (jaro_score==1.0 || jaro_score==0.0) return(jaro_score); /* else */ // Rprintf("Ermittle Anzahl der Zeichen, für die die Stringanfänge übereinstimmen\n"); // Debug-Ausgabe /* Ermittle Anzahl der Zeichen, für die die Stringanfänge übereinstimmen */ int min_str_len=str_len_1<str_len_2 ? str_len_1 : str_len_2; int max_i=0; while (str_1[max_i]==str_2[max_i] && max_i<4 && max_i<min_str_len) { max_i++; } return(jaro_score + max_i * 0.1 * (1-jaro_score)); }
double winkler(char *s, char *t, int ss, int st) { float dist, pref_length; if (!strcmp(s, t)) return 1.0; dist = jaro(s, t, ss, st); pref_length = common_prefix_length(4, s, t, ss, st); dist = dist + pref_length * 0.1 * (1 - dist); return dist; }