Home | Software | Analisi | Links | Glossario | Bibliografia
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);
}
}
}