HashMap mit Wortliste vergleichen

Status
Nicht offen für weitere Antworten.

kognitio

Aktives Mitglied
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:
Code:
Abs
Aramaic
Bristol
Chantal
Chicago
Chinese
Cuisinart
Damascus
Diego
Email
English
Eva
February
Forstmann
Gerber
Harrington
Internet
Italian
Kershaw
Lite
Ltd
Morton
Pak
...
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:
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 .......
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:
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 .....
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:
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
 
zahl.i++;
oren.write(wort + " "); // und an dieser Stelle sollte er die Häufigkeit schreiben
oren.flush();

ich hatte jetzt keien zeit mehr genau zu schauen, aber als Anregung ist mir aufgefallen, daß Du scheinbar die Häufigkeit der Wörter zählst, aber bei zahl.i++ nicht mehr auf Null zurücksetzt oder hab ich das falsch gelesen?
 
warum sollte ich zahl.i auf Null zurücksetzen? Es läuft immer nur ein File pro for-schleife durch...
Ich bin über jede Anregung dankbar... da ich echt nicht weiterkomme
 
ich habe den Code nun ein wenig geändert und habe nun ein "konkrete Frage"... Ich lese die Wortliste ein und stelle den Zähler auf null:
Code:
while ((lesen = worte.readLine()) != null)
                                        {
                                                Vektoren.put(lesen, new Count(word, 0));
                                        }
                                        while ((einzelneFiles = noch.readLine())!= null)

hier müsste doch nun jedes Wort, da jedes nur einmal vorkommt, den den Wert 0 bekommen, oder?
hier nochmal die Klasse Count, die am Ende meines Codes hängt:
Code:
static class Count
        {
                Count(String word, int i)
                {
                        this.word = word;
                        this.i = i;
                }
                String word;
                int i;
        }

dann sage ich ihm, das, wenn ein Wort in dem eingelesenen File auch in der Wortliste vorkommt, zähle es um eins hoch:
Code:
if (Vektoren.get(wort) != null)
{
zahl.i++;
und dann sage ich ihm, dass, wenn Du das File nun ganz eingelsen hast, gib mir die Values von "Vektoren" und schreibe sie ihn ein neues File
Code:
if ((einzelneFiles = noch.readLine()) == null)
                                                                {
                                                                        oren.write(zahl.i + " ");
                                                                        oren.flush();
                                                                }
und was macht er----- nichts. er gibt mir ein leeres file zurück
WARUM???
herzliche Grüße,
Stephan
 
ich habe jetzt verstanden, warum er mir ein leeres File zurückgibt, im Prinzip eine dumme Frage, da ich das ganze innerhalb der while-schleife geschrieben habe.
aber jetzt habe ich es so geschrieben, dass es im Grunde gehen müsste, nämlich, wenn die while-schleife fertig ist, dann gibt er mir denn inhalt aus der HashMap "vektoren" wieder. und in dieser müssten jetzt stehen, welches wort wieviel mal vorkommt, aber nun behauptet er, es gäbe eine nullpointerException an der Zeile "127" an dieser Stelle zählt er mir eigentlich die Wörter hoch...
Code:
zahl.i++;

Warum kriege ich hier eine NullPointerException. Ich habe es doch definiert?
Code:
for (int h = 0; h < listing.length; h++)
     94                         {
     95                         int schleifenchecker = 0;
     96                                 if (listing[h].startsWith("http"))
     97                                 {
     98                                         FileReader again = new FileReader(listing[h]);
     99                                         BufferedReader noch = new BufferedReader(again);
    100                                         FileReader liste = new FileReader("Wortliste.txt");
    101                                         BufferedReader worte = new BufferedReader(liste);
    102                                         FileWriter vekt = new FileWriter(listing[h] + " neu");
    103                                         BufferedWriter oren = new BufferedWriter(vekt);
    104                                         String lesen;
    105                                         String einzelneFiles;
    106                                         while ((lesen = worte.readLine()) != null)
    107                                         {
    108                                                 Vektoren.put(lesen, new Count(word, 0));
    109                                         }
    110                                         while ((einzelneFiles = noch.readLine())!= null)
    111                                         {
    112                                         /*      Set sat = Vektoren.entrySet();
    113                                                 Iterator iter = sat.iterator();
    114                                                 Map.Entry entry = (Map.Entry) iter.next();
    115                                         */      StringTokenizer sta = new StringTokenizer(einzelneFiles, delim);
    116                                                 while (sta.hasMoreTokens())
    117                                                 {
    118                                                         if (stopWords.get(word) == null)
    119                                                         {
    120                                                                 wort = sta.nextToken().toLowerCase();
    121                                                                 zahl = (Count) Vektoren.get(word);
    122                                         //                      zahl = (Count) entry.getValue();
    123                                                                 if (Vektoren.get(wort) != null)
    124 
    125                                                                 {
    126 
    127                                                                         zahl.i++;
    128                                                                 }
    129                                                         }
    130                                                 }
    131                                         }
    132                                         Set sat = Vektoren.entrySet();
    133                                         for(Iterator ite = sat.iterator(); ite.hasNext();)
    134                                         {
    135                                                 Map.Entry entry = (Map.Entry) ite.next();
    136                                                 wort = (String) entry.getKey();
    137                                                 zahl = (Count) entry.getValue();
    138                                                 {
    139                                                         oren.write(zahl.i + " ");
    140                                                 }
    141                                         }
...
 
Code:
zahl = (Count) Vektoren.get(word);
scheinbar hat er in 'Vektoren' kein eintrag mit key 'word' -> wird null geliefert und dann die Exception geworfen
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben