#1 Fri 13 January 2006 10:18
- André M. Winter
- Participant actif
- Lieu: Götzen, Tyrol, Autriche
- Date d'inscription: 6 Sep 2005
- Messages: 60
- Site web
recherche adaptive dans und BD de noms de lieux?
bonjour,
j'ai une question concernant les techinques de "recherche adaptive" dans
une BD contenant des noms de lieux du monde entier. plus tard je veux
permettre une recherche internet là-dessus et bien sûr il faudra que
celle-ci soit flexible. pour un exemple: je voudrais que le système me
revoie (au moins) 'Saint-Julien-en-Beauchêne' si l'utilisatuer recherche
avec des termes comme 'St Julien' ou 'st julien en b.' à l'interieur de
la base de donnée (qui sera basée sur PostgreSQL en UTF-8) les commandes
classiques comme 'LIKE' ne suffiront plus pour ce genre d'opérateurs de
filtrage (pattern-matching).
j'imagine qu'il faut un pour un algorithme sachant résoudre ces
problèmes d'un côté un module général (transformant une requête simple
en requête multiple?) et aussi un modèle de fragments de mots pour
chaque langue (francais, anglais, allemand, etc.) utilisée (puisque par
ex. 'St.' fait en francais 'Saint' et en allemand 'Sankt'). quelqu'un
aurait-il déjà travaillé dans ce domaine? j'avoue être au début de mes
recherches et je serais heureux de tout coup de main sur la question.
salutations du Tyrol/Tirol/Tirolo (fr+en/de/it!)
andré
Hors ligne
#2 Fri 13 January 2006 14:41
- Olivier Guénard
- Juste Inscrit !
- Date d'inscription: 11 Dec 2005
- Messages: 2
Re: recherche adaptive dans und BD de noms de lieux?
Effectivement, pour ce genre re recherche, il vaut mieux abandonner la logique booléenne au profit de la logique floue. Il faut calculer une note correspondant au rapprochement entre la chaine recherchée et le contenu de la base.
Comme vous prenez la direction d'un developpement internet style PHP, je vous indique une fonction pratique de MYSQL.
Une fois la colonne de recherche indexée avec un index FULL-TEXT (disponible que sous certains type de stockage de la table), la requete suivant liste les ID avec le meilleur taux de réussite (calculé avec MATCH AGAINST).
exemple :
SELECT ID,MATCH(NOM_LIEUDIT) AGAINST ('LA GRANGE') WITH QUERY EXPANSION FROM LIEUXDITS ORDER BY 2 DESC
la liste indique le champ identifiant ID (clé) et la note. Le classement se fait sur la note dela plus forte à la plus faible.
Si quelqu'un a des ordres SQL similaire pour ORACLE, PostGRESQL, merci de bien vouloir partager vos lumières....
Il est opréférable parfois de retirer la clause WITH QUERY EXPANSION
Pour de meilleurs résultats, vous pouvez utiliser également SOUNDEX ou simplifier l'orthographe des noms par une fonction.
Bon courage,
Olivier
Hors ligne
#3 Fri 13 January 2006 18:00
- Ludovic G
- Membre
- Lieu: Annecy
- Date d'inscription: 5 Sep 2005
- Messages: 124
Re: recherche adaptive dans und BD de noms de lieux?
Merci, pour ce post super intéressant! Cette technique semble bien pratique.
Par contre, les tirets sont-il considérés comme des séparateurs de mots? Et comment gérez vous l'apostrophe?
Dernière question, je trouve peu d'infos sur la clause WITH QUERY EXPANSION, quelle est son rôle?
Ludovic
Hors ligne
#4 Sat 14 January 2006 10:16
- André M. Winter
- Participant actif
- Lieu: Götzen, Tyrol, Autriche
- Date d'inscription: 6 Sep 2005
- Messages: 60
- Site web
Re: recherche adaptive dans und BD de noms de lieux?
merci olivier pour ces informations.
la sytaxe de mysql n'est pas trop reproductible sous postgresql il me
semble. mais SOUNDEX marche une fois qu'on l'a compilé (explication sous
, mais
attention sous la version postgresql 8.1 le fichier produit s'appelle
fuzzystrmatch.sql!).
une maniere de tester peut ressebler à
SELECT local_name FROM names_geogr WHERE soundex(local_name) =
soundex('Garde') ;
ceci retourne:
Garde
Garde
Gard
Gardie
cependant cette recherche oublie les communes suivantes car soundex est
spécialement axé sur la longuer des mots si je comprends bien. surtout
le deuxième nom est crucial:
Gardanne
Garde-Freinet
autre problème, tout mechanisme de ce genre devrait avoir des methodes
propres à chaque langue, ainsi il y a qqn qui a écrit une version
francaise de soundex: soundexfr:
.
fuzzystrmatch.sql génère qq autres fonctions dont celles ci-dessous, je
ne les ai pas encore testés.
- levenshtein() - calculates the levenshtein distance between two strings
- metaphone() - calculates the metaphone code of an input string
a+
andré
Hors ligne
#5 Sat 14 January 2006 23:12
- ddelon
- Juste Inscrit !
- Lieu: Saint-Martin-de-Londres
- Date d'inscription: 5 Sep 2005
- Messages: 6
Re: recherche adaptive dans und BD de noms de lieux?
Bonjour,
Voici la méthode que j'utilise, dans un autre contexte, mais c'est assez
efficace :
- Si pas de correspondance exacte :
- recherche soundex, à l'endroit et à l'envers, pour pallier les
problèmes avec le calcul soundex standard, basé sur l'anglais et le
soundex dont j'ai besoin, qui ne doit pas tenir compte des H par
exemple, ca donne ceci, pour du mysql :
Select * from table where ... and SOUNDEX(nom) =
SOUNDEX(chaine_de_recherche) OR SOUNDEX(REVERSE(nom)) =
SOUNDEX(REVERSE(chaine_de_recherche))
- Pour chaque chaque resultat, calcul d'un "score" (en utilisant les
fonctions levenshtein et similar_text de php) :
score = 500 - levenshtein(resultat, chaine_de_recherche);
score = score + (similar_text(chaine_de_recherche,resultat) * 3)
- Je retiens le resultat ayant obtenu le meilleur score.
Ca fonctionne très bien ! C'est inspiré de ce qu'on peut trouver ici :
http://fr.php.net/manual/fr/function.levenshtein.php (voir les
commentaires).
--
David
Hors ligne