Hallo miteinander....
(gleich vorab, ich bin kein Informatiker und arbeite auch noch nicht wirklich kange mit Java) ich sitze jetzt seit zwei Tagen an diesem Problem und komme einfach nicht weiter. Also, das Problem ist folgendes:
Ich habe 100 html-Seiten, die muss ich für ein Projekt an unserer Uni auswerten. Das klappt auch zum Teil ganz gut.
Die Auswertung sollte folgendermaßen stattfinden, also:
aus den seiten, die wörter einlesen und mit einer HashMap, genannt "stopWords" vergleichen und die Stoppwörter herausschmeißen. Dann noch jedes Wort herausfiltern, dass weniger als 5-mal vorkommt. Mit diesen Ergebnissen eine "Wortliste" erstellen, die dann zum Vergleichen verwendet wird, das bedeutet, ich habe eine Wortliste, in der alle Wörte (nach obigen kriterien) enthalten sind und die ich nun zum erstellen von Wortvektoren verwenden sollte. Und zwar geht das folgendermaßen von statten.
Ich gebe hierzu ein kleines Beispiel:
Das hier ist ein Ausschnitt aus einer BeispielsWortliste:
damit sollten nun Vektoren erstellt werden, nach dem folgenden Schemata:
0 8 7 0 0 0 5 0 0...
9 12 0 0 0 0 6 0 ...
usw.
jede Zeile steht für ein html-file. die "0" in der ersten Zeile bedeutet, dass das Wort "ABS" in diesem File 0-mal vorkommt, während "Bristol" in diesem File 8-mal vorkommt.
Was ich brauche, ist ein File, dass mir das am Ende aller eingelesenen html-files anzeigt, und zwar nach folgendem Schemata:
bis jetzt habe ich folgendes gemeistert:
Ich lese die 100 html, Seiten ein, erstelle eine Wortliste, die alle Wörter beeinhalten...
Ich komme auch soweit, dass ich nur nich die Wörter, die den obigen Kriterien enstprechen, später in den einzelnen Files (mit dem Zusatz "neu") habe, also das sieht ungefähr dann so aus, wie in diesem File:
die Nullen habe ich mit einer "else" Bedingung eingefügt, wenn das Wort in der Wortliste vorhanden ist, dann schreib mir das Wort und anderenfalls eine "0".
aber er soll mir ja die Häufigkeit der einzelnen Wörter angeben und wie ich das hinbekomme, weiß ich nicht (mehr ...)
ichhabe in meinem SourceCode eine zusätzliche "static class Count", mir der ich die leichter Zählen kann, aber, wenn ich diese einfüge in die HashMap "Vektoren", die mir die Wortliste einlist, dann funktioniert das leider nicht so, wie es sollte, sondern er zählt jedes Wort nacheinander hoch. Ich demostriere das mit dem obigen "neu" Beispiel:
ich habe die Striche eingefügt, um die Worte mit der "gezählten Zahl" besser erlennen zu können...
So und nun hier der SourceCode... bei dem mir hoffentlich jemand helfen kann:
Man kann den Code kompilieren, falls das jemand tun möchte.
Falls jemanden was einfällt, wie ich das lösen kann, bin ich ungemein dankbar.
Herzliche Grüße,
Stephan
(gleich vorab, ich bin kein Informatiker und arbeite auch noch nicht wirklich kange mit Java) ich sitze jetzt seit zwei Tagen an diesem Problem und komme einfach nicht weiter. Also, das Problem ist folgendes:
Ich habe 100 html-Seiten, die muss ich für ein Projekt an unserer Uni auswerten. Das klappt auch zum Teil ganz gut.
Die Auswertung sollte folgendermaßen stattfinden, also:
aus den seiten, die wörter einlesen und mit einer HashMap, genannt "stopWords" vergleichen und die Stoppwörter herausschmeißen. Dann noch jedes Wort herausfiltern, dass weniger als 5-mal vorkommt. Mit diesen Ergebnissen eine "Wortliste" erstellen, die dann zum Vergleichen verwendet wird, das bedeutet, ich habe eine Wortliste, in der alle Wörte (nach obigen kriterien) enthalten sind und die ich nun zum erstellen von Wortvektoren verwenden sollte. Und zwar geht das folgendermaßen von statten.
Ich gebe hierzu ein kleines Beispiel:
Das hier ist ein Ausschnitt aus einer BeispielsWortliste:
Code:
Abs
Aramaic
Bristol
Chantal
Chicago
Chinese
Cuisinart
Damascus
Diego
Email
English
Eva
February
Forstmann
Gerber
Harrington
Internet
Italian
Kershaw
Lite
Ltd
Morton
Pak
...
0 8 7 0 0 0 5 0 0...
9 12 0 0 0 0 6 0 ...
usw.
jede Zeile steht für ein html-file. die "0" in der ersten Zeile bedeutet, dass das Wort "ABS" in diesem File 0-mal vorkommt, während "Bristol" in diesem File 8-mal vorkommt.
Was ich brauche, ist ein File, dass mir das am Ende aller eingelesenen html-files anzeigt, und zwar nach folgendem Schemata:
Code:
4 90 // die "4" sagt dem späteren Analyse-programm, wieviel Zeilen das Programm hat und "90", wieviel Zahlen pro Zeile
1 0 0 1 0 4 0 0 1 1 0 3 0 0 1 0 0 0 0 0 0 2 1 1 2 2 0 3 1 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0 1 1
4 1 1 0 1 0 1 1 0 0 1 0 1 1 1 1 5 2 1 5 5 0 0 0 0 2 1 0 0 4 0 1 1 1 1 1 0 4 2 1 1 2 0 1 1 1 0 0 2 1 1 2 1 1 2 1 0 1 2 1 0 1 1 1 1 1 2 0 1 0 1 0 9 1 1 1 0 0 1 1 1 2 0 5 2 1 7 1 0 0
1 0 0 1 0 4 0 0 1 1 0 3 0 0 1 0 0 0 0 0 0 2 1 1 2 2 0 3 1 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0 1 1
4 1 1 0 1 0 1 1 0 0 1 0 1 1 1 1 5 2 1 5 5 0 0 0 0 2 1 0 0 4 0 1 1 1 1 1 0 4 2 1 1 2 0 1 1 1 0 0 2 1 1 2 1 1 2 1 0 1 2 1 0 1 1 1 1 1 2 0 1 0 1 0 9 1 1 1 0 0 1 1 1 2 0 5 2 1 7 1 0 0
usw. usw.
bis jetzt habe ich folgendes gemeistert:
Ich lese die 100 html, Seiten ein, erstelle eine Wortliste, die alle Wörter beeinhalten...
Ich komme auch soweit, dass ich nur nich die Wörter, die den obigen Kriterien enstprechen, später in den einzelnen Files (mit dem Zusatz "neu") habe, also das sieht ungefähr dann so aus, wie in diesem File:
Code:
viking chef 0 knife 0 0 0 table 0 online store viking chef 0 knife 0 0 0 table 0 online store 0 0 0 0 0 0 netscape 0 0 0 0 unique 0 0 0 0 0 0 shirts 0 fashion 0 0 0 discount books 0 0 0 0 0 0 0 0 0 designer 0 0 0 0 decorating 0 0 0 kitchen outdoor decor 0 0 clothing 0 0 0 0 games 0 0 0 0 games 0 0 0 0 wine 0 0 0 0 0 0 0 table 0 0 care 0 care 0 0 0 0 0 0 0 0 0 0 0 0 0 viking chef 0 knife 0 0 viking chef 0 knife 0 0 0 0 0 0 0 0 0 0 knives 0 knife 0 0 0 0 0 0 0 0 0 cooking 0 0 0 knife cooking becomes 0 0 0 0 0 0 0 knife 0 .......
aber er soll mir ja die Häufigkeit der einzelnen Wörter angeben und wie ich das hinbekomme, weiß ich nicht (mehr ...)
ichhabe in meinem SourceCode eine zusätzliche "static class Count", mir der ich die leichter Zählen kann, aber, wenn ich diese einfüge in die HashMap "Vektoren", die mir die Wortliste einlist, dann funktioniert das leider nicht so, wie es sollte, sondern er zählt jedes Wort nacheinander hoch. Ich demostriere das mit dem obigen "neu" Beispiel:
Code:
||viking: 2||||chef: 3||0 ||knife: 4||0 0 0 ||table: 5||0 ||online: 6||||store: 7||||viking: 8||||chef: 9||0 ||knife: 10||0 0 0 ||table: 11||0 ||online: 12||||store: 13||0 0 0 0 0 0 ||netscape: 14||0 0 0 0 ||unique: 15||0 0 0 0 0 0 ||shirts: 16||0 ||fashion: 17||0 0 0 ||discount: 18||||books: 19||0 0 0 0 0 0 0 0 0 ||designer: 20||0 0 0 0 ||decorating: 21||0 0 0 ||kitchen: 22||||outdoor: 23||||decor: 24||0 0 ||clothing: 25||0 0 0 0 ||games: 26||0 0 0 0 ||games: 27||0 0 0 0 ||wine: 28||0 0 0 0 0 0 0 ||table: 29||0 0 ||care: 30||0 ||care: 31||0 0 0 0 0 0 0 0 0 0 0 0 0 .....
So und nun hier der SourceCode... bei dem mir hoffentlich jemand helfen kann:
Code:
import java.util.*;
import java.io.*;
public class WordFrequency
{
static public void main(String[] args)
throws Exception
{
File direct = new File( "." );
String [] listing = direct.list();
HashMap words = new HashMap();
HashMap stopWords = new HashMap();
HashMap Vektoren = new HashMap();
HashMap frequency = new HashMap();
String delim = " \t\n.,{}><:$%\"+#'*¬?¬¢[]|;?!-/()[]\\'"; //trennt die tokens diesen stellen
String file;
String word = "bla"; // der Compiler meinte das "word" nicht initialisiert sei, daher habe ich ihm den gefallen getan...
String wort = "blub";
Count count;
Count zahl;
//StoppWörter einlesen
FileReader kl = new FileReader("stops.txt");
BufferedReader mk = new BufferedReader(kl);
//String s = "";
String einlesen;
while ((einlesen = mk.readLine()) != null)
{
stopWords.put(einlesen, einlesen);
}
mk.close();
try
{
for (int k = 0; k < listing.length; k++)
{
FileReader iha = new FileReader(listing [k]); //hier lese ich alle html-files zum ersten mal ein, um die "Wortliste" zu erstellen ...
BufferedReader in = new BufferedReader(iha);
while ((file = in.readLine()) != null)
{
if (listing[k].startsWith("http"))
{
StringTokenizer st = new StringTokenizer(file, delim);
while (st.hasMoreTokens())
{
word = st.nextToken().toLowerCase();
count = (Count) words.get(word);
if (stopWords.get(word) == null)
{
if (count == null)
{
words.put(word, new Count(word, 1));
}
else
{
count.i++;
}
}
}
}
}
}
int wortZahl = 0;
StringBuffer buffer = new StringBuffer();
for (int f = 0; f < listing.length; f++)
{
if (listing[f].startsWith("http"))
{
PrintWriter writer = new PrintWriter(new FileWriter("Wortliste.txt"));
Set set = words.entrySet();
for(Iterator iter = set.iterator(); iter.hasNext();)
{
Map.Entry entry = (Map.Entry) iter.next();
word = (String) entry.getKey();
count = (Count) entry.getValue();
if(count.i >= 5)
{
writer.println(word); //hier schreibe ich die Wortliste
wortZahl++;
}
}
}
}
for (int h = 0; h < listing.length; h++) // an diesem Block lese ich die Files zumzweiten Mal ein um sie mit der Wortliste zu vergleichen...
{
if (listing[h].startsWith("http"))
{
FileReader again = new FileReader(listing[h]);
BufferedReader noch = new BufferedReader(again);
FileReader liste = new FileReader("Wortliste.txt");
BufferedReader worte = new BufferedReader(liste);
FileWriter vekt = new FileWriter(listing[h] + " neu");
BufferedWriter oren = new BufferedWriter(vekt);
String lesen;
String einzelneFiles;
while ((lesen = worte.readLine()) != null)
{
Vektoren.put(lesen, new Count(word, 1)); // hier füge ich den Zähler aus der klasse "Count" in die hasMap hinzu...
}
while ((einzelneFiles = noch.readLine())!= null)
{
Set sat = Vektoren.entrySet();
Iterator iter = sat.iterator();
Map.Entry entry = (Map.Entry) iter.next();
StringTokenizer sta = new StringTokenizer(einzelneFiles, delim);
while (sta.hasMoreTokens())
{
wort = sta.nextToken().toLowerCase();
zahl = (Count) Vektoren.get(word);
zahl = (Count) entry.getValue();
if (Vektoren.get(wort) != null) // hier vergleicht er, ob das Wort, dass er in dem html-File einliest, auch in der Wortliste ist, wenn nicht, dann schreibe es bitte...
{
zahl.i++;
oren.write(wort + " "); // und an dieser Stelle sollte er die Häufigkeit schreiben
oren.flush();
}
else
{
oren.write("0" + " "); //dieser kleine "Hack" schreibt mir immer eine Null, wenn das Wort nicht vorkommt
oren.flush();
}
}
}
}
}
}
catch (IOException e)
{
}
catch (ClassCastException a)
{
a.printStackTrace();
}
}
static class Count // diese kleine klasse erleichtert mir das zählen innerhalb der hashmap..
{
Count(String word, int i)
{
this.word = word;
this.i = i;
}
String word;
int i;
}
}
Man kann den Code kompilieren, falls das jemand tun möchte.
Falls jemanden was einfällt, wie ich das lösen kann, bin ich ungemein dankbar.
Herzliche Grüße,
Stephan