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

Java Discussion :

Nombre d'occurrences des mots


Sujet :

Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 175
    Par défaut Nombre d'occurrences des mots
    Bonjour,

    J'ai un ensemble des documents qui contiennent des textes en anglais. Il me faut déterminer tout d'abord tous les mots qui existe dans ces textes (qui sont des centaines de milliers) et après déterminer pour chaque mot le nombre d'occurrences. Pourriez-vous me proposer la solution la plus simple et qui n'exige pas beaucoup d'espace mémoire et de calcul, si non j'imagine que ça va durer des jours pour être terminer.


    Toute information sera le bien venue et Merci d'avance

  2. #2
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    S'il y a tellement de mots, le plus simple serait peut etre de passer par une base de données comme sqlite pour eviter d'avoir à construire des arbres

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Une première solution naïve serait une HashMap<String, Integer>. Tu peux faire un essai et voir ce que ça donne.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Cet exercice est un exemple classique d'utilisation de systèmes de calcul distribués tels que Hadoop ou Storm.
    Il y a des tutoriels qui implémentent précisément cet exercice pour ces deux plateformes.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 175
    Par défaut
    Citation Envoyé par hwoarang Voir le message
    S'il y a tellement de mots, le plus simple serait peut etre de passer par une base de données comme sqlite pour eviter d'avoir à construire des arbres
    Tout d'abord, je vous remercie pour votre réponse rapide !

    Les textes sont déjà dans des enregistrements d'un table de base de données. Oui j'ai pensé également à utiliser une table de base de donnés pour sauvegarder la valeur tf ou idf de chaque mot.

    Mais avant ça, comment déterminer les mots qui existent dans ces textes ? J'ai trouvé un fichier qui contient les stopwords (noise words) mais avant ça il me faut déterminer tous les mots qui existent et ensuite supprimer ces stopwords et enfin calculer le nombre d'occurrence de chacun de ces mots

    Pardon, j'ai pas bien compris pourquoi vous parlez des arbres

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 175
    Par défaut
    Citation Envoyé par Sharcoux Voir le message
    Une première solution naïve serait une HashMap<String, Integer>. Tu peux faire un essai et voir ce que ça donne.
    Oui c'est une bonne solution pour manipuler et déterminer le nombre d'occurrencesv des mots mais avant ça comment je peux déterminer les mots qui trouvent dans tous les textes ?

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 175
    Par défaut
    Citation Envoyé par Nudger Voir le message
    Bonjour,

    Cet exercice est un exemple classique d'utilisation de systèmes de calcul distribués tels que Hadoop ou Storm.
    Il y a des tutoriels qui implémentent précisément cet exercice pour ces deux plateformes.
    Si j'ai bien compris Storm and Hadoop permettent de manipuler des grosses quantités des données d'une manière intelligente. Pourriez-vous me donner un récap, j'ai trouvé que des tutoriaux en anglais et apparemment c'est ça le rôle principale de ce deux techniques, non ? Merci d'avance

  8. #8
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Août 2011
    Messages : 181
    Billets dans le blog
    1
    Par défaut
    Slt.
    Pour déterminer le nombre de ligne dans une chaine de caractère (distinction des saut de ligne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String [] tab = str.split ("\n");
    System.out.println ("Nb ligne : " + tab.length);
    Pour déterminer les mots présents dans une ligne (distinction des espaces) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String [] ens_mot = tab [0].split (" ");
    Bon courage

  9. #9
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Citation Envoyé par daniel1985 Voir le message
    Oui c'est une bonne solution pour manipuler et déterminer le nombre d'occurrencesv des mots mais avant ça comment je peux déterminer les mots qui trouvent dans tous les textes ?
    Pour ça, il va falloir que tu lises tes fichiers. Tu peux utiliser ce que t'a proposé mohamine : lecture ligne par ligne puis utilisation d'un split(" "). Par contre, il va aussi falloir que tu fasses attention à la ponctuation (la supprimer), aux majuscules (tout mettre en minuscule), peut-être à d'autres choses encore.

    Ensuite, si tu utilises une hashMap, pour chaque mot que tu lis tu fais un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(map.get("truc")==null) {
        map.put("truc", 1);
    } else {
        map.put("truc", map.get("truc")+1);
    }
    Il y a peut-être une meilleure façon d'écrire ça avec un opérateur ternaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            Integer i = map.get("truc");
            map.put("truc", i==null ? 1 : i+1);
    Une fois ton parcourt terminé, tu peux obtenir la liste des mots lus en faisant map.keySet()

  10. #10
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Août 2011
    Messages : 181
    Billets dans le blog
    1
    Par défaut
    Je te remercie infiniment Sharcoux pour tes prescients, je tien juste a rajouter que mieux vaut passer par une base de données a la fin de lecture de chaque ligne pour éviter une saturation de la mémoire (tu manipule des documents volumineux), pour ça tu peut tenter une insertion dans la base, et si une exception est générée, donc le mot est y est déjà, tu fait une incrémentation de son nombre d'appartion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try {
    connection.createStatement ().execute ("Insert into Table (mot, nb_appr) Values ('" + mot + "', 1)");
    }
    catch (SQLExecption ex) {
        connection.createStatement ().execute ("Update Table set nb_appr = " + nb_appr + " WHERE mot = '" + mot + "'");
    }
    Cordialement Amine.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par daniel1985 Voir le message
    Si j'ai bien compris Storm and Hadoop permettent de manipuler des grosses quantités des données d'une manière intelligente. Pourriez-vous me donner un récap, j'ai trouvé que des tutoriaux en anglais et apparemment c'est ça le rôle principale de ce deux techniques, non ? Merci d'avance
    C'est ça, en effet.

    Hadoop est basé sur deux technologies: HDFS pour le stockage distribué des données et Map/Reduce pour le calcul distribué.
    C'est une technologie dont les bases ont été mises au point par Google (d'ailleurs à l'origine HDFS s'appelait GFS).

    Il y a dans wikipedia un article qui explique les mécanismes:
    http://fr.wikipedia.org/wiki/MapRedu...C3%A9mentation

    Et dans le wiki d'apache un exemple de Mapper et de Reducer pour un calcul de nombre de mots:
    http://wiki.apache.org/hadoop/WordCount

    Storm est beaucoup plus jeune et il n'y a pas beaucoup de documentation en français pour le moment.

  12. #12
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Citation Envoyé par daniel1985 Voir le message
    Les textes sont déjà dans des enregistrements d'un table de base de données. Oui j'ai pensé également à utiliser une table de base de donnés pour sauvegarder la valeur tf ou idf de chaque mot.
    Oui, c'est bien de stocker le nombre d’occurrence dans la base que je propose. Contrairement à l'utilisation d'un arbre ou d'une map, les bases de données ne consomment pas beaucoup de mémoire et sont rapides pour effectuer des recherches. Ca me semble donc adapté à ton besoin.

    Citation Envoyé par daniel1985 Voir le message
    Mais avant ça, comment déterminer les mots qui existent dans ces textes ? J'ai trouvé un fichier qui contient les stopwords (noise words) mais avant ça il me faut déterminer tous les mots qui existent et ensuite supprimer ces stopwords et enfin calculer le nombre d'occurrence de chacun de ces mots
    Ok donc ton probleme, c'est de retrouver les mots à partir du texte. Je suppose que tu arrives à extraire le texte dans un String. A partir de la, le plus simple (à mon avis) est d'utiliser une expression régulière qui te sortirait la liste des mots (car les solutions à base de split vont sortir des chaines vides s'il y a plusieurs espaces et la ponctuation ne sera pas prise en compte). Un truc de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
          String maPhrase = "Les regex, ça marche bien\nEt c'est pas si compliqué.";
          Pattern pattern = Pattern.compile("\\b\\p{javaLetter}+\\b");
     
          Matcher matcher = pattern.matcher(maPhrase);
          while (matcher.find())
          {
             System.out.println(matcher.group());
          }
    Citation Envoyé par daniel1985 Voir le message
    Pardon, j'ai pas bien compris pourquoi vous parlez des arbres
    Parce que je pensais que ta demande etait sous quelle forme stocker les mots pour pouvoir ensuite les compter. Pour un probleme de ce type, on pourrait penser à l'utilisation d'un arbre mais si le nombre de mots est important, la base de données me semble plus appropriée.

    EDIT : faute de frappe

Discussions similaires

  1. Déterminer le nombre d'occurences des mots dans un fichiers texte
    Par fraisa1985 dans le forum Général Java
    Réponses: 13
    Dernier message: 26/10/2021, 01h58
  2. [Débutant] Nombre d'occurrences de mots dans un fichier
    Par aleanlastar dans le forum MATLAB
    Réponses: 4
    Dernier message: 02/01/2015, 15h35
  3. [AC-2010] Calculer le nombre d'occurrences des extrêmes dans un tableau
    Par PinkLady dans le forum VBA Access
    Réponses: 12
    Dernier message: 17/12/2013, 09h48
  4. Faire un programme qui lit un mot et affiche le nombre d'occurrences du mot
    Par levasseur62 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 02/11/2010, 15h25
  5. le nombre d'occurences des mots d'un texte
    Par hendrix67 dans le forum Langage
    Réponses: 3
    Dernier message: 19/05/2010, 09h39

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