algo / moteur de recherche

algo / moteur de recherche - PHP - Programmation

Marsh Posté le 05-11-2010 à 11:33:27    

Bonjour,
 
Je souhaiterai pouvoir repérer les villes présentes dans un texte au moyen de ma base de villes (10000).
 
Que me conseilleriez-vous de faire ?
 
Pour le moment, j'éclate le texte en x mots et fais une recherche en base pour chaque mots .. c'est loin d'être optimal car cela necessite autant de requetes qu'il y a de mots.
 
Avez-vous une solution existante ? des plugins pour mongodb ? sphinx voire mysql ? Ou une idée d'algo intelligent ?
 
Merci bcp
 
 

Reply

Marsh Posté le 05-11-2010 à 11:33:27   

Reply

Marsh Posté le 05-11-2010 à 13:31:48    

J'ai ouvert y'a qq temps le même genre de topic mais avec la problématique supplémentaire que je recherche un groupe d'un ou plusieurs mots (jusqu'à 4) dans une BD : http://forum.hardware.fr/hfr/Progr [...] 0753_1.htm
 
J'ai pas de solution pour l'instant...
 
Edit : après, faut voir la taille du texte par rapport au nb d'entrées dans la BD. En effet, si t'as un gros texte dont le nb de mots est > au nb d'entrées, t'as peut-être plutôt intérêt à regarder si une entrée de la BD est présente dans le texte ;) Moi, c'était pas le cas (environ 2700 entrées alors que la taille moyenne des textes dans lesquels je recherche tourne autour de 50 à 100 mots).


Message édité par rufo le 05-11-2010 à 13:35:33

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 05-11-2010 à 16:57:31    

Merci rufo de ta réponse, je vais creuser et te tiens au courant de mes avancées..

Reply

Marsh Posté le 20-11-2010 à 18:26:10    

rufo,
 
j'ai enquêté et fait qq experiences, j'ai trouvé finalement une solution assez simple plus ou moins bourrine mais qui beneficie d'excellentes perfs.
 
Je suis resté avec mongodb.
J'ai indexé le nom des villes sur _id
 
Je decoupe mon texte en x mots (je suis allé jusqu'a 10000) et j'ai fait un query multiple avec mongodb (cad une connexion qui balance plusieurs requetes) sur ma table de villes (1000000).
 
cela fonctionne, j'ai tout en 0.002 secondes sans IO de folies. :-)
 
Par contre, je suis pas sur que cela puisse être possible avec un sql de base, de type mysql.
 

Reply

Marsh Posté le 22-11-2010 à 17:30:27    

Ben ça revient à ce que j'ai fait :/ Mais moi, je suis sous MySql, alors les perfs sont plutôt autour de 0.5s à 5s (mais mon SGBD traite plus 1.3 millions de requêtes par jour donc pas mal d'accès simultanés)...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 23-11-2010 à 13:54:30    

sinon, en créant des fichiers de contenus ( avec pour nom l'id), en exécutant la commande grep ?
qui retournera l'id des fichiers dans lequel le mot aura été trouvé


---------------
Photos Panoramiques Montagnes Haute Savoie
Reply

Marsh Posté le 23-11-2010 à 14:43:10    

Tu peux développer un peu plus ton algo svp?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 23-11-2010 à 14:51:18    

la recherche dans un ficheir est largement plus lente que la recherche en base  
 
 
En général un moteur de recherche fonctionne de la manière suivante.
 
Lors de l'indexation :  
on extrait tous les mots du texte  
on enlève les mots inutile ( le, la, les ,...; )  
on extrait la racine des mots ( stemming) , pour virer les pluriels/singulier/conjuguaison
on stocke en base la correspondance entre un texte, ses mots et leurs positions . Eventuellement,on peut affiner l'analyse en stockant si le mot est dans un titre, une signature, ...
 
 
Lors de la recherche :  
on prends l'expression recherché, on applique le même stemming que lors de l'indexation et on compare le resultats avec la liste des mots en bases pour retrouver les textes
Le classement se fait en fonction du nombre d'occurence, de leur position , ....

Reply

Marsh Posté le 23-11-2010 à 16:02:49    

Pas stemming, mais lemnisation ;) Pour ça, si t'as pas une BD linguistique, t'es pas dans le caca :D...
 
Autre inconvénient de ton algo, il travaille que par mot et non groupe de mots :/ Or, perso, j'ai besoin de rechercher un groupe de mot dans une BD de connaissances, pas juste un mot.
 
L'algo que tu décris se rapproche pas mal de LSA (analyse sémantique latente). C'est plutôt utile pour comparer le degré de similitude entre 2 documents, donc effectivement adapté dans le cadre d'un moteur de recherche pour trouver les documents les plus pertinents. Mais ce n'est pas fait pour faire de l'enrichissement de contenu d'un document sur des mots ou groupes de mots dans un texte (cas de ce topic)...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 23-11-2010 à 16:12:24    

c'est un algo très simple, il est bien évidemment possible d'affiner ( la notion de proximité d'un groupe de mot se déduit assez simplement de la position dans le document )  
 
Tu peux indexer aussi les groupes de 2 3 et 4 mots ensembles

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed