|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Nouveau Membre du Club
![]() Inscription : octobre 2008 Messages : 136 ![]() |
Bonjour,
Je recherche une méthode qui me permette de trouver rapidement une sous chaine ou une chaine dans un set de 40000 noms. Si je fais une recherche du mot "tu", je veux que mon programme trouve "turquoise", "tortue", "tu" dans un "dictionnaire" figé c'est à dire que les données dans lesquelles la recherche est faite reste inchangées d'une exécution à une autre. J'ai trouvé des informations sur l'algorithme de Boyer-Moore pour la recherche de sous-chaine. j'ai aussi trouvé les arbres binaires mais étant donné que ma recherche doit porter sur une sous-chaine qui n'est pas forcément en début de mot, je ne pense pas que cela puisse me servir. J'ai aussi pensé à une table de hash avec des listes chainées mais je ne vois pas sur quoi calculer ma clé de hash. Quelqu'un peut-il m'orienter pour choisir une structure de données adaptée pour la recherche ? Merci |
|
|
00
|
|
|
#2 |
|
Membre émérite
![]() Inscription : décembre 2008 Messages : 189 ![]() |
Après avoir lu cet article :
http://fr.wikipedia.org/wiki/Algorithme_de_Boyer-Moore Ainsi que les autres cités dans "articles connexes" Je crois pouvoir affirmer que tout ceci est très intéressant et répond sans doute à tes questions. L'Algorithme de Boyer-Moore est basé sur une idée que je trouve géniale. Ne convient-il pas à ce que tu dois faire ? |
|
|
00
|
|
|
#3 |
|
Expert Confirmé
![]() ![]() Fred KwarizChef de projet en SSII Inscription : octobre 2011 Messages : 750 ![]() |
Bonsoir,
Une autre approche serait de construire un dictionnaire qui optimise les recherches partielles de lettres consécutives qui renvoient un ensemble de mots correspondants. Il y a évidemment l'approche naïve (et peu efficace) qui consiste à construire un arbre n-aire qui factorise les préfixes (en anglais un trie). L'étape suivante est de passer en une représentation binaire (fils gauche, frère droit) et de factoriser au possible les suffixes (en anglais un DAWG). Puis tu peux essayer un GADDAG qui prend plus de place mais facilite les «accès en milieu de mots». Il y a pas mal de doc et d'articles sur ce genre d'approche (citeseer et google scholar par exemple). |
|
00
|
|
|
#4 | |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 594 ![]() |
je n'ai pas lu les aticles pointés, mais une idée comme ça, avec ta condition :
Citation:
Un tableau 2D de 26 cases
Ensuite, pour chercher une sous-chaine, on va directement à la première lettre. Puis pour chaque possiiblité, on regarde avec la deuxième (par exemple avec une recherche dichotomique dans son tableau de position). etc... Non ?? Enfin je sais que c'est un sujet de recherche et de travail courant, donc peut-être mon idée est-elle trop nettement simpliste...
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
|
00
|
|
|
#5 |
|
Membre habitué
![]() Chargé de missions Inscription : mai 2011 Messages : 66 ![]() |
Bonjour,
comme tu a dis que tu recherche une "méthode", si tu peux placer tes mots dans une BDD alors ton problème peut se résoudre facilement avec une requête SQL : Select * FROM les_mots WHERE mot like "*tu*" C'est juste une proposition car je ne sais pas si tu as la possibilité d'utiliser une BDD. |
|
|
00
|
|
|
#6 | |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 594 ![]() |
Citation:
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
|
00
|
|
|
#7 |
![]() ![]() Inscription : septembre 2003 Messages : 4 437 ![]() |
Bonjour
J'ai eu à faire ce genre de choses il y a une vingtaine d'années, avec une base de plusieurs dizaines de milliers de mots, qui ne changerait pas fréquemment. J'ai indexé tous les mots de la base sur la premiere lettre, la seconde etc Ce qui fait que j'ai 24 index et je recherche les chaînes comme je veux à partir de la premiere, la seconde... C'est très rapide. Evidemment, et j'insiste, il ne faut pas que la base change tous les jours (quoique maintenant, l'indexation totale doit prendre moins d'une heure).
__________________
"La haine seule fait des choix" - Koan Zen "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne. Faites du Prolog, ça vous changera les idées ! Ma page Prolog Mes codes sources commentés Mon avatar : Intérieur avec jeune femme de Vilhelm Hammershoi |
|
|
00
|
|
|
#8 | |
|
Expert Confirmé
![]() ![]() Fred KwarizChef de projet en SSII Inscription : octobre 2011 Messages : 750 ![]() |
Citation:
oui, la construction d'un arbre des préfixes pour 40000 mots (je suppose d'après l'exemple du PO) tirés d'un dictionnaire français (longueur moyenne autour de 10) ne doit pas dépasser l'ordre de la minute. |
|
|
00
|
|
|
#9 |
|
Nouveau Membre du Club
![]() Inscription : octobre 2008 Messages : 136 ![]() |
Merci à tous pour toutes ces pistes !
(NB : c'est bizarre je n'ai reçu aucun mail me disant qu'il y avait des réponses dans la discussions alors que j'avais coché la case.... bref). @I_believe_in_code : j'ai aussi été très intéressée par Boyer Moore mais le soucis c'est comment gérer les données en entrée : l'algo de Boyer-Moore c'est l'outil de comparaison maintenant ce que je cherche c'est comment parcourir le "dictionnaire" de mots avec lesquels je veux comparer ma sous-chaîne. @kwariz : effectivement j'ai trouvé des articles très intéressants sur les arbres de tri et notamment les Radix Tree (http://en.wikipedia.org/wiki/Radix_tree). J'ai même un exemple de code ici : https://github.com/agl/critbit. Par contre je ne sais pas si c'est le plus rapide. Il va falloir que je teste..... @souviron : ta solution s'apparente un peu au Radix tree cité ci-dessus car dans chaque "node" de l'arbre on stocke des informations de position et des informations pour savoir quand les "mots" diffèrent. @sologne : la solution de bdd semble effectivement la plus simple mais côté performance j'ai peur que ça ne soit pas ça. @Trap_D : cette solution m'intéresse beaucoup. Ma base de noms dans laquelle va se faire la recherche ne va pas changer souvent. Je ne sais juste pas comment l'implémenter Je sais que les index sont une solution très rapide de recherche et qu'ils sont utilisés dans les moteurs de recherche du web. J'aimerai beaucoup implémenter cette solution. Pourriez vous me donner des pistes pour comment construire l'index ? Merci. |
|
|
00
|
|
|
#10 | |
|
Nouveau Membre du Club
![]() Inscription : octobre 2008 Messages : 136 ![]() |
Citation:
Je sais que les index sont une solution très rapide de recherche et qu'ils sont utilisés dans les moteurs de recherche du web. J'aimerai beaucoup implémenter cette solution. Pourriez vous me donner des pistes pour comment construire l'index ? |
|
|
|
00
|
|
|
#11 | |
|
Nouveau Membre du Club
![]() Inscription : octobre 2008 Messages : 136 ![]() |
Citation:
je vais peut être paraître ignorante mais c'est quoi l'exemple du PO ? Merci. |
|
|
|
00
|
|
|
#12 | |
|
Expert Confirmé
![]() ![]() Fred KwarizChef de projet en SSII Inscription : octobre 2011 Messages : 750 ![]() |
Citation:
L'exemple que tu donnes ("tu" -> turquoise, tortue) me laisse penser que tu vas manipuler des noms communs d'un dictionnaire. Ma seconde idée basée sur la taille me laissait penser une liste de communes (40000 ~ le nombre de communes en France). Dans les deux cas, 40000 mots c'est peanuts (si les mots ont une longueur d'une ou de dizaine de lettres tirées d'un alphabet d'une cinquantaine de symboles). Par curiosité que contient ton dico ? |
|
|
00
|
|
|
#13 | |
|
Nouveau Membre du Club
![]() Inscription : octobre 2008 Messages : 136 ![]() |
Citation:
Je veux implémenter un outil de recherche qui suggère au fur et à mesure les noms de communes/département/région qui "match" ce que tape l'utilisateur. Puisque que tu es là : je comprend totalement le principe d'un index pour retrouver rapidement les noms (bien que je ne sache pas comment l'impléméneter |
|
|
|
00
|
|
|
#14 | |
|
Expert Confirmé
![]() ![]() Fred KwarizChef de projet en SSII Inscription : octobre 2011 Messages : 750 ![]() |
Citation:
Quel est le cadre de ton projet ? |
|
|
00
|
|
|
#15 | |
|
Nouveau Membre du Club
![]() Inscription : octobre 2008 Messages : 136 ![]() |
Citation:
Je travaille sur une application mobile (iOS / android). Saurais-tu m'expliquer ce que TRAP-D entend par indexer les noms sur leur première lettre puis leur deuxième etc ? |
|
|
|
00
|
|
|
#16 | ||
|
Expert Confirmé
![]() ![]() Fred KwarizChef de projet en SSII Inscription : octobre 2011 Messages : 750 ![]() |
Citation:
Il s'agit bien de trois données concaténées en une chaîne. Comment vas-tu gérer les doublons ? Par exemple un user tape Loire, tu commences par toutes les communes contenant "loire", suivies de toutes les communes dont le département contient "loire", suivies de toutes les communes de la région Pays de la Loire ... Le plus simple est de ne rien faire ... le pourquoi suit : OK, cela signifie que tu vas essayer de créer un truc le plus compact possible. Tu pourras utiliser un AutoCompleteTextView pour l'affichage. Tu ne vas pas afficher la liste complète des communes qui matchent, ou alors seulement par morceau, donc une solution qui permet de renvoyer la liste par morceau serait idéale. Cela m'amène à penser que la solution la plus adaptée à ton cas serait l'utilisation d'une db light (sqlite ?), mais ce serait intéressanr de poser la question sur le forum approprié. Citation:
Mais bon attend l'explication de trap-d pour bien comprendre. |
||
|
00
|
|
|
#17 | |||
|
Nouveau Membre du Club
![]() Inscription : octobre 2008 Messages : 136 ![]() |
Citation:
Citation:
Le problème de la db light c'est que si ma base de données est grosse, j'ai peur que les requêtes soient longues pour la simple recherche de nom : je vais avoir une db bien sûre mais elle contiendra bien plus d'infos que simplement les noms de communes ou départements ou régions. Je veux séparer la recherche pour la suggestion des noms de la base de données qui contient toutes les infos. Citation:
Merci ! |
|||
|
|
00
|
|
|
#18 | |
|
Expert Confirmé
![]() ![]() Fred KwarizChef de projet en SSII Inscription : octobre 2011 Messages : 750 ![]() |
Citation:
|
|
|
00
|
|
|
#19 | |
|
Nouveau Membre du Club
![]() Inscription : octobre 2008 Messages : 136 ![]() |
Citation:
Et j'ai des infos qui changent dans le temps pour les communes, département ou régions : ça, l'application le charge dans une base de donnée de l'appli depuis internet une première fois au premier démarrage puis quand je lui dis qu'il y a un update à faire. |
|
|
|
00
|
|
|
#20 |
![]() ![]() Inscription : septembre 2003 Messages : 4 437 ![]() |
Salut
Mes données étaient rangées dans un gros fichier codé, (ça n'a aucune importance pour le traitement). Je faisais un tri alphabétique à partir de la première lettre, j'obtenais un premier index, puis un tri alphabétique à partir de la deuxième lettre etc. Les index renvoyaient à l'offset du mot dans le fichier. Pour accélérer encore la recherche, pour chaque index, je sauvegardais un tableau où étaient indiqués les offset dans l'index du premier mot débutant par a, par b pac c... Je trouvais ensuite les mots par une simple recherche dichotomique avec dejà 2 bornes correctes.
__________________
"La haine seule fait des choix" - Koan Zen "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne. Faites du Prolog, ça vous changera les idées ! Ma page Prolog Mes codes sources commentés Mon avatar : Intérieur avec jeune femme de Vilhelm Hammershoi |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com