Capitolul 1. Statistici web............................................................. 7 ! Votare online i analiza rezultatelor Capitolul 2. Clasificarea bazat pe cei mai apropiai vecini.. 18 ! Prezentarea grafic a regiunilor de decizie Capitolul 3. Clasificarea bazat pe arbori de decizie ............ 30 ! tiri personalizate pe baza profilurilor utilizatorilor Capitolul 4. Inducia regulilor de asociere.............................. 49 ! Achiziii online i analiza coului de cumprturi
Partea 2. Explorarea coninutului
Capitolul 5. Reele neuronale .................................................... 67 ! Predicia traficului pe un site ! Detecia spam-ului Capitolul 6. Clasificarea bayesian........................................... 99 ! Detecia spam-ului ! Relevana cutarilor n documente Capitolul 7. Partiionarea k-medii .......................................... 112 ! Vizualizarea procesului de partiionare k-medii ! Partiionarea documentelor
Partea 3. Explorarea structurii
Capitolul 8. Motoare de cutare .............................................. 135 ! Indexarea i cutarea ntr-un site Capitolul 9. Relevana paginilor web .................................... 146 ! Algoritmul PageRank id252619031 pdfMachine by Broadgun Software - a great PDF writer! - a great PDF creator! - http://www.pdfmachine.com http://www.broadgun.com Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com EXPLORAREA UTILIZRII
Capitolul 1. Statistici web ! Votare online i analiza rezultatelor
Capitolul 2. Clasificarea bazat pe cei mai apropiai vecini ! Prezentarea grafic a regiunilor de decizie
Capitolul 3. Clasificarea bazat pe arbori de decizie ! tiri personalizate pe baza profilurilor utilizatorilor
Capitolul 4. Inducia regulilor de asociere ! Achiziii online i analiza coului de cumprturi
Partea id252658125 pdfMachine by Broadgun Software - a great PDF writer! - a great PDF creator! - http://www.pdfmachine.com http://www.broadgun.com Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com 7 Capitolul 1
STATISTICI WEB
n acest capitol vom descrie o modalitate preprocesare a unei baze de date cu voturi exprimate online, prin eliminarea valorilor extreme nainte de aplicarea analizei statistice. Pentru a testa programul, mai nti se va genera o baz de date cu voturi, ca punct de plecare pentru programul principal. ntr-un mediu de execuie real, acest pas va fi desigur omis. Programul principal ncarc voturile exprimate, permite votarea propriu-zis online i afieaz media voturilor calculat n diferite modaliti.
Aplicaia 1.1. Generarea unei baze de date de voturi pe baza unui model predefinit.
using System; using System.IO;
namespace GenDB { class Program { static void Main(string[] args) { StreamWriter sw = new StreamWriter("database.txt"); Random r = new Random();
for (int i = 0; i < 1000; i++) { int varsta = r.Next(4); int sex = r.Next(2); int tara = r.Next(3); int vot = 1;
switch (tara) { case 0: if (sex == 0) vot = 8 + (int)(r.NextDouble() - 0.5) * 2;
id251885015 pdfMachine by Broadgun Software - a great PDF writer! - a great PDF creator! - http://www.pdfmachine.com http://www.broadgun.com Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea utilizrii
8 else vot = 5 + (int)(r.NextDouble() - 0.5) * 2; break; case 1: if (sex == 0) vot = 10 + (int)(r.NextDouble() - 0.5) * 2; else vot = 5 + (int)(r.NextDouble() - 0.5) * 2; break; case 2: vot = 7 + (int)(r.NextDouble() - 0.5) * 2; break; }
if (r.NextDouble() < 0.05) vot = 2 + (int)(r.NextDouble() - 0.5) * 2;
Console.WriteLine("Fisierul a fost generat."); Console.ReadKey();
} } }
Figura 1.1. Mesaj de confirmare pentru generarea bazei de date de test Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Statistici web
9 Coninutul bazei de date este prezentat n figura 1.2.
Figura 1.2. Extras din baza de date de voturi
Aplicaia 1.2. Programul principal, n care utilizatorii pot vota. Votul se poate realiza cu note ntregi, de la 1 la 10, sau mai simplu, prin calificative, care vor fi transformate automat n note. Afiarea rezultatelor (mediei voturilor) se face n trei variante: media aritmetic efectiv, media aritmetic a voturilor rmase prin eliminarea a 10% din valorile extreme i media aritmetic a voturilor rmase n intervalul determinat de o deviaie standard (1), considernd distribuia voturilor ca o distribuie normal.
1.2.1. Default.aspx.cs nregistreaz un vot exprimat online.
Proiectarea interfeei grafice este prezentat n figura 1.3. n dreptul controalelor sunt indicate tipul i numele utilizate ulterior n codul surs. Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea utilizrii
10
Figura 1.3. Proiectarea interfeei grafice pentru nregistrarea unui vot
using System; using System.IO;
public partial class _Default : System.Web.UI.Page { protected void ButtonVoteaza_Click(object sender, EventArgs e) { // apasare buton
bool ok = true; int age = RadioButtonListCategVarsta.SelectedIndex; int sex = RadioButtonListSex.SelectedIndex; int tara = DropDownListTara.SelectedIndex;
int nota = -1; if (RadioButtonListTipVot.SelectedIndex == 0) // vot simplu { switch (DropDownListVotSimplu.SelectedIndex) { case 0: nota = 0; // foarte rau break; case 1: nota = 2; // rau break; Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Statistici web
11 case 2: nota = 5; // mediu break; case 3: nota = 8; // bine break; case 4: nota = 10; // foarte bine break; } } else // vot complex { try { nota = Convert.ToInt32(TextBoxVotComplex.Text); } catch // daca nu a fost introdusa o valoare numerica { ok = false; }
if (nota < 0 || nota > 10) // nota trebuie sa fie intre 0 si 10 ok = false; }
if (ok) { StreamWriter sw = new StreamWriter(Server.MapPath(".") + "\\records.log", true); sw.WriteLine("" + age + "\t" + sex + "\t" + tara + "\t" + nota); sw.Close(); Response.Redirect("Recorded.htm"); } } }
1.2.2. Recorded.htm Pagina HTML de confirmare a introducerii unui vot.
<html> <head> <title>Vot inregistrat</title> </head> <body> <p>Votul a fost inregistrat</p> <p><a href="Default.aspx">Inapoi</a></p> <p><a href="Statistics.aspx">Vezi statistici</a></p> Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea utilizrii
12 </body> </html>
1.2.3. Statistics.aspx.cs Calculeaz i afieaz statisticile voturilor. Utilizatorul are posibilitatea de a selecta submulimea de date pentru analiz. ntruct profilul utilizatorului este dat de ar, sex i vrst, analiza poate fi realizat pentru toate aceste valori sau pentru segmentele dorite: doar o anumit ar, doar un anumit sex sau doar o categorie de vrst.
Figura 1.4. Proiectarea interfeei grafice pentru afiarea statisticilor
using System; using System.IO;
public partial class Statistics : System.Web.UI.Page { int[,] date; int[,] date_sel; int nr_date, nr_date_sel;
protected void Page_Load(object sender, EventArgs e) { const int MaxData = 10000; date = new int[MaxData, 4]; // datele initiale date_sel = new int[MaxData, 4]; // datele din selectie
StreamReader sr = new StreamReader(Server.MapPath(".") + "\\records.log"); Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Statistici web
13 int i = 0;
while (sr.Peek() != -1) { string line = sr.ReadLine(); string[] toks = line.Split();
protected void ButtonAnaliza_Click(object sender, EventArgs e) { int tara = DropDownListTara.SelectedIndex; int sex = DropDownListSex.SelectedIndex; int varsta = DropDownListVarsta.SelectedIndex;
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea utilizrii
16 ntreaga aplicaie n execuie poate fi urmrit n figurile urmtoare: introducerea unui vot (figura 1.5), confirmarea nregistrrii votului i alegerea aciunii urmtoare introducerea unui nou vot sau afiarea statisticilor (figura 1.6), respectiv afiarea mediei voturilor calculat n trei variante diferite una direct i dou pe baza preprocesrii datelor i eliminrii valorilor extreme (figura 1.7).
Figura 1.5. Introducerea unui vot
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Statistici web
17
Figura 1.6. Confirmarea nregistrrii votului i alegerea aciunii urmtoare
Figura 1.7. Afiarea statisticilor
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com 18 Capitolul 2
CLASIFICAREA BAZAT PE CEI MAI APROPIAI VECINI
n acest capitol vom prezenta o serie de programe utile n lucrul cu clasificatori bazai pe cei mai apropiai vecini.
Aplicaia 2.1. Calcularea distanelor unei instane noi fa de instanele din setul de antrenare. Se utilizeaz distana euclidian i ponderarea atributelor.
using System; using System.IO;
namespace Distante { class Program { static void Main(string[] args) { StreamReader sr = new StreamReader("date.txt"); const int noAttrib = 5; const int noInst = 14;
double[,] date = new double[noInst, noAttrib]; for (int i = 0; i < noInst; i++) { string line = sr.ReadLine(); string[] toks = line.Split(" \t".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); for (int j = 0; j < noAttrib; j++) date[i, j] = Convert.ToDouble(toks[j]); }
sr.Close();
// instanta noastra double[] testInst = new double[] { 0, 0.52, 0.16, 0 }; //double[] testInst = new double[] { 0, 0.33, 0.84, 1 }; //double[] testInst = new double[] { 0, 0.32, 0.86, 1 }; id251976671 pdfMachine by Broadgun Software - a great PDF writer! - a great PDF creator! - http://www.pdfmachine.com http://www.broadgun.com Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Clasificarea bazat pe cei mai apropiai vecini
19 StreamWriter sw = new StreamWriter("distante.txt");
if (clasaImpusa == -1) { sw.WriteLine("\r\nVoturi pentru da/1 : " + voturiPentruDa + "\r\nVoturi pentru nu/0 : " + voturiPentruNu); } Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea utilizrii
20 sw.Close(); } } }
n figura 2.1 se prezint datele din setul de antrenare. n figura 2.2 sunt precizate distanele fa de fiecare instan din acest set, ponderile influenelor acestor instane, invers proporionale cu ptratul distanelor, precum i importana instanelor n cazul n care atributele au ponderi diferite. Considernd fiecare instan din setul de antrenare ca aparinnd unei clase, n final se prezint suma voturilor ponderate cu privire la apartenena instanei noi la una din cele dou clase.
Figura 2.1. Instanele din setul de antrenare
Figura 2.2. Calculul distanelor i clasificarea instanei noi
Aplicaia 2.2. Pentru a evita influena disproporionat de mare a atributelor cu domeniu de definiie mai mare, de obicei se normalizeaz Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Clasificarea bazat pe cei mai apropiai vecini
21 valorile atributelor ntre 0 i 1. Programul urmtor normalizeaz o valoare ntre minimul i maximul domeniului de definiie.
Figura 2.3. Proiectarea interfeei aplicaiei de normalizare
using System; using System.Windows.Forms;
namespace Normalizare { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void buttonNorm_Click(object sender, EventArgs e) { double min = Convert.ToDouble(textBoxMin.Text); double max = Convert.ToDouble(textBoxMax.Text); double val = Convert.ToDouble(textBoxVal.Text);
double valNorm = (val - min) / (max - min);
textBoxNorm.Text = valNorm.ToString(); }
} } Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea utilizrii
22
Figura 2.3. Aplicaia de normalizare n execuie
Aplicaia 2.3. O bibliotec DLL care implementeaz clasificatorul k-Nearest Neighbor.
2.3.1. knn.cs Codul surs al bibliotecii DLL.
using System; using System.Collections.Generic;
namespace KNNClassifier { /// <summary> /// Clasificatorul k-nearest neighbors /// </summary> public class KNN { public readonly List<Instance> Instances; public int NoClasses;
public KNN(List<Instance> trainingSet, int numberOfClasses) { this.Instances = trainingSet; this.NoClasses = numberOfClasses; }
public void AddInstance(Instance instance) { Instances.Add(instance); }
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Clasificarea bazat pe cei mai apropiai vecini
23 public void Clear() { Instances.Clear(); }
/// <summary> /// Clasificarea propriu-zisa /// </summary> /// <param name="inst">Instanta noua care trebuie clasificata</param> /// <param name="k">Numarul de vecini</param> /// <returns>Clasa (>=0) sau -1 in caz de eroare</returns> public int Classify(Instance inst, int k) { if (Instances == null) throw new Exception("Setul de antrenare nu este initializat"); if (Instances.Count == 0) throw new Exception("Setul de antrenare nu contine nicio instanta");
if (k > Instances.Count) throw new Exception("Sunt mai putine instante in setul de antrenare decat k");
double[,] distances = new double[Instances.Count, 2];
for (int i = 0; i < Instances.Count; i++) { Instance existingInstance = Instances[i];
distances[i, 0] = dist; // poate fi Math.Sqrt(dist) distances[i, 1] = i; }
ShellSort(distances, Instances.Count);
if (k == 1) { Instance nn = Instances[(int)distances[0, 1]]; return nn.Class; } else { Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea utilizrii
24 double[] votes = new double[NoClasses];
for (int m = 0; m < k; m++) { Instance nn = Instances[(int)distances[m, 1]];
if (distances[m, 0] < 1e-12) return nn.Class;
votes[nn.Class] += 1 / (distances[m, 0] * distances[m, 0]); // poate fi si: votes[nn.Class] += 1 / Math.Exp(-distances[m,0]); }
int maxIndex = 0; double max = votes[0];
for (int m = 1; m < NoClasses; m++) { if (votes[m] > max) { max = votes[m]; maxIndex = m; } } return maxIndex; } }
/// <summary> /// Sortarea crescatoare a distantelor /// </summary> /// <param name="v"></param> /// <param name="len"></param> private void ShellSort(double[,] v, int len) { int dist, i, j; double aux;
for (dist = len / 2; dist > 0; dist /= 2) for (i = dist; i < len; i++) for (j = i - dist; j >= 0 && v[j, 0] > v[j + dist, 0]; j -= dist) { aux = v[j, 0]; v[j, 0] = v[j + dist, 0]; v[j + dist, 0] = aux; aux = v[j, 1]; v[j, 1] = v[j + dist, 1]; v[j + dist, 1] = aux; } } } } Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Clasificarea bazat pe cei mai apropiai vecini
25 2.3.2. Instance.cs Clasa corespunztoare unei instane
namespace KNNClassifier { public class Instance { public double[] AttributeValues; public int Class;
/// <summary> /// Constructorul /// </summary> /// <param name="values">Valorile atributelor (normalizate intre 0 si 1)</param> /// <param name="instanceClass">Clasa careia apartine instanta</param> public Instance(double[] values, int instanceClass) { this.AttributeValues = values; this.Class = instanceClass; } } }
Aplicaia 2.4. Program care utilizeaz clasa knn.dll pentru a realiza o clasificare a instanelor date dintr-o interfa grafic. Utilizatorul seteaz puncte de dou culori ntr-o regiune de desenare. Punctele roii (gri mai deschis n figurile de mai jos) se seteaz cu click stnga iar punctele albastre (gri mai nchis) cu click dreapta. Programul apoi calculeaz clasa pentru fiecare pixel din zona de desenare. Rezultatul exprim regiunile de decizie ale clasificatorului considerat. Numrul de vecini luat n calcul este dat prin program la apelul funciei de clasificare: inst.Class = knn.Classify(inst,3). Apsarea butonului Draw determin desenarea regiunilor de decizie, iar apsarea butonului Clear determin tergerea instanelor de antrenare (a punctelor) curente.
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea utilizrii
26
Figura 2.4. Proiectarea interfeei programului de determinare a regiunilor de decizie
using System; using System.Drawing; using System.Collections.Generic; using System.Windows.Forms;
using KNNClassifier;
namespace RegiuniNN { public class Form1 : System.Windows.Forms.Form { private KNN knn;
public Form1() { InitializeComponent();
knn = new KNN(new System.Collections.Generic.List<Instance>(), 2); }
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Clasificarea bazat pe cei mai apropiai vecini
if (e.Button == MouseButtons.Left) cl = 0; else if (e.Button == MouseButtons.Right) cl = 1;
if (cl != -1) // s-a apasat ori butonul stang ori cel drept { double[] val = new double[2]; val[0] = e.X / (double)pictureBox.Width; val[1] = e.Y / (double)pictureBox.Height; Instance inst = new Instance(val, cl); knn.AddInstance(inst); pictureBox.Refresh(); } }
private void DrawDatabaseInstances(Graphics g) { for (int i = 0; i < knn.Instances.Count; i++) { Instance inst = knn.Instances[i]; int x = (int)(inst.AttributeValues[0] * pictureBox.Width); int y = (int)(inst.AttributeValues[1] * pictureBox.Height); int cl = inst.Class;
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea utilizrii
28 if (cl == 0) { g.FillEllipse(Brushes.Red, x - 4, y - 4, 8, 8); g.DrawEllipse(Pens.Pink, x - 4, y - 4, 8, 8); } else // if (cl == 1) { g.FillEllipse(Brushes.Blue, x - 4, y - 4, 8, 8); g.DrawEllipse(Pens.Green, x - 4, y - 4, 8, 8); } } }
for (int x = 0; x < pictureBox.Width; x++) for (int y = 0; y < pictureBox.Height; y++) { double[] val = new double[2]; val[0] = x / (double)pictureBox.Width; val[1] = y / (double)pictureBox.Height; Instance inst = new Instance(val, -1);
try { int k = 1; // poate fi > 1 inst.Class = knn.Classify(inst, k); } catch (Exception ex) { MessageBox.Show(ex.Message); return; }
if (inst.Class == 0) g.FillRectangle(Brushes.Red, x, y, 1, 1); else if (inst.Class == 1) g.FillRectangle(Brushes.Blue, x, y, 1, 1); }
DrawDatabaseInstances(g); } } }
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Clasificarea bazat pe cei mai apropiai vecini
29 Evoluia programului n timpul execuiei poate fi urmrit n figurile urmtoare: punctele selectate, instanele de antrenare n figura 2.5 i regiunile de decizie ale clasificatorului n figura 2.6.
Figura 2.5. Instanele de antrenare
Figura 2.6. Regiunile de decizie ale clasificatorului
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com 30 Capitolul 3
CLASIFICAREA BAZAT PE ARBORI DE DECIZIE
n acest capitol vom prezenta o serie de aplicaii bazate pe o alt metod de clasificare, i anume cea a arborilor de decizie. Scopul suitei de aplicaii este realizarea unui site pe care utilizatorii s se nregistreze i s-i creeze un profil personal, iar la autentificarea pe site acesta s le furnizeze tiri din domenii personalizate, n funcie de profil (atribute explicite) i momentul logrii (atribut implicit). Deoarece aceti algoritmi sunt oarecum dificili, am decis s utilizm implementarea Weka, disponibil gratuit la adresa http://www.cs.waikato.ac.nz/ml/weka, care conine o suit de algoritmi de data mining open-source, descrii n volumul: I. H. Witten, E. Frank, Data Mining: Practical machine learning tools with Java implementations, Morgan Kaufmann, San Francisco, 2000. Weka utilizeaz un format specific, ARFF (Attribute-Relation File Format), pentru descrierea seturilor de date de antrenare.
Aplicaia 3.1. Generarea unei baze de date pentru profilul utilizatorilor, folosit pentru testarea algoritmilor de construcie a arborilor de decizie. Setul de date de antrenare este salvat ntr-un fiier cu formatul ARFFF. Se creeaz un att un fiier care conine i atribute reale, pentru aplicarea algoritmului C4.5, ct i un fiier n care valorile reale sunt discretizate, pentru aplicarea algoritmului mai simplu ID3. Utilizatorul poate decide dac datele generate vor conine zgomot (clase eronate) i proporia sa n setul de antrenare.
using System; using System.IO;
namespace GenerateDatabase { class Program { static void Main(string[] args) { StreamWriter sw = new StreamWriter("profiles.arff");
id252073906 pdfMachine by Broadgun Software - a great PDF writer! - a great PDF creator! - http://www.pdfmachine.com http://www.broadgun.com Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Clasificarea bazat pe arbori de decizie
31 StreamWriter swDiscr = new StreamWriter("profilesDiscretized.arff"); Random r = new Random();
/* @RELATION profiles
@ATTRIBUTE age REAL @ATTRIBUTE domain {Tehnic, Social} @ATTRIBUTE time REAL @ATTRIBUTE class {Politice, Sportive, Mondene}
@DATA */
sw.WriteLine("@RELATION profiles\r\n\r\n@ATTRIBUTE age REAL\r\n@ATTRIBUTE domain {Tehnic, Social}\r\n" + "@ATTRIBUTE time REAL\r\n@ATTRIBUTE class {Politice, Sportive, Mondene}\r\n\r\n@DATA");
/* @RELATION profiles-discretized
@ATTRIBUTE age {VeryLow, Low, Medium, High, VeryHigh} @ATTRIBUTE domain {Tehnic, Social} @ATTRIBUTE time {Night, Morning, Afternoon, Evening} @ATTRIBUTE class {Politice, Sportive, Mondene}
@DATA */
swDiscr.WriteLine("@RELATION profiles\r\n\r\n@ATTRIBUTE age {VeryLow, Low, Medium, High, VeryHigh}\r\n@ATTRIBUTE domain {Tehnic, Social}\r\n" + "@ATTRIBUTE time {Night, Morning, Afternoon, Evening}\r\n@ATTRIBUTE class {Politice, Sportive, Mondene}\r\n\r\n@DATA");
int noInstances = 1000; bool hasNoise = false;
for (int i = 0; i < noInstances; i++) { int varsta = 12 + r.Next(60); int domeniu = r.Next(2); int timp = r.Next(24); int clasa = 1;
if (domeniu == 1) // Social { Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea utilizrii
32 if (varsta < 40) clasa = 2; // Mondene else clasa = 0; // Politice } else // Tehnic { if (varsta < 30) clasa = 1; // Sportive else { if (timp > 18) clasa = 0; // Politice else clasa = 2; // Mondene } }
if (hasNoise && r.NextDouble() < 0.1) clasa = r.Next(3);
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Clasificarea bazat pe arbori de decizie
33 private static string NewsCategory(int clasa) { switch (clasa) { case 0: return "Politice"; case 1: return "Sportive"; case 2: return "Mondene"; } return string.Empty; }
private static int Discretizare(int valoare, int min, int max, int nrIntervale) { int x = nrIntervale * (valoare - min) / (max - min); if (valoare >= max) x = nrIntervale - 1; return x; }
private static string Age(int index) { switch (index) { case 0: return "VeryLow"; case 1: return "Low"; case 2: return "Medium"; case 3: return "High"; case 4: return "VeryHigh"; } return string.Empty; }
private static string TimeOfDay(int index) { switch (index) { case 0: return "Night"; case 1: return "Morning"; case 2: return "Afternoon"; case 3: return "Evening"; } return string.Empty; } } } Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea utilizrii
34 Fiierele generate sunt prezentate n figurile 3.1 i 3.2.
Figura 3.1. Fiier cu date de antrenare coninnd atribute reale
Figura 3.2. Fiier cu date de antrenare n care atributele reale sunt discretizate
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Clasificarea bazat pe arbori de decizie
35 Aplicaia 3.2. Programul utilizeaz algoritmii C4.5 i ID3 implementai n Weka pentru a construi arborii de decizie afereni fiierelor generate n aplicaia anterioar. Deoarece algoritmii Weka sunt implementai n limbajul Java, acetia pot fi compilai sub platforma .NET n J#, sub form de biblioteci DLL. Ulterior, aceste DLL-uri pot fi refereniate n orice soluie .NET, inclusiv n proiecte C#, de unde funciile de construcie a arborilor de decizie pot fi apelate direct.
using System; using System.Collections.Generic; using System.Text;
namespace WekaTest { class Program { static void Main(string[] args) { weka.classifiers.trees.J48 c45 = new weka.classifiers.trees.J48(); Console.WriteLine("C45"); Console.Write(weka.classifiers.Evaluation.evaluateModel( c45, new string[] { "-t", "profiles.arff" }));
double[] attvals = new double[] { 30, 0, 20, -1 }; weka.core.Instance t = new weka.core.Instance(1, attvals); t.setDataset(c45.sample.dataset()); Console.WriteLine("\r\nClassified as: " + c45.classifyInstance(t));
Console.WriteLine("\r\n\r\nID3"); weka.classifiers.trees.Id3 id3 = new weka.classifiers.trees.Id3(); ; Console.Write(weka.classifiers.Evaluation.evaluateModel( id3, new string[] { "-t", "profilesDiscretized.arff" }));
// Medium/2, Tehnic/0, Morning/1 => Mondene/2 attvals = new double[] { 2, 0, 1, -1 }; t = new weka.core.Instance(1, attvals); Console.WriteLine("\r\nClassified as: " + id3.classifyInstance(t)); } } }
ntruct aplicaia de test este de tip consol, pentru efectul estetic algoritmii au fost rulai pe rnd, iar rezultatele sunt prezentate n figurile 3.3 i 3.4. Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea utilizrii
36
Figura 3.3. Arborele de decizie generat de algoritmul C4.5
Figura 3.4. Arborele de decizie generat de algoritmul ID3
Aplicaia 3.3. Aplicaia web propriu-zis, care permite nregistrarea i autentificarea utilizatorilor, crearea de profiluri, i prezentarea categoriei Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Clasificarea bazat pe arbori de decizie
37 personalizate de tiri pe baza arborelui de decizie indus din setul de antrenare.
3.3.1. Login.aspx.cs Pagina de start n care utilizatorul i poate crea un cont i se poate autentifica.
Proiectarea interfeei grafice este detaliat n figura 3.5.
Figura 3.5. Proiectarea interfeei grafice pentru pagina de autentificare
using System; using System.IO;
public partial class _Default : System.Web.UI.Page { protected void ButtonNew_Click(object sender, EventArgs e) { // creeaza un cont nou Response.Redirect("NewAccount.aspx"); }
protected void ButtonLogin_Click(object sender, EventArgs e) { // intra in cont
StreamReader sr = new StreamReader(Server.MapPath(".") + "\\users.txt"); while (sr.Peek() != -1) // citeste pana la sfarsitul fisierului { string line = sr.ReadLine(); // citeste cate o linie din fisier Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea utilizrii
38 string[] words = line.Split(); // imparte linia in cuvinte
if (words[0] == username && words[1] == Utils.HashPassword(password)) { exists = true; up = new UserProfile(); up.Name = username; up.Field = words[2]; up.Age = Convert.ToInt32(words[3]);
DateTime now = DateTime.Now;
if (now.Hour < 6) up.Time = "Noapte"; else if (now.Hour < 12) up.Time = "Dimineata"; else if (now.Hour < 18) up.Time = "Zi"; else up.Time = "Seara";
up.ExactTime = now.Hour;
break; // am gasit utilizatorul, iesim din bucla } } sr.Close();
if (!exists) // daca nu exista utilizatorul { Response.Redirect("InvalidUser.aspx"); } else // utilizator corect { // redirectare la pagina de stiri Session["User"] = up; Response.Redirect("CustomNews.aspx"); }
} }
3.3.2. Utils.cs Clasele necesare pentru criptarea parolei i pentru profilul utilizatorului.
using System; using System.Security.Cryptography;
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Clasificarea bazat pe arbori de decizie
39 public class Utils { public static string HashPassword(string pass) { HashAlgorithm sha = new SHA1CryptoServiceProvider(); byte[] buf = new byte[pass.Length]; for (int i = 0; i < pass.Length; i++) buf[i] = (byte)pass[i]; byte[] result = sha.ComputeHash(buf); return Convert.ToBase64String(result); } }
public class UserProfile { public string Name; // din autentificare public string Field; // din profilul inregistrat public string Time; // din program, momentul logarii public int ExactTime; // ora logarii public int Age; // din profilul inregistrat }
3.3.2. InvalidUser.aspx Pagin de eroare n caz c utilizatorul greete parola sau introduce un nume de autentificare inexistent.
Figura 3.6. Pagina de eroare la autentificare
3.3.3. NewAccount.aspx.cs Pagina pentru crearea unui cont nou i completarea profilului de utilizator. Noul cont este introdus n baza de date. Utilizatorul trebuie s-i completeze detaliile personale. Parola este criptat nainte de salvarea n baza de date. Astfel, se calculeaz un cod de hash pentru parol, care este salvat. n momentul n care un utilizator introduce parola pe pagin, codul de hash se calculeaz din nou, i acesta este comparat cu codul din baza de date. Acestea nu pot coincide dect dac nsei parolele coincid. n acest fel, parolele sunt stocate nicieri n clar i nici nu pot fi determinate pe baza codurilor de hash.
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea utilizrii
40
Figura 3.7. Proiectarea interfeei grafice pentru crearea unui cont nou
using System; using System.IO;
public partial class NewAccount : System.Web.UI.Page { protected void ButtonCreate_Click(object sender, EventArgs e) { string username = TextBoxUserName.Text; string password = TextBoxPass.Text; int field = DropDownListField.SelectedIndex; int age = 0;
bool ok = true; // daca datele introduse sunt corecte
try { age = Convert.ToInt32(TextBoxAge.Text); // converteste string in int } catch // daca in TextBoxAge nu este o valoare numerica { ok = false; }
if (username == "" || password == "" || age < 0 || age > 150) ok = false;
if (ok) { // deschide pentru actualizare/adaugare StreamWriter sw = new StreamWriter(Server.MapPath(".") + "\\users.txt", true);
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Clasificarea bazat pe arbori de decizie
41 // se poate testa daca nu exista deja un utilizator cu acelasi nume
// parolele NU trebuie stocate in clar sw.WriteLine(username + "\t" + Utils.HashPassword(password) + "\t" + field + "\t" + age);
sw.Close();
Response.Redirect("AccountOK.aspx"); } } }
n figura 3.8 se prezint baza de date a conturilor utilizatorilor. Se poate observa numele, codul hash al parolei i datele profilului personal.
Figura 3.8. Baza de date a conturilor
3.3.4. AccountOK.aspx Pagin de confirmare a crerii cu succes a unui nou cont.
Figura 3.9. Pagina de confirmare a crerii cu succes a unui nou cont
3.3.5. CustomNews.aspx.cs Generarea dinamic a unei pagini de tiri personalizate, n conformitate cu profilul utilizatorului curent. Determinarea categoriei de tiri este realizat prin clasificarea profilului curent cu ajutorul arborelui de decizie construit anterior.
using System; using System.IO;
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea utilizrii
42 public partial class CustomNews : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { // "Page_Load" se executa cand se incarca pagina
// daca se incarca direct aceasta pagina (customNews.aspx), redirectare la pagina de Login if (Session["User"] == null) Response.Redirect("Login.aspx");
if (Application["DT"] == null) // arborele de decizie se creeaza o singura data { InitializeDecisionTree(); }
UserProfile up = (UserProfile)Session["User"];
StreamReader sr = new StreamReader(Server.MapPath(".") + "\\stiri.htm"); string template = sr.ReadToEnd(); // se citeste pagina template sr.Close();
int noNews = 10; string[] headlines = null;
string mesaj = ""; switch (up.Time) // se creeaza un mesaj de salut in functie de ora logarii { case "Dimineata": mesaj = "Buna dimineata"; break; case "Zi": mesaj = "Buna ziua"; break; case "Seara": mesaj = "Buna seara"; break; case "Noapte": mesaj = "Cam tarziu azi"; break; }
template = template.Replace("Mesaj", mesaj); // se inlocuieste salutul, de ex. "Buna ziua" template = template.Replace("Gigi", up.Name); // se inlocuieste numele in template
Random r = new Random();
switch (DecideNewsClass(up)) // decizia arborelui de decizie in functie de profilul utilizatorului { case 0: template = template.Replace("#FF00FF", "#00FF00"); // schimba culoarea template = template.Replace("gen", "politice"); // se inlocuieste genul de stiri Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Clasificarea bazat pe arbori de decizie
for (int i = 1; i <= 5; i++) { int sel = r.Next(noNews); while (headlines[sel][0] == '*') sel = r.Next(noNews); template = template.Replace("News" + i, headlines[sel]); headlines[sel] = "*" + headlines[sel]; }
StreamWriter sw = new StreamWriter(Server.MapPath(".") + "\\stiri_pers.htm"); sw.Write(template); sw.Close();
Response.Redirect("stiri_pers.htm"); }
private void ReadHeadlines(string filename, ref string[] headlines, int noNews) { // citeste un numar de titluri de stiri headlines = new string[noNews]; StreamReader sr = new StreamReader(filename); for (int i = 0; i < noNews && sr.Peek() != -1; i++) headlines[i] = sr.ReadLine(); sr.Close(); }
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea utilizrii
44 private int DecideNewsClass(UserProfile up) // arborele de decizie { double[] attvals = new double[] { up.Age, dom, up.ExactTime, -1 }; weka.core.Instance t = new weka.core.Instance(1, attvals); weka.classifiers.trees.J48 decisionTree = (weka.classifiers.trees.J48)Application["DT"]; t.setDataset(decisionTree.sample.dataset()); return decisionTree.classifyInstance(t); }
private void InitializeDecisionTree() { weka.classifiers.trees.J48 decisionTree = new weka.classifiers.trees.J48(); weka.classifiers.Evaluation.evaluateModel(decisionTree, new string[] { "-t", "profiles.arff" }); Application["DT"] = decisionTree; } } 3.3.6. Stiri.htm La generarea paginii personalizate se utilizeaz un ablon, n care programul completeaz dinamic detalii precum numele utilizatorului, culoarea fondului i tirile propriu-zise.
Figura 3.10. ablonul paginii de tiri personalizate Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Clasificarea bazat pe arbori de decizie
Titlurile de tiri propriu-zise sunt date n trei fiiere text, corespunztoare fiecrui tip de tiri: politice, sportive i mondene.
Figura 3.11. Exemplu de fiier de tiri politice
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea utilizrii
46
Figura 3.11. Exemplu de fiier de tiri sportive
Figura 3.12. Exemplu de fiier de tiri mondene
Utilizatorul are i posibilitatea de a alege alte tiri pe lng cele propuse de arborele de decizie. Pentru fiecare tip de tiri exist cte un fiier corespunztor fiecrui tip de tire.
Figura 3.13. Pagina cu toate tirile politice disponibile
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Clasificarea bazat pe arbori de decizie
47
Figura 3.14. Pagina cu toate tirile sportive disponibile
Figura 3.15. Pagina cu toate tirile mondene disponibile
Aplicaia n execuie poate fi urmrit n figurile urmtoare.
Figura 3.16. Crearea unui cont nou
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea utilizrii
48
Figura 3.17. Pagina de autentificare
Figura 3.18. Pagina de tiri personalizate generat dinamic
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com 49 Capitolul 4
INDUCIA REGULILOR DE ASOCIERE
n acest capitol vom prezenta o ultim aplicaie de explorarea a utilizrii, i anume o aplicaie de achiziii online i analiza coului de cumprturi prin inducia regulilor de asociere. Algoritmul utilizat n acest scop, Apriori, are de asemenea o implementare mai laborioas, ca i algoritmii de inducie a arborilor de decizie, i de aceea am decis utilizarea implementrii Weka i de aceast dat.
Aplicaia 4.1. Utilizarea implementrii Weka a algoritmului Apriori.
using System; using System.Collections.Generic; using System.Text;
namespace WekaTest { class Program { static void Main(string[] args) { weka.associations.Apriori apriori = new weka.associations.Apriori(); int maxRules = 10; double minConfidence = 0.9; string fileName = "transactions.arff"; string[] options = new string[] { "-t", fileName, "-N", maxRules.ToString(), "-C", minConfidence.ToString(), "-I" }; java.io.Reader reader = new java.io.BufferedReader( new java.io.FileReader(fileName)); apriori.setOptions(options); apriori.buildAssociations(new weka.core.Instances(reader)); Console.Write(apriori.ToString()); } } }
id252148093 pdfMachine by Broadgun Software - a great PDF writer! - a great PDF creator! - http://www.pdfmachine.com http://www.broadgun.com Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea utilizrii
50
Figura 4.1. Fiierul cu tranzaciile analizate
Fiierul ARFF de test este prezentat n figura 4.1. n acest caz, dac avem n obiecte a cror apariie simultan trebuie analizat, pentru aplicarea algoritmului Apriori din Weka, fiecrui obiect trebuie s i corespund un atribut, sau o coloan din partea de date. Obiectele care nu sunt prezente ntr-o tranzacie vor avea valoare nedeterminat (?) pe coloanele corespunztoare, iar obiectele prezente vor avea valoarea lor unic pe coloanele proprii. Rezultatele algoritmului Apriori sunt prezentate n figura 4.2.
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Inducia regulilor de asociere
51
Figura 4.2. Rezultatele algoritmului Apriori
Aplicaia 4.2. Aplicaia de achiziii online, n care fiecare tranzacie este salvat ntr-un fiier, care apoi poate fi analizat cu algoritmul Apriori.
4.2.1. Default.aspx.cs Pagina principal a site-ului, care afieaz informaiile despre produsele disponibile. Programul genereaz dinamic tabelul, pe baza unui fiier cu informaii despre produse definit de utilizator. i aici se utilizeaz un ablon care este particularizat n momentul execuiei.
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea utilizrii
52 using System; using System.IO; using System.Collections;
public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string path = Server.MapPath(".") + "\\";
StreamReader products = new StreamReader(path + @"templates\products.txt"); string line = products.ReadLine(); int noProducts = Convert.ToInt32(line); MarketBasketItem[] allProducts = new MarketBasketItem[noProducts];
ArrayList buylist = new ArrayList(); Session["BuyList"] = buylist;
string tableLines = ""; double total = 0;
for (int i = 0; i < noProducts; i++) { string line1 = products.ReadLine(); string line2 = products.ReadLine(); string line3 = products.ReadLine(); string line4 = products.ReadLine(); string line5 = products.ReadLine();
allProducts[i] = new MarketBasketItem( line2, line3, line4, Convert.ToDouble(line5));
if (i % 2 == 0) { Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Inducia regulilor de asociere
int noProducts = allProducts.Length; double total = 0;
for (int i = 0; i < noProducts; i++) { if (allProducts[i].Id == code) { Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Inducia regulilor de asociere
4.2.6. Complete.aspx Dup finalizarea unei tranzacii, utilizatorul are posibilitatea efecturii unei noi tranzacii sau vizualizarea rezultatelor analizei.
Figura 4.5. Opiunile dup finalizarea unei tranzacii
4.2.7. Admin.aspx Modulul de administrare, pentru rularea algoritmului Apriori i vizualizarea rezultatelor analizei. Aici se creeaz un fiier ARFF cu tranzaciile efectuate, se aplic algoritmul Apriori pentru analiza acestuia i se afieaz regulile de asociere gsite.
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Inducia regulilor de asociere
61
Figura 4.6. Proiectarea interfeei pentru vizualizarea rezultatelor analizei
for (int i = 0; i < noProducts; i++) arff.WriteLine("@ATTRIBUTE attr" + (i + 1) + " { " + allProducts[i].Id + " }");
arff.WriteLine("@DATA"); Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea utilizrii
62 while (transactions.Peek() != -1) { string line = transactions.ReadLine(); string[] toks = line.Split();
for (int i = 0; i < noProducts; i++) { bool exists = false; for (int j = 0; j < toks.Length; j++) if (toks[j] == allProducts[i].Id) { exists = true; break; } if (exists) arff.Write(allProducts[i].Id + " "); else arff.Write("? "); }
arff.WriteLine(); }
transactions.Close(); arff.Close();
weka.associations.Apriori apriori = new weka.associations.Apriori(); int maxRules = 10; double minConfidence = 0.9; string fileName = path + "transactions.arff"; string[] options = new string[] { "-t", fileName, "-N", maxRules.ToString(), "-C", minConfidence.ToString(), "-I" }; java.io.Reader reader = new java.io.BufferedReader( new java.io.FileReader(fileName)); apriori.setOptions(options); apriori.buildAssociations(new weka.core.Instances(reader)); string s = apriori.ToString(); s = s.Replace("\n", "\r\n"); TextBox1.Text = s; } }
Fiierul ARFF (figura 4.8) este generat pe baza unui fiier text (figura 4.7) care conine toate tranzaciile efectuate. Fiecare produs este identificat printr-un cod unic de identificare, definit de utilizator n fiierul cu produse (figura 4.4).
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Inducia regulilor de asociere
63
Figura 4.7. Fiierul text cu tranzaciile efecuate
Figura 4.8. Fiierul ARFF cu tranzaciile efecuate
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea utilizrii
64 n figurile urmtoare este prezentat aplicaia n execuie.
Figura 4.9. Introducerea produselor n coul de cumprturi
Figura 4.10. Regulile de asociere determinate cu algoritmul Apriori Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com EXPLORAREA CONINUTULUI
Capitolul 5. Reele neuronale ! Predicia traficului pe un site ! Detecia spam-ului
Partea id252671140 pdfMachine by Broadgun Software - a great PDF writer! - a great PDF creator! - http://www.pdfmachine.com http://www.broadgun.com Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com 67 Capitolul 5
REELE NEURONALE
n acest capitol vom descrie o serie de aplicaii de predicie i clasificare utiliznd reele neuronale. Problemele cele mai important n lucrul cu reele neuronale de tip perceptron multistrat sunt determinarea topologiei reelei (a numrului de straturi ascunse i a numrului de neuroni din fiecare strat ascuns), i antrenarea reelei, adic gsirea ponderilor conexiunilor i a deplasrilor neuronilor, astfel nct reeaua s aproximeze funcia dorit. Determinarea ponderilor se poate realiza cu implementri ale algoritmului Back-propagation, folosind algoritmi genetici, sau utiliznd un pachet software dedicat precum NeuroSolutions (http://www.neurosolutions.com). n cele ce urmeaz, vom considera cunoscui parametrii reelelor utilizate.
Aplicaia 5.1. Testarea unei reele neuronale pentru aproximarea funciei binare XOR.
5.1.1. Class1.cs Apeleaz reeaua cu cele patru combinaii binare de intrri i afieaz valoarea de ieire a reelei.
using System;
namespace ConsoleApplication1 { class Class1 { [STAThread] static void Main(string[] args) { for (double i = 0; i < 2; i += 1) for (double j = 0; j < 2; j += 1) { double net; Retea.ReteaXor(i, j, out net); Console.WriteLine(" " + i + "\t" + j + "\t" + net); } id252267046 pdfMachine by Broadgun Software - a great PDF writer! - a great PDF creator! - http://www.pdfmachine.com http://www.broadgun.com Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea coninutului
68 Console.Read(); } } }
5.1.2. ReteaXor.cs Implementarea unei reele neuronale care aproximeaz funcia XOR. Se utilizeaz funcia de activare sigmoid bipolar (tangenta hiperbolic), iar intrrile i ieirile sunt scalate n domeniul [-0.9, 0.9] pentru a evita zona de saturaie a funciei sigmoide.
using System;
public class Retea { public static void ReteaXor(double parin1, double parin2, out double parout1) {
Figura 5.1. Rezultatele reelei neuronale pentru funcia XOR
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea coninutului
70 Aplicaia 5.2. Predicia traficului pe un site web pe baza nregistrrilor anterioare. Ca atribute, se iau n considerare luna calendaristic i dac este sau nu sfrit de sptmn (smbt sau duminic).
5.2.1. Default.aspx.cs Creeaz o imagine cu prediciile privind volumul traficului pe site i ncarc pagina TrafficPage.htm pentru a o afia. La rndul su, este apelat din TrafficPage.htm pentru a schimba luna de referin pentru predicie.
using System; using System.Drawing;
public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { int luna = 0;
if (Session["Data"] == null) // la inceput { luna = DateTime.Now.Month; // data curenta Session["Data"] = luna; } else // avem un apel din TrafficPage.htm { if (Request.QueryString["dir"] == null) Response.Redirect("TrafficPage.htm"); // should not happen - only if called directly string type = Request.QueryString["dir"]; // apel: Default.aspx?dir=0
luna = (int)Session["Data"]; if (type == "0") luna--; else if (type == "1") luna++;
if (luna <= 0) luna += 12; if (luna > 12) luna -= 12; Session["Data"] = luna; }
// avem noua referinta (luna) Bitmap b = Deseneaza(luna); b.Save(Server.MapPath(".") + "\\image.png", System.Drawing.Imaging.ImageFormat.Png); Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Reele neuronale
71 Response.Redirect("TrafficPage.htm"); }
private Bitmap Deseneaza(int luna) { const int width = 312; const int height = 200;
Bitmap b = new Bitmap(width, height); Graphics g = Graphics.FromImage(b);
g.Clear(Color.White);
int lastX = 0, lastY = 0; bool start = true;
for (int zi = 0; zi < 90; zi++) { double luna_reala = luna + zi / 30.0; if (luna_reala > 12) luna_reala -= 12; int rest = zi % 30;
5.2.3. TrafficPage.htm Pagina care afieaz prediciile. Se remarc utilizarea unui script Javascript pentru a afia de fiecare dat imaginea nou generat, evitnd astfel afiarea imaginii existente deja n cache-ul browser-ului.
<html> <head> <title>WebSite Traffic</title> <script> function update_src() { var dt = new Date(); var newsrc = "image.png?" + dt.getTime(); document.getElementById("myimage").src = newsrc; } onload = update_src; </script> Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Reele neuronale
Figura 5.3. Aplicaia de predicie n timpul execuiei
Aplicaia 5.3. Este o aplicaie complex de detecie a spam-ului, pe baza unor email-uri efective. Se va descrie i un client simplu pentru trimiterea i primirea de email-uri. Pe baza modelului nvat de reeaua neuronal, mesajele vor fi clasificate ca spam (mesaje nesolicitate) sau ham (mesaje utile). n acest scop, datele de antrenare vor fi vectori de frecven ai cuvintelor propriu-zise din mesaje.
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea coninutului
76 5.3.1. Program.cs Programul principal unde se instaniaz un obiect din clasa Analyser, care produce clasificarea.
using System;
namespace SpamAnalysis { class Program { static void Main(string[] args) { Analyser an = new Analyser(); an.Analyse(); } } }
5.3.2. Analyser.cs Creeaz un model al vectorilor de frecven ai cuvintelor pe baza unui set de documente, pentru a clasifica mesajele de email n spam i ham.
using System; using System.Collections.Generic; using System.Collections; using System.Text; using System.IO;
namespace SpamAnalysis { class Analyser { public Analyser() { }
public void Analyse() { const int noDocs = 30; string[] filenames = new string[noDocs];
for (int i = 0; i < 15; i++) { filenames[i] = string.Format("ham{0:D2}", i + 1); Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Reele neuronale
77 filenames[i + 15] = string.Format("spam{0:D2}", i + 1); }
Hashtable wordfreq = new Hashtable(); Hashtable wordfreqindocs = new Hashtable(); int[] docLengths = new int[noDocs];
for (int i = 0; i < noDocs; i++) { StreamReader sr = new StreamReader("mail\\" + filenames[i]); string file = sr.ReadToEnd(); sr.Close(); string[] toks = RemoveEmptyStrings(file.Split( " \t\r\n,.;:\"/<>~_`!@#$%^&*-+=?()[]{}0123456789".ToCharArray()));
docLengths[i] = toks.Length;
for (int j = 0; j < toks.Length; j++) { string word = toks[j].ToLower() + "|" + filenames[i]; if (wordfreqindocs.Contains(word)) { int noOccurences = (int)wordfreqindocs[word]; noOccurences++; wordfreqindocs.Remove(word); wordfreqindocs.Add(word, noOccurences); } else wordfreqindocs.Add(word, 1);
word = toks[j].ToLower(); if (wordfreq.Contains(word)) { int noOccurences = (int)wordfreq[word]; noOccurences++; wordfreq.Remove(word); wordfreq.Add(word, noOccurences); } else wordfreq.Add(word, 1); } }
// analysis
string[] terms = new string[wordfreq.Count]; double[] termWeights = new double[wordfreq.Count]; int tc = 0; Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea coninutului
78 foreach (string t in wordfreq.Keys) { terms[tc] = t; termWeights[tc] = 0;
// gaseste ponderea termenului t in toate documentele, "inverse document frequency": idf = log( |D| / |D > t| ) int docCount = 0; for (int d = 0; d < noDocs; d++) { string word_doc = t + "|" + filenames[d]; if (wordfreqindocs.Contains(word_doc)) { docCount++; break; } }
// exporta cuvintele - pentru crearea filtrului StreamWriter swall = new StreamWriter("words.txt"); for (int i = 0; i < terms.Length; i++) swall.WriteLine(terms[i] + "\t" + termWeights[i]); swall.Close();
StreamReader srFilter = new StreamReader("wordfilter.txt"); string filterFile = srFilter.ReadToEnd(); srFilter.Close(); Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Reele neuronale
79 string[] toksComWrd = filterFile.Split(" \t\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); List<string> commonWords = new List<string>(); for (int i = 0; i < toksComWrd.Length; i++) if (!commonWords.Contains(toksComWrd[i])) // se elimina cuvintele duplicat daca exista commonWords.Add(toksComWrd[i].ToLower()); // prelucrare case insensitive
int maxAttributeTerms = 20; int[] chosenWordsIndices = new int[maxAttributeTerms]; int cwiCount = 0;
for (int i = 0; i < terms.Length; i++) { if (!commonWords.Contains(terms[i])) { chosenWordsIndices[cwiCount++] = i; if (cwiCount >= maxAttributeTerms) break; } }
// exporta cuvintele selecate ca atribute StreamWriter sw = new StreamWriter("chosen_words.txt"); for (int i = 0; i < maxAttributeTerms; i++) sw.WriteLine(terms[chosenWordsIndices[i]]); sw.Close();
// creeaza vectorii de antrenare pentru reteaua neuronala string strVectors = "";
// scrie antetul for (int j = 0; j < maxAttributeTerms; j++) strVectors += terms[chosenWordsIndices[j]] + "\t"; strVectors += "IsSpam\r\n";
// scrie vectorii propriu-zisi -> 1 pentru fiecare document for (int d = 0; d < noDocs; d++) { for (int j = 0; j < maxAttributeTerms; j++) { string word_doc = terms[chosenWordsIndices[j]] + "|" + filenames[d]; int noOccurences = 0; if (wordfreqindocs.Contains(word_doc)) noOccurences = (int)wordfreqindocs[word_doc]; double tf = (double)noOccurences / (double)docLengths[d];
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea coninutului
80 strVectors += string.Format("{0:F3}\t", tf * 100); // tf-urile pentru vectorii selectati se pot normaliza (suma = 1) } if (d >= 15) strVectors += "1\r\n"; // class = is spam else strVectors += "0\r\n"; // class = is not spam }
StreamWriter vectors = new StreamWriter("nn_vectors.txt"); vectors.Write(strVectors); vectors.Close();
Console.WriteLine("OK"); }
private void SortTermWeights(string[] terms, double[] termWeights) { int dist, i, j; string auxs; double auxd; int len = terms.Length;
for (dist = len / 2; dist > 0; dist /= 2) for (i = dist; i < len; i++) for (j = i - dist; j >= 0 && termWeights[j] < termWeights[j + dist]; j -= dist) { auxs = terms[j]; terms[j] = terms[j + dist]; terms[j + dist] = auxs; auxd = termWeights[j]; termWeights[j] = termWeights[j + dist]; termWeights[j + dist] = auxd; } }
private string[] RemoveEmptyStrings(string[] str) { int count = 0; for (int i = 0; i < str.Length; i++) if (str[i] != null && str[i] != "") count++; if (count == 0) return null; string[] newstr = new string[count]; count = 0; for (int i = 0; i < str.Length; i++) if (str[i] != null && str[i] != "") newstr[count++] = str[i]; Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Reele neuronale
81 return newstr; } } }
Figura 5.4. Exemple de documente spam i ham utilizate pentru antrenare
Figura 5.5. Cuvintele comune ignorate la prelucrare fiierul wordfilter.txt Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea coninutului
82
Figura 5.6. Fiierul words.txt
Figura 5.7. Fiierul chosen_words.txt
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Reele neuronale
83
Figura 5.8. Fiierul nn_vectors.txt
Aplicaia 5.4. Implementarea unui client de e-mail, cu care se pot trimite mesaje, iar dintre mesajele primite sunt detectate spam-urile.
5.4.4. receive.cs Codul pentru preluarea email-urilor de pe un server POP3 este mai complex. Implementarea de mai jos se bazeaz pe codul surs al lui William J. Dean, bazat pe tutorialul lui Agus Kurniawan, Retrieve Mail From a POP3 Server Using C#, disponibil la adresa: http://www.codeproject.com/csharp/popapp.asp
using System; using System.IO; using System.Net; using System.Net.Sockets;
namespace WebMail { class MailReceiver { public void Receive() { POP3Client pop3 = new POP3Client();
public POP3Client(string popServer, string userName, string password) { PopServer = popServer; User = userName; Password = password; }
public string Connect(string popServer) { PopServer = popServer; //put the specified server into the pop property return Connect(); //call the connect method }
public string Connect() { // create server with port 110 server = new TcpClient(PopServer, 110);
try { // initialization Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Reele neuronale
89 netStream = server.GetStream(); sr = new StreamReader(server.GetStream());
//The pop session is now in the AUTHORIZATION state State = ConnectState.Authorization; return sr.ReadLine(); } catch (InvalidOperationException err) { return "Error: " + err.ToString(); }
private void WasPopError(string response) { //detect if the pop server that issued the response believes that //an error has occured.
if (response.StartsWith("-")) { //if the first character of the response is "-" then the //pop server has encountered an error executing the last //command send by the client Error = true; } Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Reele neuronale
91 else { //success Error = false; } }
public string Dele(int msgNumber) { string temp;
if (State != ConnectState.Transaction) { //DELE is only valid when the pop session is in the TRANSACTION STATE temp = "Connection state not = TRANSACTION"; } else { IssueCommand("DELE " + msgNumber.ToString()); temp = ReadSingleLineResponse(); } return temp; }
public string List() { string temp = ""; if (State != ConnectState.Transaction) { //the pop command LIST is only valid in the TRANSACTION state temp = "Connection state not = TRANSACTION"; } else { IssueCommand("LIST"); temp = ReadMultiLineResponse(); } return temp; }
public string List(int msgNumber) { string temp = "";
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea coninutului
92 if (State != ConnectState.Transaction) { //the pop command LIST is only valid in the TRANSACTION state temp = "Connection state not = TRANSACTION"; } else { IssueCommand("LIST " + msgNumber.ToString()); temp = ReadSingleLineResponse(); //when the message number is supplied, expect a single line response } return temp; }
public string NoOp() { string temp; if (State != ConnectState.Transaction) { //the pop command NOOP is only valid in the TRANSACTION state temp = "Connection state not = TRANSACTION"; } else { IssueCommand("NOOP"); temp = ReadSingleLineResponse(); } return temp; }
public string Pass() { string temp; if (State != ConnectState.Authorization) { //the pop command PASS is only valid in the AUTHORIZATION state temp = "Connection state not = AUTHORIZATION"; } else { if (Password != null) { IssueCommand("PASS " + Password); temp = ReadSingleLineResponse();
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Reele neuronale
93 if (!Error) { //transition to the Transaction state State = ConnectState.Transaction; } } else { temp = "No Password set."; } } return temp; }
public string Pass(string password) { Password = password; //put the supplied password into the appropriate property return Pass(); //call PASS() with no arguement }
public string Quit() { //QUIT is valid in all pop states string temp; if (State != ConnectState.Disconnect) { IssueCommand("QUIT"); temp = ReadSingleLineResponse(); temp += crlf + Disconnect(); } else { temp = "Not Connected."; } return temp; }
public string Retr(int msg) { string temp = ""; if (State != ConnectState.Transaction) { //the pop command RETR is only valid in the TRANSACTION state temp = "Connection state not = TRANSACTION"; Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea coninutului
94 } else { // retrieve mail with number mail parameter IssueCommand("RETR " + msg.ToString()); temp = ReadMultiLineResponse(); } return temp; }
public string Rset() { string temp; if (State != ConnectState.Transaction) { //the pop command STAT is only valid in the TRANSACTION state temp = "Connection state not = TRANSACTION"; } else { IssueCommand("RSET"); temp = ReadSingleLineResponse(); } return temp; }
public string Stat() { string temp; if (State == ConnectState.Transaction) { IssueCommand("STAT"); temp = ReadSingleLineResponse(); return temp; } else { //the pop command STAT is only valid in the TRANSACTION state return "Connection state not = TRANSACTION"; } }
public string User() { string temp; Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Reele neuronale
95 if (State != ConnectState.Authorization) { //the pop command USER is only valid in the AUTHORIZATION state temp = "Connection state not = AUTHORIZATION"; } else { if (User != null) { IssueCommand("USER " + User); temp = ReadSingleLineResponse(); } else { //no user has been specified temp = "No User specified."; } } return temp; }
public string User(string userName) { User = userName; //put the user name in the appropriate propertity return User(); //call USER with no arguements } } }
5.4.5. show.aspx.cs Afieaz un anumit e-mail.
using System; using System.IO;
public partial class show : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (Request.QueryString["file"] == null) Response.Redirect("inbox.aspx"); string messageFile = Request.QueryString["file"];
string path = Server.MapPath(".");
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea coninutului
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea coninutului
98
Figura 5.12. Afiarea unui e-mail
Figura 5.13. Afiarea listei de mesaje spam
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com 99 Capitolul 6
CLASIFICAREA BAYESIAN
n acest capitol vom prezenta o abordare alternativ pentru clasificarea mesajelor de e-mail, bazat pe probabiliti, cu ajutorul algoritmului de clasificare bayesian naiv. De asemenea, vom propune o aplicaie probabilistic pentru determinarea documentelor n care apar anumite concepte ce fac obiectul cutrilor utilizatorilor.
Aplicaia 6.1. Deoarece clasificarea bayesian naiv presupune discretizarea valorilor reale ale datelor, se vor discretiza vectorii de frecven ai cuvintelor, ca un pas de preprocesare. Se vor distinge valorile nule, care vor reprezenta o valoare discret distinct, ntruct numrul valorilor nule este destul de mare n cazul vectorilor de frecven ai cuvintelor.
using System; using System.Collections.Generic; using System.Text; using System.IO;
namespace Preprocessing { class Program { static void Main(string[] args) { Console.Write("Numarul de intervale: "); int nrIntervale = Convert.ToInt32(Console.ReadLine());
int nrCol = 20; int nrLin = 30;
double[,] date = new double[nrLin, nrCol + 1];
StreamReader sr = new StreamReader("vectors.txt"); string all = sr.ReadToEnd(); sr.Close();
id252344953 pdfMachine by Broadgun Software - a great PDF writer! - a great PDF creator! - http://www.pdfmachine.com http://www.broadgun.com Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea coninutului
100 string[] toks = all.Split(" \t\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < nrLin; i++) for (int j = 0; j < nrCol + 1; j++) date[i, j] = Convert.ToDouble(toks[i * (nrCol + 1) + j]);
double[] min = new double[nrCol]; double[] max = new double[nrCol]; for (int i = 0; i < nrCol; i++) { min[i] = double.MaxValue; max[i] = double.MinValue;
sw.Close(); Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Clasificarea bayesian
101 } } }
Figura 6.1. Vectorii de frecven ai cuvintelor cu valori reale
Figura 6.2. Vectorii de frecven ai cuvintelor cu valori discretizate
Aplicaia 6.2. Clasificarea mesajelor de e-mail prin prelucrarea vectorilor de frecven ai cuvintelor prin metoda bayesian naiv cu corecie Laplace.
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea coninutului
102
Figura 6.3. Proiectarea interfeei grafice pentru aplicaia de clasificare bayesian naiv a e-mail-urilor
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO;
namespace NaiveBayes { public partial class Form1 : Form { string[,] date; int nrCol = 20; int nrLin = 30; int nrInterv = 3; int nrClase = 2; // 2 clase: Ham, Spam string[] classLabel = new string[] { "Ham", "Spam" }; string[] attrVal = new string[] { "Null", "Val1", "Val2", "Val3" };
public Form1() { InitializeComponent(); }
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Clasificarea bayesian
for (int i = 1; i < nrClase; i++) { if (probMax < bayesProb[i]) { probMax = bayesProb[i]; classMax = i; } }
return classMax; }
private void ReadData(string filename) { date = new string[nrLin, nrCol + 1];
StreamReader sr = new StreamReader(filename); string all = sr.ReadToEnd(); sr.Close();
string[] toks = all.Split(" \t\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < nrLin; i++) for (int j = 0; j < nrCol + 1; j++) date[i, j] = toks[i * (nrCol + 1) + j]; Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Clasificarea bayesian
105 } } }
n figura 6.4 sunt prezentate rezultatele procesului de clasificare a celor 30 de documente. n coloanele 2 i 3 sunt afiate produsele probabilitilor, pentru clasa Ham respectiv Spam, per milion.
Figura 6.4. Rezultatele clasificrii
Aplicaia 6.3. Implementarea algoritmului reelelor bayesiene, pentru a determina probabilitile marginale ale unor evenimente, n acest caz existena unor concepte n documentele n care utilizatorul efectueaz o cutare.
using System; using System.Collections.Generic; using System.Text;
namespace BayesNet { class Program { Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea coninutului
Console.WriteLine("Document 1\r\n"); bnet = new BayesianNetwork("documents1.txt"); Console.WriteLine(bnet.DisplayResults()); Console.WriteLine("Document 2\r\n"); bnet = new BayesianNetwork("documents2.txt"); Console.WriteLine(bnet.DisplayResults());
Console.WriteLine("Document 3\r\n"); bnet = new BayesianNetwork("documents3.txt"); Console.WriteLine(bnet.DisplayResults()); } } }
n figura 6.5 se prezint un exemplu de fiier de intrare pentru program, n care sunt precizate probabilitile marginale ale evenimentelor independente, iar pentru evenimentele condiionate se precizeaz prinii i probabilitile condiionate. Problema vizitei n Asia este o problem clasic pentru reelele bayesiene, propus n S. L. Lauritzen, D. J. Spiegelhalter, Local computations with probabilities on graphical structures and their application to expert systems, Journal of Royal Statistics Society B, 50(2), 157-194, 1988.
Figura 6.5. Exemplu de fiier de intrare
O reea bayesian mai complex este prezentat n figura 6.6, n care o serie de termeni aparin sau nu unor documente, iar termenii la rndul lor determin o serie de concepte mai generale, pe baza crora se poate realiza cutarea de ctre utilizator. Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Clasificarea bayesian
107
Figura 6.6. Reea bayesian pentru cutarea conceptelor n documente
Structura din figura 6.6 poate fi notat n formatul adoptat pentru fiierele de intrare, dup cum se observ n figura 6.7. n funcie de msura n care anumii termeni determin anumite concepte, putem avea mai multe situaii de analizat. Aceste trei fiiere, documents1.txt, documents2.txt i documents3.txt sunt trimise pentru prelucrare n modulul de calcul al probabilitilor marginale.
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea coninutului
108
Figura 6.7. Fiiere de descriere a reelelor bayesiene documente-concepte
n continuare este prezentat clasa care implementeaz calculele aferente metodei reelelor bayesiene.
using System; using System.Collections.Generic; using System.Text; using System.IO;
namespace BayesNet {
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Clasificarea bayesian
109 public class BayesianNetwork { private string[][] stringArray; private int lineCount;
public BayesianNetwork(string filename) { StreamReader sr = new StreamReader(filename); string allFile = sr.ReadToEnd(); sr.Close();
string[] lines = allFile.Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); stringArray = new string[lines.Length][]; for (int i = 0; i < lines.Length; i++) stringArray[i] = lines[i].Split(" \t,;".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); lineCount = lines.Length; Compute(); }
public string DisplayResults() { string result = ""; for (int j = 0; j < lineCount; j++) result += stringArray[j][0] + " -> " + stringArray[j][1] + "\r\n"; return result; } } }
Rezultatele rulrii programului sunt prezentate n figura 6.8. Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Clasificarea bayesian
111
Figura 6.8. Rezultatele rulrii programului pentru reele bayesiene
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com 112 Capitolul 7
PARTIIONAREA K-MEDII
n acest capitol vom prezenta o alt metod de web mining, partiionarea sau clusterizarea, care permite, spre deosebire de clasificare, gruparea nesupervizat a obiectelor ntlnite. Vom particulariza metoda k-mediilor (engl. k-means) la problem gruprii documentelor, ceea ce poate fi un pas intermediar naintea atribuirii de semnificaie fiecrui grup descoperit.
Aplicaia 7.1. Aplicaie grafic ce permite vizualizarea dinamic a procesului de pariionare asupra unui set de puncte dintr-o regiune bidimensional.
Figura 7.1. Proiectarea interfeei grafice pentru animaia de partiionare
id252419171 pdfMachine by Broadgun Software - a great PDF writer! - a great PDF creator! - http://www.pdfmachine.com http://www.broadgun.com Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Partiionarea k-medii
113 using System; using System.Drawing; using System.Windows.Forms;
namespace kmeans { public partial class Form1 : Form { public struct Instance { public int x, y; public int cluster; }
Instance[] objects, means; int noPoints, noClusters;
noClusters = comboBoxNoClus.SelectedIndex + 2; Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea coninutului
114 objects = new Instance[noPoints]; means = new Instance[noClusters]; Random r = new Random();
for (int i = 0; i < noPoints; i++) { bool ok = false; while (!ok) { objects[i].x = 5 + r.Next(390); objects[i].y = 5 + r.Next(390); int dx = objects[i].x - 200; int dy = objects[i].y - 200;
if (dx * dx + dy * dy < 200 * 200) ok = true; } objects[i].cluster = -1; }
AssignClusters();
pictureBox.Refresh(); }
private void pictureBox_Paint(object sender, PaintEventArgs e) { if (objects == null || means == null) return;
e.Graphics.Clear(Color.White); Color color = Color.Black;
for (int i = 0; i < noPoints; i++) { switch (objects[i].cluster) { case 0: color = Color.Blue; break; case 1: color = Color.Red; break; case 2: color = Color.DarkGray; break; case 3: color = Color.Yellow; break; case 4: color = Color.Aqua; break; case 5: color = Color.Fuchsia; break; case 6: color = Color.Orange; break; case 7: color = Color.DarkSeaGreen; break; case 8: color = Color.Maroon; break; case 9: color = Color.GhostWhite; break; Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Partiionarea k-medii
/// <summary> /// Returns true if at least one reassignment has been made /// </summary> /// <returns></returns> private bool ReassignClusters() { for (int i = 0; i < noClusters; i++) means[i] = ComputeMean(i);
bool reass = false;
for (int i = 0; i < noPoints; i++) { double minDist = 1e+10; int minDistCluster = -1; for (int j = 0; j < noClusters; j++) { double dist = Distance(objects[i], means[j]); if (dist < minDist) { minDist = dist; minDistCluster = j; } }
private void KMeans(int noClusters, out int[] assign) { assign = new int[nrLin];
noPoints = nrLin; this.noClusters = noClusters;
means = new Instance[noClusters];
for (int i = 0; i < noClusters; i++) means[i] = new Instance(nrCol);
AssignClusters();
bool more = true; while (more) { Application.DoEvents(); more = ReassignClusters(); }
for (int i = 0; i < nrLin; i++) { assign[i] = objects[i].cluster; } }
private void AssignClusters() { Random r = new Random();
bool[] selected = new bool[noPoints]; for (int i = 0; i < noPoints; i++) selected[i] = false;
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea coninutului
122 for (int i = 0; i < noClusters; i++) { bool ok = false; while (!ok) { int crtSel = r.Next(noPoints); if (!selected[crtSel]) { selected[crtSel] = true; ok = true; } } }
int clusterIndex = 0;
for (int i = 0; i < noPoints; i++) { if (selected[i]) { means[clusterIndex] = objects[i]; means[clusterIndex].cluster = clusterIndex; clusterIndex++; } }
for (int i = 0; i < noPoints; i++) { double minDist = 1e+10; int minDistCluster = -1; for (int j = 0; j < noClusters; j++) { double dist = Distance(objects[i], means[j]); if (dist < minDist) { minDist = dist; minDistCluster = j; } }
objects[i].cluster = minDistCluster; } }
private bool ReassignClusters() { // returneaza true daca s-a realizat cel putin o modificare
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Partiionarea k-medii
123 for (int i = 0; i < noClusters; i++) means[i] = ComputeMean(i);
bool reass = false;
for (int i = 0; i < noPoints; i++) { double minDist = 1e+10; int minDistCluster = -1; for (int j = 0; j < noClusters; j++) { double dist = Distance(objects[i], means[j]); if (dist < minDist) { minDist = dist; minDistCluster = j; } }
/// <summary> /// Cu cat e mai mare (max. 1), cu atat e mai buna clusterizarea /// </summary> /// <param name="assignments"></param> /// <returns></returns> public double SilhouetteCoefficient(int[] assignments) { double[] c = new double[noPoints];
for (int i = 0; i < noPoints; i++) { double a = 0, b = 0; int n1 = 0, n2 = 0; double sum1 = 0, sum2 = 0;
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Partiionarea k-medii
125 for (int j = 0; j < noPoints; j++) { if (i == j) continue; if (objects[i].cluster == objects[j].cluster) { sum1 += Distance(objects[i], objects[j]); n1++; } else // diferit { sum2 += Distance(objects[i], objects[j]); n2++; }
if (n1 > 0) a = sum1 / n1; if (n2 > 0) b = sum2 / n2; }
if (Math.Max(a, b) == 0) c[i] = 1; else c[i] = (b - a) / Math.Max(a, b); }
double sum_all = 0; for (int i = 0; i < noPoints; i++) sum_all += c[i];
public class Instance { public double[] val; public int cluster;
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea coninutului
126 public Instance(int size) { val = new double[size]; cluster = -1; } } }
Figura 7.5. Vectorii de frecven ai cuvintelor documentelor de partiionat
Deoarece alegerea mediilor iniiale este aleatorie, rezultatele algoritmului nu sunt deterministe; pentru aceleai obiecte algoritmul poate ajunge la rezultate diferite. Ca msur a calitii unei partiionri s-a utilizat coeficientul de siluet, bazat pe calculul distanei medii dintre obiectele aparinnd aceleiai partiii i al distanei medii dintre obiecte din partiii diferite. Cu ct acest coeficient este mai mare, cu att partiionarea este mai natural sau mai bun, adic se minimizeaz distana din interiorul partiiilor i se maximizeaz distana dintre partiii. n figura 7.6 se prezint rezultatele rulrii programului n interfaa grafic, iar n continuare se detaliaz toate rezultatele partiionrii, cu un numr de partiii ntre 2 i 10, iar pentru fiecare considerndu-se 5 rulri distincte i calculndu-se coeficientul de siluet al fiecrei partiionri.
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Partiionarea k-medii
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com EXPLORAREA STRUCTURII
Capitolul 8. Motoare de cutare ! Indexarea i cutarea ntr-un site
Capitolul 9. Relevana paginilor web ! Algoritmul PageRank
Partea id252686421 pdfMachine by Broadgun Software - a great PDF writer! - a great PDF creator! - http://www.pdfmachine.com http://www.broadgun.com Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com 135 Capitolul 8
MOTOARE DE CUTARE
n acest capitol vom descrie implementarea de principiu a unui motor de cutare. Pentru a demonstra procesul de indexare i cutare a cuvintelor cheie, se va prezenta o simulare offline care ignora problemele legate de parcurgerea i descrcarea paginilor reale de pe Internet.
Aplicaia 8.1. Clasa ce descrie o pagin indexat. Deoarece exact aceeai clas trebui utilizat n dou proiecte diferite, cel de parcurgere i indexare a site-ului simulat, precum i n cel de gsire a cuvintelor cheie i afiare a paginilor descoperite, aceast clas va fi compilat ntr-un DLL ce va fi ulterior refereniat din ambele proiecte.
using System; using System.Collections.Generic; using System.Text;
namespace IndexedPage { [Serializable] public class Page { public string Title; public string[] ContentWords; public string[] Links;
public Page(string fileContent) { int titleIndex = fileContent.IndexOf("TITLE"); int contentIndex = fileContent.IndexOf("CONTENT"); int linksIndex = fileContent.IndexOf("LINKS");
Title = fileContent.Substring(titleIndex + 5 + 1, contentIndex - titleIndex - 5 - 1); Title = Title.Trim();
string cnt = fileContent.Substring(contentIndex + 7 + 1, linksIndex - contentIndex - 7 - 1); ContentWords = cnt.Split(" \t\r\n{}*-.,;:()[]<>/+~!@#$%^&\"\'".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); id252520203 pdfMachine by Broadgun Software - a great PDF writer! - a great PDF creator! - http://www.pdfmachine.com http://www.broadgun.com Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea structurii
Aplicaia 8.2. Implementarea spider-ului care indexeaz cuvintele din paginile ntlnite. Site-ul simulat se regsete ntr-o structur de fiiere pe hard-disk-ul local. n cazul de test considerat, structura este cea din figura 8.1, care conine unele informaii de pe site-ul real al autorului: http://www.ace.tuiasi.ro/~fleon.
Figura 8.1. Structura de fiiere a site-ului considerat
Figura 8.2. Seciunile unui pagini Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Motoare de cutare
137 Pentru a simplifica parcurgerea paginilor, fiecare din fiierele PAG au trei seciuni distincte: TITLE, CONTENT i LINKS, n care informaiile sunt date explicit, dup cum se poate observa n figura 8.2. Pentru un spider real, identificarea acestor seciuni se reduce la analiza etichetelor HTML din paginile parcurse.
8.2.1. Program.cs Programul principal care ruleaz spider-ul i salveaz informaiile indexate.
using System; using System.Collections.Generic; using System.Text;
namespace Spider { class Program { static void Main(string[] args) { Spider s = new Spider(); s.BeginSearch(@"d:\wm\Site\", "index.pag"); s.SaveIndex(); Console.WriteLine("Saved."); } } }
8.2.2. Spider.cs Implementarea spider-ului.
using System; using System.Collections.Generic; using System.IO; using System.Runtime.Serialization.Formatters.Binary;
namespace Spider { public class Spider { List<string> processed; Queue<string> fringe; Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea structurii
public Spider() { processed = new List<string>(); fringe = new Queue<string>(); wordsToPages = new Dictionary<string, List<string>>(); cache = new Dictionary<string, IndexedPage.Page>(); }
public void BeginSearch(string indexPath, string indexName) { path = indexPath;
Figura 8.3. Evoluia procesului de indexare Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea structurii
140 Aplicaia 8.3. Motorul de cutare care ncarc informaiile despre pagini i cuvintele coninute, primete interogrile utilizatorilor i afieaz rezultatele cutrilor.
8.3.1. Default.aspx.cs Pagina principal de interogare, n care utilizatorul introduce irul de cuvinte care trebuie cutate.
Figura 8.4. Proiectarea interfeei paginii de interogare
using System;
public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Session["Query"] = null; }
8.3.2. Results.aspx.cs Afiarea paginilor care conin cuvintele cutate de ctre utilizator. Se consider paginile care conin toate cuvintele (se utilizeaz operatorul i logic pentru apartenena cuvintelor).
using System; using System.Runtime.Serialization.Formatters.Binary; using System.IO; using System.Collections.Generic;
public partial class Results : System.Web.UI.Page { Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Motoare de cutare
8.3.5. NotFound.aspx Pagina de eroare n caz c nicio pagin indexat nu conine cuvintele cutate.
Figura 8.4. Proiectarea interfeei paginii de eroare
n figurile 8.5 i 8.6 se prezint un exemplu de rulare a motorului de cutare implementat.
Figura 8.5. Introducerea cuvintelor cheie Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Motoare de cutare
145
Figura 8.6. Afiarea rezultatelor motorului de cutare
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com 146 Capitolul 9
RELEVANA PAGINILOR WEB
n acest capitol vom prezenta implementarea iterativ a algoritmului PageRank, utilizat de Google pentru a determina relevana paginilor web.
Aplicaia 9.1. Algoritmul PageRank
9.1.1. Program.cs Programul principal n care se instaniaz site-uri web cu diferite topologii i factori de amortizare (d) pentru algoritm i se apeleaz funcia de calcul.
using System; using System.Collections.Generic; using System.Text;
namespace PageRank { class Program { static void Main(string[] args) { WebPage[] site1 = { new WebPage('A',"B",1), // B -> A new WebPage('B',"A",1), // A -> B new WebPage('C',"AB",0)}; // A,B -> C
PageRanker.RankSite(site1, 0.5, 100);
for (int i = 0; i < site1.Length; i++) Console.WriteLine(site1[i].Name + " -> " + site1[i].PageRank); Console.WriteLine();
WebPage[] site2 = { new WebPage('A',"",2), // niciun link spre A new WebPage('B',"ACDE",1), // A,C,D,E -> B new WebPage('C',"A",1), // A -> C new WebPage('D',"BE",1), // B,E -> D new WebPage('E',"",2)}; // niciun link spre E PageRanker.RankSite(site2, 0.85, 100); // d este de obicei 0.85 id252601343 pdfMachine by Broadgun Software - a great PDF writer! - a great PDF creator! - http://www.pdfmachine.com http://www.broadgun.com Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Relevana paginilor web
147 for (int i = 0; i < site2.Length; i++) Console.WriteLine(site2[i].Name + " -> " + site2[i].PageRank);
Console.WriteLine();
WebPage[] site3 = { new WebPage('A',"B",2), new WebPage('B',"A",1), new WebPage('C',"AD",1), new WebPage('D',"C",1)};
PageRanker.RankSite(site3, 0.75, 100); // d este de obicei 0.85
for (int i = 0; i < site3.Length; i++) Console.WriteLine(site3[i].Name + " -> " + site3[i].PageRank); } } }
9.1.2. WebPage.cs Clasa care descrie o pagin din site-ul web.
using System; using System.Collections.Generic; using System.Text;
namespace PageRank { class WebPage { public char Name; public int Inbound; public string InboundName; public int Outbound; public double PageRank;
public WebPage(char nume, string inbNume, int outb) { Name = nume; Inbound = inbNume.Length; InboundName = inbNume; Outbound = outb; PageRank = 1; } } } Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Explorarea structurii
148 9.1.3. PageRanker.cs Implementarea propriu-zis a algoritmului PageRank iterativ.
using System; using System.Collections.Generic; using System.Text;
namespace PageRank { class PageRanker { public static void RankSite(WebPage[] site, double d, int noIter) { for (int i = 0; i < noIter; i++) { for (int j = 0; j < site.Length; j++) { double prt = 0; for (int k = 0; k < site[j].Inbound; k++) { char ibn = site[j].InboundName[k]; int index = 0; while (site[index].Name != ibn) index++; prt += site[index].PageRank / (double)site[index].Outbound; } site[j].PageRank = (1 - d) + d * prt; } } } } }
Rezultatele execuiei programului, coeficienii PageRank ai fiecrei pagini din site-urile considerate, sunt prezentate n figura 9.1. Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com Relevana paginilor web
149
Figura 9.1. Rezultatele execuiei programului
Florin Leon (2008). Explorarea datelor web. Aplicatii, Tehnopress, Iasi, ISBN 978-973-702-530-2 http://florinleon.byethost24.com