Matrix, Crawler und Verknüpfung

#1

Hallo!

Ich bin gerade dabei ein Korpus zu erstellen, in dem zu verschiedenen Themen und Sprachen Internetseiten gespeichert werden sollen. Einen Crawler der die Internetseiten findet hab ich bereits. Auf der Benutzeroberfläche kann man verschiedene Themen und Sprachen für die gesuchten Internetseiten ankreuzen.

Das Problem ist nun, dass ich eine Matrix hinter der Themen-Sprachen-Kombination (je ein Feld) brauche. Hinter jeden Feld steckt dann eine Seedlist, auf die der Crawler dann zugreift.
Ich habe noch nie eine Matrix programmiert, könnte das evntl. so ähnlich aussehen:

public class Matrix {
public static String[] sprachen = new String [5];
public static String[] themen = new String [5];
public static String[][] felder = new String [5][5];
public Matrix()
{
sprachen[0]="Deutsch";
sprachen[1]="Englisch";
sprachen[2]="Spanisch";
sprachen[3]="Chinesisch";
sprachen[4]="Russisch";
themen[5]="Sport";
themen[6]="Kosmetik";
themen[7]="Universitäten";
themen[8]="Nachrichten";
themen[9]="Restaurants";
felder[0][5]= "Feld ds"; // Feld mit der Kombination "Deutsch/Sport"
felder[0][6]= "Feld dk";
felder[0][7]= "Feld du";
felder[0][8]= "Feld dn";
felder[0][9]= "Feld dr";
felder[1][5]= "Feld es";
felder[1][6]= "Feld ek";
felder[1][7]= "Feld eu";
felder[1][8]= "Feld en";
felder[1][9]= "Feld er";
felder[2][5]= "Feld ss";
felder[2][6]= "Feld sk";
felder[2][7]= "Feld su";
felder[2][8]= "Feld sn";
felder[2][9]= "Feld sr";
felder[3][5]= "Feld cs";
felder[3][6]= "Feld ck";
felder[3][7]= "Feld cu";
felder[3][8]= "Feld cn";
felder[3][9]= "Feld cr";
felder[4][5]= "Feld rs";
felder[4][6]= "Feld rk";
felder[4][7]= "Feld ru";
felder[4][8]= "Feld rn";
felder[4][9]= "Feld rr";
}
} ```
 
 
Hat jemand Erfahrung mit dieser Thematik?
Vielen Dank im Voraus!

Lg
#2

Static (non-final) Fields sind oft schlecht
Arrays in der API sind meistens schlecht
Public Fields sind immer schlecht
Public static (non-final) arrays sind…

Das sollte ggf. in eine Klasse, wo die konkrete Speicherung versteckt ist. Zuerst müßte man (ich :o ) aber genauer wissen, was du am Ende mit dieser Klasse machen können willst. Also, welche Information soll sie genau anbieten? Soll sie NUR 2D sein, also soll es nur Abfragen zu “Deutsch+Sport” geben, oder vielleicht auch noch zu “Deutsch+Sport+SchönesWetter” (oder so)?

Willst du wirklich mit Indizes darauf zugreifen, oder nicht eher mit den Strings selbst?

So eine Abfrage wie

String element = Matrix.felder[3][1];

ist eben ziemlich … naja. Ich schätze das sowas wie

String element = Matrix.get("Sport", "Deutsch");

eher das ist, was du brauchst (aber das ist geraten, weil nochmal: So ganz hab’ ich noch nicht kapiert, was damit am Ende gemacht werden soll… )

#3

Wie du schon angenommen hast, soll man die Möglichkeit haben Abfragen zu mehreren Sprachen, als auch Themenbereichen machen können. :slight_smile:

#4

Und noch als Ergänzung: Der Benutzer soll am Ende zu seinen ausgewählten Sprachen und Themen jeweils eine oder mehrere Seedlists mit Internetseiten zu dem jeweiligen Feld (z.B. Deutsch-Sport) ausgegeben bekommen. Also müsste jedes einzelne Feld der Matrix mit der entsprechenden Seedlist verbunden werden. Ziel des ganzen ist dann, dass der Crawler, die in der Seedlist vorhandenen Internetseiten (bis zu einer bestimmten Anzahl von Links) durchsucht und lokal abspeichert. Der Benutzer soll dann anhand der gefundenen Seiten sprachliche Phänomene erkennen…nur zum Verständnis, was der ganze Kram eigentlich bezwecken soll!:smiley:

#5

Also sollen auch Abfragen wie
String element = Matrix.get("Sport", "Deutsch", "Ballsport", "Oberbayern");
möglich sein? Das wäre ja dann keine (2D) Matrix mehr… Wenn du von einer “seedlist” redest, gehe ich auch davon aus, dass dort nicht nur EIN String zurückgegeben werden soll, sondern ggf. mehrere? Soll das von der Funktionalität her so ähnlich sein, wie so eine “Tag-Cloud” auf Blog-Seiten, wo man zu jedem Begriff die Liste der passenden Seiten anzeigen kann (hier dann eben mit mehreren Begriffen)?

#6

ja stimmt da hast du schon recht, es sollen internetseiten zu verschiedenen sprachen und themen ausgewählt werden können, nicht nur eine sprache + 1 thema…es sieht von der gui in etwa so aus (ganz grob):

sprache 1 thema 1
sprache 2 thema 2…etc
sprache 3
sprache 4
sprache 5

und man soll halt nicht nur ein thema und eine sprache auswählen können sondern schon zb auch zu einer sprache mehrere themen usw…das erschwert die sache natürlich irgendwie :smiley:

#7

Ja und dort soll eine Liste von Strings zurückgegeben werden?

So langsam klingt das, als wäre das die klassische Datenbank-Abfrage: Gibt mir alle X, die mit Y indiziert sind. Wenn du keine DB verwenden kannst oder willst (davon hab ich jetzt halt auch keine Ahnung), wäre die Methode, die du bräuchtest doch sowas wie

public static List<String> getSeedList(String ... tags)

oder… hab ich das jetzt doch falsch verstanden?

#8

hi marco!
du hast das schon alles richtig verstanden … ich kann leider auch nicht mehr dazu sagen, als wie schon beschrieben
Was bräuchtest du noch um sagen zu können, wie man das programmiert?

Ich muss das bis Montag fertig haben und habe keine Ahnung, was ich machen soll.

Viele Grüße

#9

Wieder ein Kanditat fürs Hausaufgabenforum.

-verschieb-

#10

Ja, in sowas kann man jetzt halt beliebig viel Hirnschmalz und Arbeit investieren… KÖNNTE man… hab ich aber nicht… stattdessen hab’ ich einfach mal schnell was hingeschrieben…

import java.util.*;

class TagSeedTest
{
    public static void main(String args[])
    {
        init();

        System.out.println("Worte zu 'Sport'");
        System.out.println(TagSeed.getAnd("Sport"));

        System.out.println("Worte zu 'Deutschland' UND 'Leben'");
        System.out.println(TagSeed.getAnd("Deutschland", "Leben"));

        System.out.println("Worte zu 'Deutschland' ODER 'Leben'");
        System.out.println(TagSeed.getOr("Deutschland", "Leben"));
    }


    private static void init()
    {
        TagSeed.addTag("Sport",  "Fussball", "Handball");
        TagSeed.addTag("Deutschland",  "Fussball", "Bier");
        TagSeed.addTag("Leben",  "Bier", "Schnitzel");
    }
}



class TagSeed
{
    private static Map<String, Collection<String>> map =
        new HashMap<String, Collection<String>>();


    public static void addTag(String tag, String ... seeds)
    {
        map.put(tag, Arrays.asList(seeds));
    }
    public static void removeTag(String tag, String ... seeds)
    {
        map.remove(tag);
    }

    public static List<String> getOr(String ... tags)
    {
        Set<String> result = new HashSet<String>();
        for (int i=0; i<tags.length; i++)
        {
            String tag = tags**;
            Collection<String> collection = map.get(tag);
            if (collection != null)
            {
                result.addAll(collection);
            }
        }
        return new ArrayList<String>(result);
    }

    public static List<String> getAnd(String ... tags)
    {
        Set<String> result = new HashSet<String>();
        String tag = tags[0];
        Collection<String> collection = map.get(tag);
        result.addAll(collection);
        for (int i=1; i<tags.length; i++)
        {
            tag = tags**;
            collection = map.get(tag);
            if (collection != null)
            {
                result.retainAll(collection);
            }
        }
        return new ArrayList<String>(result);
    }
}