Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/05/2008, 13h34   #1
Invité de passage
 
Inscription : avril 2008
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 14
Points : 3
Points : 3
Par défaut [SQL] moteur de recherche en php

Bonjour ,
Je dois intégrer un moteur de recherche en php à un site intranet pour mon stage.
Pour cela la structure de la base a été modifié et une table mot clé a été rajoutée pour extraire les mots clés de chaque document.
Donc pour chaque table Document, je dois extraire du champs titre et du champs texte des mot cles que je mettrai dans la table mot cles.
Le probleme c'est que je ne sais pas comment éliminer les mots inutiles comme "je le la un des ..." J'ai cherché sur google mais j'ai rien trouvé .
Qu'en pensez-vous ?
merci d'avance
++
foufoulol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2008, 14h46   #2
Membre actif
 
Inscription : mars 2007
Messages : 171
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 171
Points : 171
Points : 171
Tu peux faire un truc du genre :

Code :
1
2
3
4
 
$pattern[0] = '/\b(je|le|la|un|des)\b/i';
$replace[0] = '//i';
$newstring = preg_replace( $pattern , $replace , $string );
Pour plus d'informations :
http://fr2.php.net/manual/fr/function.preg-replace.php

http://fr2.php.net/manual/fr/referen....modifiers.php
ericduval est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2008, 15h25   #3
Membre Expert
 
Avatar de riete
 
Homme Thierry
NFC & DevWeb
Inscription : avril 2006
Messages : 1 175
Détails du profil
Informations personnelles :
Nom : Homme Thierry
Âge : 51
Localisation : France

Informations professionnelles :
Activité : NFC & DevWeb
Secteur : Bâtiment

Informations forums :
Inscription : avril 2006
Messages : 1 175
Points : 1 366
Points : 1 366
Sinon, tu utlise le 'wildcard' de SQL qui te permet de les ignorer automatique, ou si tu préfère de rechercher un ou des mot sans te soucier de la 'pollution' occasionnée par les autres. Je me fais bien comprendre?

Non?, alors exemple:

tu cherche "Férié" (humour, car je bosse aujourd'hui ), alors tu écris;
Code :
SELECT * FROM tatable WHERE Mot_Cle LIKE '%Férié%'
riete est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2008, 13h14   #4
Invité de passage
 
Inscription : avril 2008
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 14
Points : 3
Points : 3
en fait je pense que je vais carrément faire une table qui contiendra tous les mots inutiles et une autre qui contiendra tous les mot clés important de chaque document.
riete je ne peux pas faire ça car je ne cherche pas un mot en particulier je veux prendre tous les mots et enlever ceux qui sont inutiles.
foufoulol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 09h13   #5
Membre Expert
 
Avatar de riete
 
Homme Thierry
NFC & DevWeb
Inscription : avril 2006
Messages : 1 175
Détails du profil
Informations personnelles :
Nom : Homme Thierry
Âge : 51
Localisation : France

Informations professionnelles :
Activité : NFC & DevWeb
Secteur : Bâtiment

Informations forums :
Inscription : avril 2006
Messages : 1 175
Points : 1 366
Points : 1 366
Tu veux dire que tu veux les exclure de la recherche ou que les ignorer te suffit ?
riete est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 11h09   #6
Invité de passage
 
Inscription : avril 2008
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 14
Points : 3
Points : 3
Ce que je veux dire c'est qu'il y a une table Mot-clé qui va contenir tous les mots clés de tous les documents existants.
Cette table contiendra une liste de mots et chaque mots aura une ou plusieurs correspondances vers un code de document.
Et ma recherche je la ferais directement dans cette table Mot-clé.
Dès qu'un mot cherché correspond à un mot de cette table Mot-clé je vais chercher le ou les code de documents correspondant et j'affiche le résultat.
Mais dans cette table, je ne veux pas trouver des mots qui ne servent à rien tels que parce que, pourtant cependant ... et je ne sais pas comment filtrer ces mots.
C'est pour cela que j'avais pensé à créer carrément une autre table contenant tous les mots à éviter. MAis je ne sais toujours pas comment la remplir
foufoulol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 11h23   #7
Membre Expert
 
Avatar de riete
 
Homme Thierry
NFC & DevWeb
Inscription : avril 2006
Messages : 1 175
Détails du profil
Informations personnelles :
Nom : Homme Thierry
Âge : 51
Localisation : France

Informations professionnelles :
Activité : NFC & DevWeb
Secteur : Bâtiment

Informations forums :
Inscription : avril 2006
Messages : 1 175
Points : 1 366
Points : 1 366
Je crois que je commence à comprendre un peu mieux...

Peut être que je me trompe mais "Tout les mots qui ne sont pas des mots clef sont peut être des mots inutiles" non ?

Dans ce cas, s'est ta procédure de définition des mots clé qui se chargera de faire la distinction.

Je crois que la questions principale comment détermine qu'un mot est un mot clé ? est ce l'utilisateur qui le définit ?

Je suis désolé de ne pas t'aider plus, mais il faudrait que je comprenne bien ce que tu veux faire pour essayer de te proposer une idée.

A+
riete est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 11h54   #8
Invité de passage
 
Inscription : avril 2008
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 14
Points : 3
Points : 3
Non c'est à moi de me de***der pour savoir si un mot est pertinent pour une recherche ou pas. Donc voila tout le problème car on peut pas faire un script qui classe les mots en fonction de leur pertinence.
Donc je prends tous les mots de chaque documents et il faut que je les filtre en les comparant avec une liste de mots inutiles que je cherche depuis des jours sur internet mais que je ne trouve pas.
Je vais donc sûrement devoir en faire une moi même et créer une interface qui permettra facilement d'aller rajouter quand on veut des mots inutiles dans cette liste.Car je ne vais pas tous les trouver du premier coup.

PS : Je suis désolé si j'explique pas très bien j'ai toujours eu du mal dans ce domaine.
foufoulol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 17h48   #9
Membre Expert
 
Avatar de riete
 
Homme Thierry
NFC & DevWeb
Inscription : avril 2006
Messages : 1 175
Détails du profil
Informations personnelles :
Nom : Homme Thierry
Âge : 51
Localisation : France

Informations professionnelles :
Activité : NFC & DevWeb
Secteur : Bâtiment

Informations forums :
Inscription : avril 2006
Messages : 1 175
Points : 1 366
Points : 1 366
Citation:
Envoyé par foufoulol Voir le message
Non c'est à moi de me de***der pour savoir si un mot est pertinent pour une recherche ou pas. Donc voila tout le problème car on peut pas faire un script qui classe les mots en fonction de leur pertinence.
Donc je prends tous les mots de chaque documents et il faut que je les filtre en les comparant avec une liste de mots inutiles que je cherche depuis des jours sur internet mais que je ne trouve pas.
Je vais donc sûrement devoir en faire une moi même et créer une interface qui permettra facilement d'aller rajouter quand on veut des mots inutiles dans cette liste.Car je ne vais pas tous les trouver du premier coup.
Projet intéressant...
Je me demande si tu ne devrais pas faire une sorte de programme qui "scan" un dictionnaire, duquel du extrait les "mots inutiles" en les faisant défiler. Mais quel boulot !!
J'ai beau réfléchir, mais je ne vois pas de méthode fiable pour extraire ces mots. Je vais réfléchir et si je trouve une idée, je te la vends ...
Non, non, sérieux s'est non trivial ton truc, je me demande s'il y a une solution.
Citation:
Envoyé par foufoulol Voir le message
PS : Je suis désolé si j'explique pas très bien j'ai toujours eu du mal dans ce domaine.
On y est quand même arrivé !! Mais s'est peut être moi qui ai la comprenette un peu difficile
riete est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2008, 10h49   #10
Invité de passage
 
Inscription : avril 2008
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 14
Points : 3
Points : 3
Ben en fait je pense qu'il n'y a pas de solution miracle, obligé de faire de l'à peu près...
Quand même je ne pensais pas que c'était si galère à coder un moteur de recherche !!!
merci quand même pour ton temps et ta patience
foufoulol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 10h21   #11
Membre éprouvé
 
Homme
Inscription : août 2006
Messages : 313
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : août 2006
Messages : 313
Points : 497
Points : 497
Sur un de mes projets, j'avais fait un script rapide PHP-CLI d'indexation :
- je charge un texte
- je supprime toute mise en forme (tout le balisage xhtml, les accents, les majuscules)
- je supprime tous les mots de moins de 4 caracteres (un peu bourrin à ce niveau, cette condition etait justement pour éliminer les mots parasites mais tu peux l'oublier et appliquer la méthode plus bas)
- je décompose la chaine obtenu en tableau (un mot par tableau)
- j'utilise la fonction php array_count_values pour obtenir le nombre d'occurence pour obtenir un tableau contenant le nombre d'occurence dans le texte.

A partir de la, les 5 premiers mots etaient considérés comme mot clef du texte.

Pense à la sémantique des balises xhtml, ca peut etre pratique pour ça :
- contenu des balises h1, h2, h3, strong, em (ces balises encadrent des mots clefs)

Pour l'élimination des mots parasites, j'avais pensé à cette méthode mais je ne l'ai jamais appliqué :
- Elle est simple mais couteuse en ressource (en meme temps, tu ne dois pas indexer toutes les 5 minutes) :

Tu prends le contenu de ta base obtenu. Tu récupères les mots clefs 1 par 1. Tu regardes le nombre d'occurence.
-Si tu as moins de 5% des articles qui possèdent ce mot, c'est un mot clef important.
-Si tu as plus de 50% des articles qui contiennent ce mot, c'est un mot parasite.
(J'ai donné les coefficients au hasard, à toi de les définir)

Programmer ça, ce n'est pas tres difficile. C'est tres bourrin comme méthode mais si tu indexes tes documents une fois par jour, ce n'est pas un soucis (a condition de ne pas avoir 400 000 pages ^^).

Rien ne t'oblige à faire ce script en PHP, le java ou meme le C sera plus rapide sur ce genre d'opération.

Je te colle le code de la classe que j'avais ecrit pour l'extraction d'un texte, ça pourra peut etre t'aider :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
 
<?php
 
class ExtractTextHTML
{
    private $s_text_init;
    private $curr;
    private $a_tab_final;
 
    public function __construct($text) {
        $this -> s_text_init = $text;
    }
 
    public function cleanData(){
        $this -> curr = $this -> s_text_init;
        $this -> HTMLtoISO();
        $this -> strip_accents();
        $this -> strip_tags();
        $this -> strip_ponctuations();
        $this -> str_to_lower();
        $this -> limit_word(4);
        $this -> string_to_array();
 
    }
 
    public function getData($nb_entry){
        return array_slice ($this -> a_tab_final, -$nb_entry,$nb_entry); 
    }
 
    protected function HTMLtoISO(){
        $this -> curr = preg_replace('/\<.+?\>/',' ',$this -> curr);
        $this -> curr = html_entity_decode($this -> curr,ENT_QUOTES);
    }
 
    protected function strip_accents(){
        $this -> curr = strtr($this -> curr,'àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ',
'aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY');
    }
 
    protected function strip_tags(){
        $this -> curr = strip_tags($this -> curr);
    }
 
    protected function strip_ponctuations(){
        $this -> curr = preg_replace('/[\W]/',' ',$this -> curr);
        $this -> curr = preg_replace('/\s+/',' ',$this -> curr);
    }
 
    protected function str_to_lower(){
        $this -> curr = strtolower($this -> curr);
    }
 
    protected function limit_word($nb_car){
        $this -> curr = preg_replace('/\s([\w|\d]{0,'.$nb_car.'}\s)+/',' ',$this -> curr);
    }
 
    protected function string_to_array(){
        $this -> a_tab_final = explode(" ",$this -> curr);
        $this -> a_tab_final = array_count_values($this -> a_tab_final);
        asort($this -> a_tab_final,SORT_NUMERIC);
    }
}
?>
Phelim est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h52.


 
 
 
 
Partenaires

Hébergement Web