// ----------------------------------------------- // MODULE: URLTest2.java // AUTEUR: felipe IFT1010 // OBJET: montrer que l'on peut lire une URL // aussi facilement qu'un fichier texte // ET montrer les vecteurs en situation // reelle // NOTE: VRAIMENT Lent et sous-optimal ! // ----------------------------------------------- import java.io.*; import java.net.*; import java.util.*; // ========================================================== // une classe static avec quelques outils // ========================================================== class Outils { // decouper une ligne de texte en "mots" static String [] tokenise(String ligne) { StringTokenizer tokens = new StringTokenizer (ligne," ,;:!?-()[]\n\t\r"); String [] ret = new String [tokens.countTokens()]; for (int i=0; tokens.hasMoreTokens(); i++) ret[i] = tokens.nextToken().toLowerCase(); return ret; } } // ========================================================== // une classe qui contient le mot et sa frequence // ========================================================== class Item { private int frequence; private String mot; public Item(String mot, int freq) { this.mot = mot; frequence = freq; } public String toString() { return "[" + mot + "," + frequence + "]"; } public boolean equals(Object ref) { if (ref instanceof Item) return ((Item)ref).getMot().equals(mot); return false; } public void increment() {frequence++;} // modificateur public int getFrequence() {return frequence;} // assesseur public String getMot() {return mot;} } // ============================================================================ // La classe principale // ============================================================================ public class URLTest2 { // des variables de classe private static String urlString = "http://www.iro.umontreal.ca/~felipe/IFT1010-Automne2000/Exemples/verne.fr"; private static Vector vm; private static int nbFormes = 0; // nb de mots differents dans le texte lu private static int nbMots = 0; // nb de mots dans le texte lu private static int nbLignes = 0; // nb de lignes dans le texte lu // le traitement d'une ligne : on joue avec les hashtables private static void traitement(String ligne) { String [] mots = Outils.tokenise(ligne); nbLignes++; if ((nbLignes % 100) == 0) System.err.println("traitement de la ligne " + nbLignes); nbMots += mots.length; for (int i=0; i < mots.length; i++) { // chaque mot de la phrase int index = vm.indexOf(new Item(mots[i],0)); if (index != -1) ((Item)vm.elementAt(index)).increment(); else { nbFormes ++; vm.addElement(new Item(mots[i],1)); } } } // la methode principale public static void main(String [] args) { String ligne; BufferedReader in; // un exemple de lecture d'une URL, inutile ici de s'attacher // aux details que nous ne verrons pas en cours comme les exceptions // ou les specificites des classes URL... try { URL urlAddress = new URL(urlString); URLConnection lien = urlAddress.openConnection(); in = new BufferedReader(new InputStreamReader(lien.getInputStream())); vm = new Vector(); while ((ligne = in.readLine()) != null) traitement(ligne); } catch (MalformedURLException e) { System.err.println("Pas tres fraiche ton URL: " + urlString + e); System.exit(1); } catch (IOException e) { System.err.println("Impossible d'acceder a l'URL: " + e); System.exit(1); } finally { // le reste du traitement System.out.println("Nombres de lignes lues " + nbLignes); System.out.println("Nombres de formes differentes " + nbFormes); System.out.println("Nombres de mots differents " + nbMots); } // le reste du traitement Enumeration enum = vm.elements(); int freq,max = 0; String mot, leMotPlusFrequent = "pas de mot"; Item it; while (enum.hasMoreElements()) { it = (Item)enum.nextElement(); freq = it.getFrequence(); mot = it.getMot(); if (max < freq) { max = freq; leMotPlusFrequent = mot; } } System.out.println("Le mot le plus frequent est \"" + leMotPlusFrequent + "\" qui est apparu " + max + " fois"); } // fin du main }