예제 #1
0
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));

}
예제 #2
0
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;
}