Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

#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

 

Pied de page des forums

Powered by FluxBB