IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Modules Perl Discussion :

filtrage texte mot clef


Sujet :

Modules Perl

  1. #1
    En attente de confirmation mail
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 123
    Points : 82
    Points
    82
    Par défaut filtrage texte mot clef
    Bonjour,

    Je voudrais réaliser une classification de texte selon des mots-cléfs présent et absents à la manière d'un filtre de message d'un client mail.

    Connaissez vous un module permettant d'effectuer ce genre de classification ?

    Pour ma part, j'ai cherché et trouvé le module Algorithm::NaiveBayes permettant d'établir des catégories et de classifier un texte mais je n'arrive pas à comprendre comment l'utiliser avec des mots clef présents et des mot-cléfs absents

    Comment faut-il établir les catégories ?

    Existe-t-il une solution plus simple ?

    Merci

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Ton sujet m'intéresse car j'ai une (deux en fait) problématique similaire, je m'y greffe donc

    Si j'ai bien compris le module, tu crées une sorte de thésaurus en lui apprenant à reconnaitre des catégories à l'aide de mots-clés et de poids (en utilisant la méthode add_instance).

    Ensuite, tu appelles la méthode predict avec ta liste de mot à analyser et celle-ci te retourne la probabilité que le texte qu'il contient appartient à chacune des catégories que tu lui a apprises.

    Selon moi, la phase d'apprentissage peut être :
    - forcée : tu connais le thésaurus (la liste des mots-clés et leur poids respectif qui permettent de déterminer qu'un texte appartient à une certaines catégorie)
    - induite : tu disposes d'un certain nombre de textes que tu sais catégoriser. Tu les apprends à l'aide de add_instance en leur attribuant à chacun une catégorie.

    En tout cas, ta question va sans doute me pousser à tester ce module qui me semble plus intéressant que le simple match de mots-clés pour la classification de textes.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  3. #3
    En attente de confirmation mail
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 123
    Points : 82
    Points
    82
    Par défaut
    Bjr Philou

    oui voila ce que je fais à partir de mots clef : (c'est un script de test donc pas très clean)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    use Algorithm::NaiveBayes;
    use Data::Dumper;
     
    #nouveau classifier
    my $nb = Algorithm::NaiveBayes->new;
     
    $nb->add_instance(attributes => {bonjour => 1, test=> 1}, label => 'Categorie1');
    $nb->add_instance(attributes => {adresse=> 1, envoi=> 1}, label => 'Categorie2');
     
    $nb->train;
     
    my $corpusl="Bonjour, ceci est un document test";
     
     
    $corpus=~s/\.\,\;\://;
    my @corpus = split(/\s+/,$corpus);
    my %hashCorpus = ();
     
    foreach (@corpus){
    	next if($_ eq "");
    	$hashCorpus{$_}++;
    }
     
    my $result = $nb->predict(attributes => \%hashCorpus);
    print "Resultat : ", Dumper($result), "\n";
    j'obtiens qqchose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    { 
       '1ere categorie' => '0.894427190999916',
       '2eme categorie' => '0.447213595499958'
    }
    Mais il s'agit d'un exemple avec des mot clef présent! Pour des mot clef absent (qui ne doivent donc pas figurer sur le document) , j'ai essayé en attribuant un poids de 0 à ces mots clef (fréquence d'apparition nulle) mais ça ne fct pas.

    En effet si on définit 2 catégories avec les même mots cléfs et en ajoutant pour l'une d'elle un mot clef absent avec un poids de 0,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $nb->add_instance(attributes => {bonjour => 1, test => 1, document=>0}, label => ['Categorie1']);
    $nb->add_instance(attributes => {bonjour=> 1, test=> 1}, label => [' Categorie2']);
    j'obtiens une équiprobabilité entre les deux catégories pour un document comportant les mots clés "bonjour", "test" et "document".

    C'est là que je bloque ? Je définis peut être mal mes catégories?

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Je n'avais pas compris ta question initiale, où tu souhaites en fait définir dans ton thésaurus, des mots-clés "antinomique", c'est à dire, qui ne doivent pas être présents.

    J'ai fait des essais similaires à toi avec des résultats équivalents. Je pense en fait que définir une probabilité nulle supprime ce critère de la catégorisation, le rendant non déterminant. Cet algorithme ne semble basé que sur la présence de mots, pas sur leur absence.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  5. #5
    En attente de confirmation mail
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 123
    Points : 82
    Points
    82
    Par défaut
    Pour info , pour reprendre mon exemple précédent, si on attribue un poids plus fort au mot clef absent, on tombe sur l'autre catégorie.

    Du coup je me demande quelle méthode pourrait répondre à mon besoin ? Un module Perl particulier ?

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Et si tu construisais objets NaiveBayes ?
    1- pour l'appartenance à une catégorie dans laquelle tu mets les mots-clés et leur probabilité d'apparition
    2- pour la non appartenance à une catégorie dans laquelle tu mets les mots-clés et leur probabilité de non apparition

    Tu exécutes les deux recherches et tu combines les résultats pour trouver les bonnes catégories candidates ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Exemple de formule en considérant $is_a et $in_not_a les deux objets précédents.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    my %is_a = %{$is_a->predict($text)};
    my %is_not_a = %{$is_not_a->predict($text)};
    my %predict;
    foreach my $category (keys %is_a) {
      $predict{$category) = $is_a{$category} * (1- $is_not_a{$category});
    }
    Il faudra peut-être re-normaliser les valeurs entre 0 et 1.
    Je ne sais pas si ce que j'ai écrit est correct (au sens des probabilités et/ou de la logique).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  8. #8
    En attente de confirmation mail
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 123
    Points : 82
    Points
    82
    Par défaut
    J'y ai songé mais écrire la décision me semble compliquée, car :

    imaginons qu'une catégorie de mot clefs PRESENT obtienne un bon score (une forte proba d'appartenance) mais que de l'autre coté on trouve que pour cette meme categorie, les mots clef devant être absent sont présents, on obtient également un bon score pour la même catégorie des MOT CLEF ABSENT, conséquence, on ne peut pas prendre cette catégorie comme représentative du document.

    Il faudrait du coup prendre le deuxième meilleur score des MOT CLEF PRESENTS, etc,...

    Je ne sais pas si ma démarche est bien réfléchie mais ça me semble un brin compliqué,non?

  9. #9
    En attente de confirmation mail
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 123
    Points : 82
    Points
    82
    Par défaut
    Sans avoir tester et de visu, ça ma l'air plutôt pas mal vu comme ça!!!

    Maintenant je ne suis pas spécialiste des probabilités donc je ne sais pas cette syntaxe est correcte ou logique du point de vu proba.

  10. #10
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Ben, tout dépend quels poids tu accordes aux mots présents et aux mots absents (dans leur ensemble et pris un par un). Si tu décides que les mots doivent ABSOLUMENT être absent, tu peux éliminer toutes les catégories dont la probabilité dans $is_not_a est supérieure à 0.1, ou 0.001, enfin, à toi de voir la contrainte que tu imposes.
    As-tu essayé ma proposition de formulation ci-dessus ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  11. #11
    En attente de confirmation mail
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 123
    Points : 82
    Points
    82
    Par défaut
    Je suis dessus, Philou, je te tiens au courant.

    [EDIT] Bon a priori, les premier résultats en appliquant cette formule sont plutôt encourageant. Je diminue en effet mon score des qu'un mot cle ABSENT se trouve sur le modele . Ainsi, j'ai moins de risque de mauvaise classification.

    Pour l'instant mes modèles sont simples. Je vais faire des tests plus poussés. Je te tiens informé si ça t'intéresse.

    Concernant les poids des mots, je compte le nombre total de mot qui va me servir auquel je soustrais la fréquence d'apparition du mot, je ne sais pas si c'est pertinent...
    En effet si un mot me sert plusieurs fois pour définir la meme catégorie, je considère qu'il a plus de poids que les autres. Aussi pour chaque catégorie, je le met un peu moins en avant que les autres mots

    par exemple avec 5 mots cela donnerait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    { bonjour=>3, test=>4} => categorie1,
    { bonjour=>3, envoi=>4}=> categorie1,
    { Cordialement=>4, toto=>4} => categorie2
    Est ce judicieux ?

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/01/2012, 14h16
  2. Parser un texte avec mots clefs
    Par cortal74 dans le forum Général Python
    Réponses: 6
    Dernier message: 16/10/2011, 09h05
  3. Réponses: 3
    Dernier message: 14/09/2010, 12h45
  4. filtrage sur mot clef
    Par pascalbout1 dans le forum Langage
    Réponses: 2
    Dernier message: 17/07/2007, 16h45
  5. détection mot clef dans un texte
    Par Royd938 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 19/04/2006, 18h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo