2010-08-27 24 views
2

J'ai implémenté l'algorithme jaro-winkler dans ma base de données. Je n'ai pas écrit cette fonction. La fonction compare deux valeurs et donne la probabilité de correspondance.Comment puis-je utiliser jaro-winkler pour trouver la valeur la plus proche dans une table?

So jaro (string1, string2, matchnoofchars) retournera un résultat. Au lieu de comparer deux chaînes, je veux envoyer une chaîne avec un matchnoofchars et obtenir un ensemble de résultats avec une probabilité supérieure à 95%.

Par exemple, la fonction actuelle est en mesure de revenir 97,62% pour Jaro (« Philadelphia », « Philadelphlaa », 9)

Je souhaite modifier cette fonction pour que je suis en mesure de trouver « Philadelphie » pour un entrée de "Philadelphlaa". Quel genre de changements dois-je faire pour que cela se produise? J'utilise Oracle 9i.

Répondre

0
DECLARE 
    CURSOR citynames IS 
    SELECT city FROM table_loc_master where statecode = 'PQ'; 
    CURSOR leasecity IS 
    SELECT city FROM table_loc where State = 'PQ' 
    MINUS 
    SELECT to_char(city) city FROM table_loc_master where statecode = 'PQ'; 
    xProb NUMBER(10,8); 
BEGIN 
    FOR x_rec IN leasecity 
    LOOP 
     FOR y_rec IN citynames 
     LOOP 
      xProb := jwrun(x_rec.city,y_rec.city,length(y_rec.city)); 
      If xProb > 0.97 Then 
       DBMS_OUTPUT.PUT_LINE('Source : ' || x_rec.city || ' Target: ' || y_rec.city); 
      End if; 
     END LOOP; 
    END LOOP; 
END; 
+1

Vous pouvez l'accélérer en supposant que les 3, 4 ou 5 premiers caractères sont les mêmes. Vous pouvez également supposer que les deux mots ont une longueur à peu près égale. Cela limite la recherche. – TTT

3

Avez-vous une liste de mots qui contiennent des mots comme "Philadelphia"?

Et qui a écrit cette fonction?

Oracle a utl_match paquet pour la comparaison de texte flou: http://download.oracle.com/docs/cd/E14072_01/appdev.112/e10577/u_match.htm

Tu ne peux pas faire

select w1.word des mots w1 où Jaro (w1.word, 'Philadelphlaa', 9)> = 0,95

?

Ceci sélectionnera «Philadelphie» si ce mot est présent dans les mots du tableau.

+0

La fonction a été écrite par quelqu'un d'autre. J'ai pu l'utiliser dans un bloc Pl sql. – abhi

+0

Ok, avez-vous une liste de mots? Il est difficile de comprendre la question. D'où vient le mot «Philadelphie»? – TTT

+0

la liste des mots va provenir de deux tables différentes. Une table principale qui a les mots avec les orthographes correctes et une table de transacation qui pourrait avoir mal orthographié des mots. J'ai posté la réponse. Ma réponse n'est pas efficace, car il faut beaucoup de temps pour traiter des choses. – abhi

1

Un peu sale mais plus rapide (non testé!).

Supposons que les trois premiers caractères sont identiques et que la longueur est également approximativement la même.

DECLARE 
    CURSOR citynames(cp_start in varchar2, cp_length in number) IS 
    SELECT city FROM table_loc_master where statecode = 'PQ' 
    and city like cp_start||'%' 
    and length(city) between cp_length -2 and cp_length +2; 
    CURSOR leasecity IS 
    SELECT city FROM table_loc where State = 'PQ' 
    MINUS 
    SELECT to_char(city) city FROM table_loc_master where statecode = 'PQ'; 
    xProb NUMBER(10,8); 
BEGIN 
    FOR x_rec IN leasecity 
    LOOP 
     FOR y_rec IN citynames(substr(x_rec.city,1,3), length(x_rec.city)) 
     LOOP 
      xProb := jwrun(x_rec.city,y_rec.city,length(y_rec.city)); 
      If xProb > 0.97 Then 
       DBMS_OUTPUT.PUT_LINE('Source : ' || x_rec.city || ' Target: ' || y_rec.city); 
      End if; 
     END LOOP; 
    END LOOP; 
END; 
+0

Cela dépend de l'endroit où le nom de la ville serait mal orthographié. L'entrée de l'utilisateur n'est pas une sélection, mais un mot saisi. Cela provoque beaucoup de noms de villes à se détraquer. Merci d'avoir répondu à ma question. – abhi