Home | Software | Analisi | Links | Glossario | Bibliografia


Web Usage Mining

Analisi del comportamento di navigazione e classificazione degli utenti.
Applicazione al sito della Biblioteca di Ateneo.


Codice sorgente dell'applicazione per la creazione della matrice dei dati.

/* ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø
   ø  by Gianluca Tavella - gianluca.tavella@libero.it                       ø
   ø  Lug 2004                                                               ø
   ø  Tesi di laurea - Web Usage Mining                                      ø
   ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * Classe reOrganizeTable:    riorganizza la tabella 'seq' del database
 *                    'sessions' per la successiva analisi cluster
 *
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */
/*
 * import dei package necessari
 */
import java.sql.*;
/*
 * CLASSE: reOrganizeTable
 *         utility per la creazione di una matrice organizzata ai fini 
 *         della successiva analisi cluster tramite software statistico
 */
class reOrganizeTable{

   //////////////////////////////////////
   //// Variabili e oggetti di classe ///
   //////////////////////////////////////
   public String[] Concetti;
   public int MinVisitorID;
   public String normalbinary;
   public String visitorsession;

   /*
    *  Costruttore della classe
    * In base ai parametri passati a riga di comando stabilisce
    *  quale metodo utilizzare per costruire la matrice.
    *  La prima stringa stabilisce il metodo:
    *  "normal" = crea la matrice con il numero di visite
    *        di ogni utente per ogni pagina;
    *  "binary" = crea la matrice con i valori 0 e 1 (1 se
    *        l'utente ha visitato almeno una pagina,
    *        0 altrimenti).
    * La seconda stringa stabilisce se utilizzare come
    *  osservazioni:
    * "visitor" = gli utenti;
    *  "session" = le sessioni.
    */
   public reOrganizeTable(String met, String vs){
      normalbinary = met;
      visitorsession = vs;
      if ((!normalbinary.equals("normal") && !normalbinary.equals("binary"))
         || (!visitorsession.equals("visitor")
         && !visitorsession.equals("session"))){

         System.out.println("I parametri inseriti non sono corretti.");
         System.out.println("La prima stringa stabilisce il metodo:");
         System.out.println("\"normal\" = crea la matrice con il numero di visite");
         System.out.println("di ogni utente per ogni pagina;");
         System.out.println("\"binary\" = crea la matrice con i valori 0 e 1");
         System.out.println("(1 se l'utente ha visitato almeno una pagina, 0 altrimenti).");
         System.out.println("La seconda stringa stabilisce se utilizzare come");
         System.out.println("osservazioni:");
         System.out.println("\"visitor\" = gli utenti;");
         System.out.println("\"session\" = le sessioni.");
         System.out.println("I parametri vanno inseriti con caratteri minuscoli ");
         System.out.println("omettendo le virgolette (\").");
         System.exit(0);
      }



   }


   /*
    * Metodo DistinctConcepts()
    * Estrae i diversi concetti legati alle pagine dalla query 'UrlDistinti'
    * Fa ritornare una matrice di oggetti di tipo String
    */
   public String[] DistinctConcepts(){
      try{
         /*
          * registrazione del driver jdbc (bridge jdbc-odbc)
          */
         Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");  //registra driver
         /*
          * creazione della connessione al database "sessions"
          */
         Connection connessione = DriverManager.getConnection
                              ("jdbc:odbc:sessions");
         /*
          * creazione del comando 
          */
         Statement comando = connessione.createStatement
            (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

         ResultSet risultatoQuery = comando.executeQuery
            ("SELECT * FROM UrlDistinti;");


         int i = 0;
         while (risultatoQuery.next()) {
            i++;
         }
         System.out.println(" -> Numero di diversi concetti:" + i);
         /*
          * se il ResultSet è vuoto restituisce una matrice con una sola
          * stringa vuota e si interrompe l'esecuzione del metodo, 
          * altrimenti l'esecuzione del metodo prosegue
          */
         if (i == 0){
            String[] urldistinti = new String[1];
            urldistinti[0] = "";
            return urldistinti;
         }
         /*
          * posizionamento alla prima riga del ResultSet
          */
         risultatoQuery.first();
         /*
          * creazione dell'array di stringhe in base alla 
          * dimensione del ResultSet
          */
         String[] URLdistinti = new String[i];
         /*
          * popolamento dell'array
          */
         for (int j = 0; j < URLdistinti.length; j++){
            URLdistinti[j] = risultatoQuery.getString(1);
            risultatoQuery.next();
         }
         return URLdistinti;

      /*
       * gestione esplicita delle eccezioni
       * nessuna azione correttiva intrapresa di fronte ad 
       * eventuali eccezioni
       * visualizzazione di un messaggio
       */
      }catch (Exception e){
         System.out.println("Problemi di connessione al database, riprovare.");
         System.out.println(e.getMessage());
         String[] urldistinti = new String[1];
         urldistinti[0] = "";
         return urldistinti;
      }
   }

   /*
    * Metodo IstruzioneDiCreazioneTabella()
    * crea la stringa con l'istruzione SQL per la creazione 
    * della tabella in base ai concetti relativi alle pagine
    */
   public String IstruzioneDiCreazioneTabella(){
      Concetti = DistinctConcepts();
      String istruzione = "CREATE TABLE MatrixCluster (" + visitorsession +"ID INTEGER, ";
      for (int i=0; i < Concetti.length-1; i++){
         istruzione = istruzione + Concetti[i].replace('.','_') + " INTEGER, ";
      }
      istruzione = istruzione +
            Concetti[Concetti.length-1].replace('.','_') +" INTEGER);";

      return istruzione;

   }

   /*
    * Metodo getFieldNumber
    * fa ritornare il numero del campo relativo al concetto 
    *  passato al metodo
    */
   public int getFieldNumber(String Concetto){
      for (int i=0; i < Concetti.length; i++){
         if (Concetto.equalsIgnoreCase(Concetti[i]))
            return i;
      }
      return 100000000;
   }

   /*
    * Metodo CreateMatrix
    * crea la matrice dei dati per l'analisi
    * esegue le istruzioni SQL per la creazione della tabella
    */
   public void CreateMatrix(){
      try{
         /*
          * registrazione del driver jdbc (bridge jdbc-odbc)
          */
         Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");  //registra driver
         /*
          * creazione della connessione al database "sessions"
          */
         Connection connessione = DriverManager.getConnection("jdbc:odbc:sessions");
         /*
          * creazione del comando 
          */
         Statement comando = connessione.createStatement
            (ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

         ResultSet risultatoQuery;
         String vs;
         if (visitorsession.equals("visitor")){
               risultatoQuery = comando.executeQuery
                  ("SELECT Max(Visitor), Min(Visitor) FROM SequencesVisitor;");
               vs = "visitatori";
         }else{
               risultatoQuery = comando.executeQuery
                  ("SELECT Max(session), Min(session) FROM SequencesSessions;");
               vs = "sessioni";
         }
         risultatoQuery.first();

         int MaxVisitorID = risultatoQuery.getInt(1);
         MinVisitorID = risultatoQuery.getInt(2);
         int NumberOfVisitors = MaxVisitorID - MinVisitorID;

         System.out.println(" -> Numero di " + vs + ": " + NumberOfVisitors);

         int ColonneMatrice = Concetti.length;


         int[][] DataMatrix = new int[NumberOfVisitors+1][ColonneMatrice];

         System.out.println("Inizializzazione della matrice...");

         for (int i=0;i < NumberOfVisitors+1; i++){
            for (int j=1; j < ColonneMatrice; j++){
               DataMatrix[i][j] = 0;
            }
         }

         if (visitorsession.equals("visitor")){
            risultatoQuery = comando.executeQuery("SELECT * FROM SequencesVisitor;");
         }else{
            risultatoQuery = comando.executeQuery("SELECT * FROM SequencesSessions;");
         }
         System.out.println("Conteggio del numero di records...");

         int numeroRecords = 0;
         while (risultatoQuery.next()){
            numeroRecords++;
         }

         System.out.println(" -> Numero di records: " + numeroRecords);

         System.out.println("Inserimento dei dati nella matrice...");


         if (normalbinary.equals("normal")){
            risultatoQuery.beforeFirst();
            int VisitorID;
            String ConceptURL;
            int Occurrence;
            while (risultatoQuery.next()){

               VisitorID = risultatoQuery.getInt(1);
               ConceptURL = risultatoQuery.getString(3);
               Occurrence = risultatoQuery.getInt(2);
               DataMatrix  [VisitorID - MinVisitorID]
                        [getFieldNumber(ConceptURL)] = Occurrence;
            }

         }else{
            risultatoQuery.beforeFirst();
            int VisitorID;
            String ConceptURL;
            int Occurence;
            while (risultatoQuery.next()){

               VisitorID = risultatoQuery.getInt(1);
               ConceptURL = risultatoQuery.getString(3);
               Occurence = risultatoQuery.getInt(2);
               if (Occurence != 0){
                  Occurence = 1;
               }
               DataMatrix  [VisitorID - MinVisitorID]
                        [getFieldNumber(ConceptURL)] = Occurence;
            }
         }

         String addInTable;

         System.out.println("Inserimento dei dati nella tabella...");

         for (int i=0; i < NumberOfVisitors+1; i++){
            addInTable = "INSERT INTO MatrixCluster VALUES(" + (i+MinVisitorID);
               for (int j=0; j < ColonneMatrice; j++){
                  addInTable = addInTable + ", " + DataMatrix[i][j];
               }
            addInTable = addInTable + ");";
            comando.executeUpdate(addInTable);
         }


         System.out.println("Processo riuscito!");
         System.exit(0);


      /*
       * gestione esplicita delle eccezioni
       * nessuna azione correttiva intrapresa di fronte ad eventuali eccezioni
       * visualizzazione di un messaggio
       */
      }catch (Exception e){
         System.out.println("Problemi di connessione al database, riprovare.");
         System.out.println(e.getMessage());
      }
   }

   /*
    * Metodo ReOrganizer()
    * stabilisce la prima connessione al database e richiama gli altri metodi
    */
   public void ReOrganizer(){
      try{


         /*
          * registrazione del driver jdbc (bridge jdbc-odbc)
          */
         Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");  //registra driver
         /*
          * creazione della connessione al database "sessions"
          */
         Connection connessione = DriverManager.getConnection("jdbc:odbc:sessions");
         /*
          * creazione del comando 
          */
         Statement comando = connessione.createStatement();

         deleteMatrixCluster();

         System.out.println("Creazione della struttura...");
         comando.executeUpdate(IstruzioneDiCreazioneTabella());

         System.out.println("Creazione della matrice...");

         CreateMatrix();
      /*
       * gestione esplicita delle eccezioni
       * nessuna azione correttiva intrapresa di fronte ad eventuali eccezioni
       * visualizzazione di un messaggio
       */
      }catch (Exception e){
         System.out.println("Problemi di connessione al database, riprovare.");
         System.out.println(e.getMessage());
      }

   }

   /*
    * Metodo deleteMatrixCluster
    * eventuale eliminazione della tabella 'MatrixCluster' già esistente
    * nel database
    */
   public void deleteMatrixCluster(){
      try{


         /*
          * registrazione del driver jdbc (bridge jdbc-odbc)
          */
         Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");  //registra driver
         /*
          * creazione della connessione al database "sessions"
          */
         Connection connessione = DriverManager.getConnection("jdbc:odbc:sessions");
         /*
          * creazione del comando 
          */
         Statement comando = connessione.createStatement();

         comando.executeUpdate("DROP TABLE MatrixCluster;"); //da eliminare

      /*
       * gestione esplicita delle eccezioni
       * nessuna azione correttiva intrapresa di fronte ad eventuali eccezioni
       */
      }catch (Exception e){
      }
   }

   /*
    * Inizio dell'applicazione
    * Crea un nuovo oggetto reOrganizeTable ed esegue il metodo ReOrganizer
    */
   public static void main(String args[]){
      try{
         reOrganizeTable rot = new reOrganizeTable(args[0],args[1]);
         System.out.println("Riorganizzazione della tabella per clustering...");
         rot.ReOrganizer();
      }catch (Exception e){
         System.out.println("Inserire i 2 parametri.");
         System.out.println("La prima stringa stabilisce il metodo:");
         System.out.println("\"normal\" = crea la matrice con il numero di visite");
         System.out.println("di ogni utente per ogni pagina;");
         System.out.println("\"binary\" = crea la matrice con i valori 0 e 1");
         System.out.println("(1 se l'utente ha visitato almeno una pagina, 0 altrimenti).");
         System.out.println("La seconda stringa stabilisce se utilizzare come");
         System.out.println("osservazioni:");
         System.out.println("\"visitor\" = gli utenti;");
         System.out.println("\"session\" = le sessioni.");
         System.out.println("I parametri vanno inseriti con caratteri minuscoli ");
         System.out.println("omettendo le virgolette (\").");
         System.exit(0);
      }

   }
}