webmining: sample solution u1 a1&a2
This commit is contained in:
parent
759987e182
commit
4cde28bd0c
220
ss2013/1_Web Mining/Uebungen/1_Uebung/u1.php
Normal file
220
ss2013/1_Web Mining/Uebungen/1_Uebung/u1.php
Normal file
@ -0,0 +1,220 @@
|
||||
<?php
|
||||
|
||||
error_reporting(E_ALL | E_STRICT);
|
||||
|
||||
function U2_sortByCount($a,$b){
|
||||
if ($a['count'] == $b['count']) {
|
||||
return 0;}
|
||||
return ($a['count'] > $b['count']) ? -1 : 1;
|
||||
}
|
||||
|
||||
function U2_getWordList($text, $stopwords = array()){
|
||||
$result = array();
|
||||
|
||||
$words = explode(' ', $text);
|
||||
|
||||
foreach($words as $word){
|
||||
|
||||
if(in_array($word, $stopwords)){
|
||||
continue;}
|
||||
|
||||
$found = false;
|
||||
for($i = 0; $i<count($result); $i++){
|
||||
if($result[$i]['word'] == $word){
|
||||
$result[$i]['count'] += 1;
|
||||
$result[$i]['perc'] += 1/count($words);
|
||||
$found = true;
|
||||
break;}
|
||||
}
|
||||
if(!$found){
|
||||
$result[] = array('word' => $word, 'count' => 1, 'perc' => 1/count($words));}
|
||||
}
|
||||
|
||||
usort($result,'U2_sortByCount');
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
echo '<!DOCTYPE>'.
|
||||
'<html>'.
|
||||
'<head>'.
|
||||
'<meta charset="utf-8" />'.
|
||||
'</head>'.
|
||||
'<body>';
|
||||
|
||||
echo 'Übung 1 - Web Mining</br>
|
||||
Abgabetermin: Sonntag, 05.05.</br>';
|
||||
|
||||
echo '<ol>
|
||||
<!-- U1 -->
|
||||
<li>Überlegen Sie sich eine neuartige, originelle Web Mining Anwendung, die mit Text-Klassifikationsverfahren gelöst werden könnte. Skizzieren Sie eine mögliche Umsetzung (Sammlung der Trainingsdaten, Klassifikation der Trainingsdaten, Einsatz des gelernten Klassifikators in der Praxis). (2 Punkte)</li>
|
||||
<!-- U2 -->
|
||||
<li>Schreiben Sie ein einfaches Programm, das eine sortierte Liste der in einem Text vorkommenden Worte (im weitesten Sinn alles was durch Leerzeichen begrenzt wird) mit den assoziierten Häufigkeiten (absolut und prozentual) erstellt und sortiert ausgibt. (2 Punkte)
|
||||
<ul><li>Vergleichen Sie die 30 am häufigsten vorkommenden Worte in zwei oder mehreren längeren Texten der gleichen Sprache (z. B. E-books, <a class="external-link" href="http://www.gutenberg.org/">Projekt Gutenberg</a>, etc. ). Sind diese Worte als Merkmale für Text-Klassifizierungs-Aufgaben geeignet? Warum?</li><li>Modifizieren Sie Ihr Programm dahingehend, daß es eine Liste von Stoppwörtern erhalten kann, die ignoriert werden. Wiederholen Sie die vorherige Aufgabe, indem Sie jedoch diesmal die Stoppwörter der jeweiligen Sprache ignorieren (eine Auswahl finden Sie unter <a href="http://nltk.googlecode.com/svn/trunk/nltk_data/packages/corpora/stopwords.zip" target="_top">http://nltk.googlecode.com/svn/trunk/nltk_data/packages/corpora/stopwords.zip</a>). Wie würden Sie nun die Eignung der 30 häufigsten Wörter einschätzen?</li></ul>
|
||||
</li><li>Die Auftrittswahrscheinlichkeiten von Worten in Texten folgen einer sogenannten Zipf-Verteilung, d. h. einer Verteilung, die doppelt logarithmisch ist. Überprüfen Sie das anhand der gewählten Texte. (2 Punkte)
|
||||
<ul><li>Plotten Sie die Häufigkeiten (y-Achse) über den Rang (x-Achse), also die Anzahl der Vorkommnisse des häufigsten Wortes zuerst, dann die Anzahl des zweithäufigsten Wortes, etc. Betrachten Sie sowohl eine absolute als auch eine logarithmische Skalierung beider Achsen. Was können Sie beobachten?<br></li><li>Bestimmen Sie die Anzahl der Worte, die mit einer gegebenen Häufigkeit vorkommen (also, wie viele Wörter gibt es, die mit Häufigkeit 1 vorkommen, wie viele mit Häufigkeit 2, etc. ). Produzieren Sie ähnliche Grafiken (Anzahl der Worte mit einer gewissen Häufigkeit über die Häufigkeit) und interpretieren Sie diese.<br></li></ul>
|
||||
</li><li>Modifizieren Sie das Programm, so daß es nicht Worte sondern Buchstaben und Buchstabenpaare zählt. Vergleichen Sie deren Häufigkeitsverteilung sowohl zweier in der gleichen Sprache verfassten Texte als auch zweier in verschiedenen Sprachen abgefasster Texte. (2 Punkte)</li><li>Laden Sie sich unser kleines Firefox-Plugin (<a title="keaddon1.zip" class="internal-link" href="keaddon1.zip">http://www.ke.tu-darmstadt.de/lehre/ss13/web-mining/keaddon1.zip</a>) herunter und machen Sie sich damit und den Entwicklungstools vertraut. Weiter unten finden Sie Hinweise zur Verwendung. Erweitern Sie die Funktion <code>student(text)</code> in der Datei <code>lib/student.js</code> dahingehend, daß es drei Sprachen erkennen kann. Die Liste der bisher unterstützten Sprachen können Sie gerne in <code>languages.js</code> nach Belieben erweitern. Verwenden Sie für die Spracherkennung eine einfache Heuristik, die z.B. auf den in der vorherigen Aufgabe vorgestellten Stoppwörtern basiert. Browsen Sie dann ein wenig im Web herum und berichten uns von Ihren Ergebnissen und Erfahrungen mit dem Plugin. (1 Punkt)</li></ol>
|
||||
<h2>Allgemeine Hinweise</h2>
|
||||
<div>Achten Sie darauf, bei den Texten nur die relevanten Abschnitte zu verwenden und z.B. Lizenzhinweise o.ä. auszuschließen. Oft empfiehlt es sich auch, auf unterschiedliche Betrachtung von Groß- und Kleinschreibung zu verzichten.</div>
|
||||
<h2><a name="Hinweise_zum_Firefox_Plugin"></a>Hinweise zum Firefox-Plugin</h2>
|
||||
<p>Das Firefox-Plugin ist ein kleines Tool, welches in der Lage ist, abhängig von der gerade angezeigten Seite ein kleines Symbol, in unserem Falle eine Fahne, in der rechten Ecke der unteren Statusleiste im Firefox anzuzeigen. Das Tool ist bereits in der Lage, den Text einer Web-Seite (technisch gesehen nur Text innerhalb eines Paragraphen, also z.B. keine Überschriften) zu extrahieren und zu verarbeiten. Die Verarbeitung findet in der Funktion <code>student(text)</code> in <code>lib/student.js</code> statt. Diese gibt momentan statisch eine Sprache zurück, die dann als Fahne dargestellt wird. Hierum kümmert sich auch das Firefox-Plugin selbständig.</p>
|
||||
<h3><a name="Programmierung_und_Entwicklungsu"></a>Programmierung und Entwicklungsumgebung</h3>
|
||||
Entpacken sie den Inhalt der Zip-Datei in ein Verzeichnis, das Projektverzeichnis. Laden Sie sich die neueste Firefox Add-on SDK herunter und installieren Sie sie auf ihrem Rechner. Eine Installationsanleitung befindet sich im unten angegebenen Link. Hierbei handelt es sich im Wesentlichen um eine Sammlung von Skripten und Bibliotheken, die Ihnen das Arbeiten mit Firefox Plugins erleichtert. Nach der Installation steht Ihnen der Befehl <code>cfx</code> zur Verfügung. Führen Sie <code>cfx run</code> innerhalb des Projektverzeichnisses aus, um Ihre Änderungen im Browser zu testen. Ihre prognostizierte Sprache wird in der Addon-Leiste angezeigt. Alternativ dazu können Sie ihre Funktion in Unittest testen, welche Sie in <code>test-main.js</code> implementieren können.
|
||||
<p>Um Ihnen die Arbeit zu erleichtern, stellen wir einige Helferfunktionen bereit. Diese befinden sich in <code>utility.js</code> und dienen zur Orientierung und keinesfalls als strikte Vorgabe.</p>
|
||||
<p><strong>Anmerkungen:</strong></p>
|
||||
<ul><li>Es ist nicht unbedingt notwendig, die SDK zu installieren. Sie können auch die xpi Datei mit einem Zip-Programm entpacken, die Änderungen vornehmen und wieder neu zippen. Das Plugin selbst laden Sie, indem Sie die xpi Datei in Firefox öffnen.</li><li>Falls Sie eine ältere Firefox-Version installiert haben, kann es Ihnen passieren, daß Sie entweder das Plugin über die xpi Datei nicht installieren können oder es in den Erweiterung als deaktiviert markiert wird. Installieren Sie bitte in diesem Fall die aktuellste Firefox Version, oder ändern Sie die Standard-Einstellung diesbezüglich im SDK. Ändern Sie hierfür im SDK-Verzeichnis in der Datei <code>python-lib/cuddlefish/app-extension/install.rdf</code> die Versionsangabe in der Zeile <code><em:minVersion>10.0</em:minVersion></code> auf z.B. <code>4.0</code>. Alternativ können Sie diese Zeile in der <code>install.rdf</code> Datei im xpi-Paket ändern.</li><li>Für die Add-on SDK 114 war es ausreichend, den Inhalt der Zip-Datei in ein Verzeichnis zu entpacken, dort eine Kommandozeile zu öffnen und <code>activate.bat</code> zu starten. Daraufhin stand der Befehl <code>cfx</code> in dieser Kommandozeile zur Verfügung (Python-Installation notwendig).</li><li>Mit <code>self.data.load("dateiname")</code> sollte man Dateien laden können, die im Ordner <code>data</code> liegen.</li></ul>
|
||||
<h3><a name="Tools_und_Links"></a>Tools und Links</h3>
|
||||
<ul><li><a title="keaddon1.zip" class="internal-link" href="keaddon1.zip" target="_top">KE-Addon 1</a></li><li><a class="external-link" href="https://ftp.mozilla.org/pub/mozilla.org/labs/jetpack/jetpack-sdk-latest.zip">Firefox Add-on SDK<br></a></li><li><a href="http://www.w3schools.com/js/default.asp" target="_top">w3schools JavaScript Tutorial</a></li></ul>
|
||||
|
||||
<p> </p>';
|
||||
|
||||
//Solution U1
|
||||
echo "<h1>Solution U1</h1>";
|
||||
echo "Erkenne Mode/Internetworte(unbekannte) und klassifiziere sie, bestimmte häufung in Unterhaltungen etc., um herauszufinden, was das nächste Modewort sein wird. Bsp: 'lol' oder 'rofl'.";
|
||||
echo "Sammle Trainingsdaten via Twitter.";
|
||||
|
||||
//Solution U2
|
||||
|
||||
|
||||
$text1 = 'Wie bereits erwähnt, teilt der Doctype dem Browser oder auch Validator mit, welcher Code auf der Website verwendet wird. Je nach Angabe verwendet ein Browser dadurch den Normalen Modus oder den Quirks-Mode um den Code zu Interpretieren. Um die Seite also korrekt interpretieren zu lassen ist es unabdingbar den Doctype zu definieren.';
|
||||
$text2 = 'Der Server prüft anhand der ersten Bytes des Dokuments die Zeichenkodierung und benachrichtigt das Benutzerprogramm durch den Charset-Parameter im Content-Type-Header des HTTP-Protokolls. Da aber manche Server nicht gestatten, einen Charset-Parameter zu senden und andere einfach nicht entsprechend konfiguriert sind, bietet HTML seit Version 4 die Angabe des Zeichensatzes.';
|
||||
echo "<h1>Solution U2</h1>";
|
||||
$u2_res1 = U2_getWordList($text1);
|
||||
echo "<h2>Words Text1</h2>";
|
||||
echo "<table><tr><th>Word</th><th>Count</th><th>Percent</th></tr>";
|
||||
foreach($u2_res1 as $res){
|
||||
echo "<tr><td>".$res['word']."</td><td>".$res['count']."</td><td>".($res['perc']*100)."</td></tr>";}
|
||||
echo "</table>";
|
||||
|
||||
$u2_res2 = U2_getWordList($text2);
|
||||
echo "<h2>Words Text2</h2>";
|
||||
echo "<table><tr><th>Word</th><th>Count</th><th>Percent</th></tr>";
|
||||
foreach($u2_res2 as $res){
|
||||
echo "<tr><td>".$res['word']."</td><td>".$res['count']."</td><td>".($res['perc']*100)."</td></tr>";}
|
||||
echo "</table>";
|
||||
|
||||
$best_1 = array_slice($u2_res1,0,30);
|
||||
echo "<h2>30 best Text1</h2>";
|
||||
echo "<table><tr><th>Word</th><th>Count</th><th>Percent</th></tr>";
|
||||
foreach($best_1 as $res){
|
||||
echo "<tr><td>".$res['word']."</td><td>".$res['count']."</td><td>".($res['perc']*100)."</td></tr>";}
|
||||
echo "</table>";
|
||||
|
||||
$best_2 = array_slice($u2_res2,0,30);
|
||||
echo "<h2>30 best Text2</h2>";
|
||||
echo "<table><tr><th>Word</th><th>Count</th><th>Percent</th></tr>";
|
||||
foreach($best_2 as $res){
|
||||
echo "<tr><td>".$res['word']."</td><td>".$res['count']."</td><td>".($res['perc']*100)."</td></tr>";}
|
||||
echo "</table>";
|
||||
|
||||
$best = array_merge($best_1,$best_2);
|
||||
usort($best,'U2_sortByCount');
|
||||
echo "<h2>Merged 30 best</h2>";
|
||||
echo "<table><tr><th>Word</th><th>Count</th><th>Percent</th></tr>";
|
||||
foreach($best as $res){
|
||||
echo "<tr><td>".$res['word']."</td><td>".$res['count']."</td><td>".($res['perc']*100)."</td></tr>";}
|
||||
echo "</table>";
|
||||
|
||||
$u2_res1 = U2_getWordList('Wie bereits erwähnt, teilt der Doctype dem Browser oder auch Validator mit, welcher Code auf der Website verwendet wird. Je nach Angabe verwendet ein Browser dadurch den Normalen Modus oder den Quirks-Mode um den Code zu Interpretieren. Um die Seite also korrekt interpretieren zu lassen ist es unabdingbar den Doctype zu definieren.');
|
||||
echo "<h2>Words Text1</h2>";
|
||||
echo "<table><tr><th>Word</th><th>Count</th><th>Percent</th></tr>";
|
||||
foreach($u2_res1 as $res){
|
||||
echo "<tr><td>".$res['word']."</td><td>".$res['count']."</td><td>".($res['perc']*100)."</td></tr>";}
|
||||
echo "</table>";
|
||||
|
||||
$u2_res2 = U2_getWordList('Der Server prüft anhand der ersten Bytes des Dokuments die Zeichenkodierung und benachrichtigt das Benutzerprogramm durch den Charset-Parameter im Content-Type-Header des HTTP-Protokolls. Da aber manche Server nicht gestatten, einen Charset-Parameter zu senden und andere einfach nicht entsprechend konfiguriert sind, bietet HTML seit Version 4 die Angabe des Zeichensatzes.');
|
||||
echo "<h2>Words Text2</h2>";
|
||||
echo "<table><tr><th>Word</th><th>Count</th><th>Percent</th></tr>";
|
||||
foreach($u2_res2 as $res){
|
||||
echo "<tr><td>".$res['word']."</td><td>".$res['count']."</td><td>".($res['perc']*100)."</td></tr>";}
|
||||
echo "</table>";
|
||||
|
||||
$best_1 = array_slice($u2_res1,0,30);
|
||||
echo "<h2>30 best Text1</h2>";
|
||||
echo "<table><tr><th>Word</th><th>Count</th><th>Percent</th></tr>";
|
||||
foreach($best_1 as $res){
|
||||
echo "<tr><td>".$res['word']."</td><td>".$res['count']."</td><td>".($res['perc']*100)."</td></tr>";}
|
||||
echo "</table>";
|
||||
|
||||
$best_2 = array_slice($u2_res2,0,30);
|
||||
echo "<h2>30 best Text2</h2>";
|
||||
echo "<table><tr><th>Word</th><th>Count</th><th>Percent</th></tr>";
|
||||
foreach($best_2 as $res){
|
||||
echo "<tr><td>".$res['word']."</td><td>".$res['count']."</td><td>".($res['perc']*100)."</td></tr>";}
|
||||
echo "</table>";
|
||||
|
||||
$best = array_merge($best_1,$best_2);
|
||||
usort($best,'U2_sortByCount');
|
||||
echo "<h2>Merged 30 best</h2>";
|
||||
echo "<table><tr><th>Word</th><th>Count</th><th>Percent</th></tr>";
|
||||
foreach($best as $res){
|
||||
echo "<tr><td>".$res['word']."</td><td>".$res['count']."</td><td>".($res['perc']*100)."</td></tr>";}
|
||||
echo "</table>";
|
||||
|
||||
$stopwords = array( 'aber','alle','allem','allen','aller','alles','als','also','am',
|
||||
'an','ander','andere','anderem','anderen','anderer','anderes',
|
||||
'anderm','andern','anderr','anders','auch','auf','aus','bei',
|
||||
'bin','bis','bist','da','damit','dann','der','den','des','dem',
|
||||
'die','das','daß','derselbe','derselben','denselben','desselben',
|
||||
'demselben','dieselbe','dieselben','dasselbe','dazu','dein','deine',
|
||||
'deinem','deinen','deiner','deines','denn','derer','dessen','dich',
|
||||
'dir','du','dies','diese','diesem','diesen','dieser','dieses','doch',
|
||||
'dort','durch','ein','eine','einem','einen','einer','eines','einig',
|
||||
'einige','einigem','einigen','einiger','einiges','einmal','er',
|
||||
'ihn','ihm','es','etwas','euer','eure','eurem','euren','eurer',
|
||||
'eures','für','gegen','gewesen','hab','habe','haben','hat','hatte',
|
||||
'hatten','hier','hin','hinter','ich','mich','mir','ihr','ihre',
|
||||
'ihrem','ihren','ihrer','ihres','euch','im','in','indem','ins',
|
||||
'ist','jede','jedem','jeden','jeder','jedes','jene','jenem','jenen',
|
||||
'jener','jenes','jetzt','kann','kein','keine','keinem','keinen',
|
||||
'keiner','keines','können','könnte','machen','man','manche',
|
||||
'manchem','manchen','mancher','manches','mein','meine','meinem',
|
||||
'meinen','meiner','meines','mit','muss','musste','nach','nicht',
|
||||
'nichts','noch','nun','nur','ob','oder','ohne','sehr','sein',
|
||||
'seine','seinem','seinen','seiner','seines','selbst','sich','sie',
|
||||
'ihnen','sind','so','solche','solchem','solchen','solcher','solches',
|
||||
'soll','sollte','sondern','sonst','über','um','und','uns','unse',
|
||||
'unsem','unsen','unser','unses','unter','viel','vom','von','vor',
|
||||
'während','war','waren','warst','was','weg','weil','weiter','welche',
|
||||
'welchem','welchen','welcher','welches','wenn','werde','werden','wie',
|
||||
'wieder','will','wir','wird','wirst','wo','wollen','wollte','würde',
|
||||
'würden','zu','zum','zur','zwar','zwischen');
|
||||
|
||||
$filter_u2_res1 = U2_getWordList($text1,$stopwords);
|
||||
echo "<h2>Words Text1 Filtered</h2>";
|
||||
echo "<table><tr><th>Word</th><th>Count</th><th>Percent</th></tr>";
|
||||
foreach($filter_u2_res1 as $res){
|
||||
echo "<tr><td>".$res['word']."</td><td>".$res['count']."</td><td>".($res['perc']*100)."</td></tr>";}
|
||||
echo "</table>";
|
||||
|
||||
$filter_u2_res2 = U2_getWordList($text2,$stopwords);
|
||||
echo "<h2>Words Text2 Filtered</h2>";
|
||||
echo "<table><tr><th>Word</th><th>Count</th><th>Percent</th></tr>";
|
||||
foreach($filter_u2_res2 as $res){
|
||||
echo "<tr><td>".$res['word']."</td><td>".$res['count']."</td><td>".($res['perc']*100)."</td></tr>";}
|
||||
echo "</table>";
|
||||
|
||||
$filter_best_1 = array_slice($filter_u2_res1,0,30);
|
||||
echo "<h2>30 best Text1 Filtered</h2>";
|
||||
echo "<table><tr><th>Word</th><th>Count</th><th>Percent</th></tr>";
|
||||
foreach($filter_best_1 as $res){
|
||||
echo "<tr><td>".$res['word']."</td><td>".$res['count']."</td><td>".($res['perc']*100)."</td></tr>";}
|
||||
echo "</table>";
|
||||
|
||||
$filter_best_2 = array_slice($filter_u2_res2,0,30);
|
||||
echo "<h2>30 best Text2 Filtered</h2>";
|
||||
echo "<table><tr><th>Word</th><th>Count</th><th>Percent</th></tr>";
|
||||
foreach($filter_best_2 as $res){
|
||||
echo "<tr><td>".$res['word']."</td><td>".$res['count']."</td><td>".($res['perc']*100)."</td></tr>";}
|
||||
echo "</table>";
|
||||
|
||||
$filter_best = array_merge($filter_best_1,$filter_best_2);
|
||||
usort($filter_best,'U2_sortByCount');
|
||||
echo "<h2>Merged 30 best Filtered</h2>";
|
||||
echo "<table><tr><th>Word</th><th>Count</th><th>Percent</th></tr>";
|
||||
foreach($filter_best as $res){
|
||||
echo "<tr><td>".$res['word']."</td><td>".$res['count']."</td><td>".($res['perc']*100)."</td></tr>";}
|
||||
echo "</table>";
|
||||
|
||||
echo '</body>'.
|
||||
'</html>';
|
||||
Loading…
x
Reference in New Issue
Block a user