Funktion vorhanden - wie auf Transitivität erweitern?

Status
Nicht offen für weitere Antworten.
P

Pida

Gast
Hallo zusammen,

ich stehe vor einem größeren Performance-Problem: In einer Datenbank habe ich etwa 38 000 Wörter, die zueinander in unterschiedlichen Verhältnissen stehen können. Es gibt die Relation Teil/ Ganzes und die Relation Ober-/ Unterbegriff.

Beispiel:
- Ein Rad ist Teil eines Fahrrads.
- Fahrrad ist ein Unterbegriff von Fahrzeug.

Um diese Daten nutzen zu können, verwende ich eine vorgegebene API (leider sind API und Datenbank nicht frei verfügbar). Dort gibt es bereits die Funktionen

Code:
getTeile() // liefert eine Liste mit 'Teilen'
getGanze() // ... mit 'Ganzen'
getOberbegriffe() // ... mit Oberbegriffen
getUnterbegriffe() // ... mit Unterbegriffen

Nun muss ich in meinem Programm häufiger testen, ob Wort A in einer Relation zu Wort B steht. Dazu schaue ich nach, ob beispielsweise B im Array A.getTeile() enthalten ist.

Mein Problem: Die oben angegebenen Funktionen der API sind nicht transitiv. Ich möchte aber beispielsweise auch die Relation von Reifen zu Rad zu Auto finden. Idealerweise hätten die Funktionen ein Parameter für die Kantenzahl, aber das ist leider nicht der Fall.

Momentan mache ich in etwa Folgendes (Pseudocode!). Hier wird true zurückgegeben, da Heimtier quasi ein indirekter Oberbegriff von Dackel ist:
Code:
LISTE eineHoeher = Dackel.getOberbegriffe(); // Hund, ... (die Listen enthalten oft nur ein Element)
LISTE EineOderZweiHoeher;

for each (candidate in eineHoeher) {
    EineOderZweiHoeher.addAll(candidate.getOberbegriffe())  // Heimtier, ...
    EineOderZweiHoeher.addAll(eineHoeher);  // Hund, Heimtier, ...
}

if (eineOderZweiHoeher ENTHÄLT 'Heimtier') return true;

Das ist wohl sehr ineffektiv, denn es verlängert die Laufzeit einer Testanwendung auf 150 Sekunden. Demgegenüber läuft das Programm in etwa 3 Sekunden durch, wenn ich lediglich direkte Relationen suche.

Könnt ihr mir sagen, wie ich das Ganze optimieren kann?

Vielen Dank
Pida
 

Marco13

Top Contributor
Ohne eine genaue API-Beschreibung, Doku oder Quellcode kann man da nur raten. Aber das mach ich dann mal :D :

Code:
LISTE eineHoeher = Dackel.getOberbegriffe(); // Hund, ... (die Listen enthalten oft nur ein Element)
LISTE EineOderZweiHoeher;

for each (candidate in eineHoeher) {
    EineOderZweiHoeher.addAll(candidate.getOberbegriffe())  // Heimtier, ...
    EineOderZweiHoeher.addAll(eineHoeher);  // Hund, Heimtier, ...
}

if (eineOderZweiHoeher ENTHÄLT 'Heimtier') return true;

Falls das kein Tippfehler war, wird da ja für jedes Element in 'eineHoeher' nochmal die komplette 'eineHoeher'-Liste zur EineOderZweiHoeher hinzugefügt. Es wäre also so auf jeden fall schonmal besser:

Code:
LISTE eineHoeher = Dackel.getOberbegriffe(); // Hund, ... (die Listen enthalten oft nur ein Element)
LISTE EineOderZweiHoeher;
EineOderZweiHoeher.addAll(eineHoeher);

for each (candidate in eineHoeher) {
    EineOderZweiHoeher.addAll(candidate.getOberbegriffe())  // Heimtier, ...
}

if (eineOderZweiHoeher ENTHÄLT 'Heimtier') return true;

Außerdem könnte man ein "early return" machen, so dann man nicht immer ALLE Listen zusammenfasst, sondern raushüpft, sobald man fertig ist

Code:
LISTE eineHoeher = Dackel.getOberbegriffe(); // Hund, ... (die Listen enthalten oft nur ein Element)

if (eineHoeher ENTHÄLT 'Heimtier') return true;	

LISTE EineOderZweiHoeher;
EineOderZweiHoeher.addAll(eineHoeher);

for each (candidate in eineHoeher) {
    EineOderZweiHoeher.addAll(candidate.getOberbegriffe())  // Heimtier, ...
}

if (eineOderZweiHoeher ENTHÄLT 'Heimtier') return true;

Dann wäre noch interessant, wofür "LISTE" genau steht. Nur eine Collection? Eine List? Ein Set vielleicht? (Bei einer List ist die Laufzeit für den Enthaltenseins-Test O(n), bei einem Set nur O(1)!!!)


In jedem Fall solltest du aber überlegen, ob du diese Listen überhaupt brauchst! Wenn es NUR darum geht (ein mal) abzufragen, ob diese Relation besteht, dann könntest du ja einfach suchen (quasi eine Breitensuche). Ich mache jetzt mal die "minimale" Annahme, dass die LISTE eine Collection ist
Code:
boolean inRelationUp(Object rootObject, Object toSearchInUpperObjects, int depth)
{
    return inRelationUp(rootObject.getOberbegriffe(), toSearchInUpperObjects, depth);
}

boolean inRelationUp(Collection collection, Object toSearchInUpperObjects, int depth)
{
    if (collection.contains(toSearchInUpperObjects)) return true;
    if (depth > 1)
    {
        for (Object root : collection)
        {
            if (inRelationUp(root, toSearchInUpperObjects, depth-1))
            {
                return true;
            }
        }
    }
    return false;
}

// Aufruf:
inRelationUp("Dackel", "Heimtier", 2); // Liefert true
inRelationUp("Dackel", "Hund", 1); // Liefert true
inRelationUp("Dackel", "Heimtier", 1); // Liefert false
Das ist ungetestet, aber vom Prinzip her müßt's passen. Ggf. gibt's das gleiche dann eben für "inRelationDown".
 
P

Pida

Gast
Hallo Marco,

das werde ich mir morgen mal genauer anschauen. Vielen Dank.

Mehr Infos zur API habe ich leider nicht. Die liegt mir als jar vor; ich weiß nicht, wie ich da an den Quelltext komme.
Bei Bedarf werde ich weitere Infos zu meinem bisherigen Ansatz nachliefern, leider habe ich da eben noch nichts 'Fertiges'.

Viele Grüße
Pida
 
P

Pida

Gast
So, da bin ich doch nochmal.

@Marco: Ich denke, dein Ansatz wird mir helfen.
@Tobias: Ja, es gibt ein Javadoc. Da steht aber leider nur drin, dass z.B. einWort.getOberbegriffe() ein Array mit Oberbegriffen zurückgibt, mehr nicht.


Ich habe leider noch ein weiteres - und vielleicht zentraleres - Problem.

Die API liefert mir die Möglichkeit, z.B. Oberbegriffe für ein Wort zu finden. Der Objekttyp Wort ist Teil der API. Ich selbst arbeite aber mit dem selbst erstellten Objekttyp Eintrag, der eben unter anderem genau ein Wort enthält. Meinen eigenen Ansatz (den hatte ich vereinfacht) und Marcos Tipps habe ich nun versucht, als Methoden für Eintrag zu implementieren.

Das bringt aber Probleme mit sich: Es gibt nicht für jedes Wort einen Eintrag. Ich suche also nach Oberbegriffen für einen Eintrag und erhalte eine Liste von Wörtern. Jetzt will ich wieder für jedes davon nach Oberbegriffen suchen, aber das geht nicht - denn die Methode will ja von einem Eintrag-Objekt angefordert werden.

Für mich wäre die offensichtliche Lösung, meine Methoden in der Klasse Wort zu implementieren. Aber wie beschrieben ist die Bestandteil eines jar-Files...

Was macht man in einem solchen Fall? Kann ich an die Klasse im jar rankommen? Oder muss ich eine Klasse schreiben, die Wort erweitert (nicht, dass ich das mit meinem aktuellen Kenntnisstand könnte ;-)?

Vielen Dank
Pida
 
P

Pida

Gast
So, ich habe es nun mit Vererbung versucht.

Ich habe die Klasse Wort und möchte die um ein paar Funktionen erweitern. Also habe ich Folgendes probiert:

Code:
public class Wort extends Wort {
   // erstmal gar nichts, später meine Zusatzfunktionen
}

Das klappt nicht, da Klassen sich nicht selbst erweitern können.


Code:
public Class ExtWort extends Wort {
   // erstmal gar nichts, später meine Zusatzfunktionen
}

Das wird nicht akzeptiert, wenn auf der rechten Seite des Zuweisungsoperators ein Wort steht. Leider ist genau dies in meinem Programm immer der Fall:
Code:
// FEHLER:
// ExtSynset cannot be resolved tom a type
// Type mismatch: Cannot convert from Wort to ExtWort
ExtWort thisWort = getLink(j).getWort();

Was muss ich tun?

Vielen Dank
Pida
 

Marco13

Top Contributor
Hm. Warum du die Methoden jetzt konkret für "Eintrag" implementiert hast, weiß ich nicht - ich weiß ja nichtmal was ein "Eintrag" ist (d.h. was für Fields/Methoden noch dazukommen, wenn du von "Wort" erbst)

Aber eigentlich sollte die Methode an sich ja auch auf "reinen" Worten (d.h. Wörtern :wink: ) arbeiten können. (Sie ist ja eigentlich eine Art Utility-Funktion, die statisch sein könnte, und dann ist "egal", in welcher Klasse sie liegt)

Code:
class Eintrag 
{
    private Wort wort;
    ...

    // Können beide static sein und auf "Wort"-Objekten arbeiten...
    public static boolean inRelationUp(Wort rootWort, Wort toSearchFor, int depth) { ... }
    public static boolean inRelationUp(Collection<Wort> coll, Wort toSearchFor, int depth) { ... }

}

Aufrufen kann man sie dann entweder von außen
Code:
Eintrag eintrag = ...
Wort wort = ...
boolean inRelation = Eintrag.inRelationUp(eintrag.getWort(), wort, 3);
oder innerhalb von "Eintrag", wenn das bequemer oder schöner ist
Code:
class Eintrag 
{
    ...
    public boolean inRelationUp(Wort toSearchFor, int depth)
    {
        return Eintrag.inRelationUp(this.wort, toSearchFor, depth);
    }

    // Können beide static sein und auf "Wort"-Objekten arbeiten...
    public static boolean inRelationUp(Wort rootWort, Wort toSearchFor, int depth) { ... }
    public static boolean inRelationUp(Collection<Wort> coll, Wort toSearchFor, int depth) { ... }

}

// Verwendung
boolean inRelation = eintrag.inRelationUp(wort, 3);
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Alex_99 Programm stürzt beim Aufruf der Funktion ab? Text ausgeben Allgemeine Java-Themen 45
_user_q Was brauche ich, um eine eigene "Search for updates"-Funktion einzubauen? Allgemeine Java-Themen 1
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
S Validation Annotation Funktionsparameter vs Funktion vs Attribut Allgemeine Java-Themen 0
R Variablen String mit split-Funktion aufteilen Allgemeine Java-Themen 7
A Serialize - Add Funktion Allgemeine Java-Themen 1
B Discord Bot - Funktion wird nicht aufgerufen Allgemeine Java-Themen 1
A Variablen Funktion übergibt den Wert nicht Allgemeine Java-Themen 13
J Überschriebene Funktion soll nicht die super Funktion aufrufen Allgemeine Java-Themen 4
Aruetiise Funktion(y = mx+n) in String speichern und berechnen Allgemeine Java-Themen 9
B Hilfe!! spiel um Funktion des Selektierens erweitern (mit ASCII-Tabelle) Allgemeine Java-Themen 3
MiMa ArrayList Rückgabewerte aus einer Funktion Allgemeine Java-Themen 15
B Gibt es eine Funktion die den Datentyp einer Variablen ermittelt? Allgemeine Java-Themen 8
A Plot funktion applet Allgemeine Java-Themen 4
S Methoden "Unschöne" Break-Anweisung aus verschachtelter Funktion entfernen Allgemeine Java-Themen 11
R Rückgabe eines Arrays durch Funktion Allgemeine Java-Themen 9
T Best Practice MD5 Funktion Allgemeine Java-Themen 9
perlenfischer1984 Testng : Funktion mit mehreren Parametern testen Allgemeine Java-Themen 5
L Stack overflow bei einer endrekursiven Funktion (Anwendung: Spezialform des Package Merge) Allgemeine Java-Themen 4
C Klassen Problem mit Funktion einer Generischen Klasse die ein Interface implementiert Allgemeine Java-Themen 0
O JNA Zugriff auf Funktion aus DLL Allgemeine Java-Themen 0
Lord.Djerun (Taschenrechner) jButtons mit gleicher Funktion zusammenfassen Allgemeine Java-Themen 6
I Javafx Open/Read und Tree Funktion Allgemeine Java-Themen 14
C Generic-Funktion nur bei bestimmten Typen erlauben Allgemeine Java-Themen 6
F Classpath als Argument in Funktion übergeben Allgemeine Java-Themen 3
H SHA256 update-Funktion Allgemeine Java-Themen 3
J Methoden Abgeänderte Fibonacci Funktion Allgemeine Java-Themen 2
G Polymorphie Funktion als Parameter Allgemeine Java-Themen 8
F Funktion nur in einem Zeitraum Allgemeine Java-Themen 5
H java.util.Timer und Funktion mit SQL Exception Allgemeine Java-Themen 5
M Anzahl der Durchläufe einer Funktion errechnen Allgemeine Java-Themen 6
J Autofill Funktion Uhrzeit Allgemeine Java-Themen 19
G Timeout funktion zu einer Eventlogabfrage Allgemeine Java-Themen 2
M Funktion gesucht: Text vektorisieren Allgemeine Java-Themen 20
K Warum wartet diese Funktion auf beenden des Threads? Allgemeine Java-Themen 3
N JNI Callback Funktion Allgemeine Java-Themen 8
D Problem bei der Darstellung einer trigonometrischen Funktion Allgemeine Java-Themen 2
E Funktion sperren bis Unterfunktionen ferig sind Allgemeine Java-Themen 3
D Referenz einer Funktion aus einer anonymen Klasse? Allgemeine Java-Themen 3
J Funktion zu einer Uhrzeit/datum ausführen Allgemeine Java-Themen 4
S eigene Update Funktion Allgemeine Java-Themen 5
Ark Name für Funktion gesucht Allgemeine Java-Themen 5
Screen Eine mathematische Funktion als Argument für eine Methode - Matheparser? Allgemeine Java-Themen 21
Daniel_L Bug in Copy-Funktion bei HTML-Editorpane? Allgemeine Java-Themen 4
multiholle Aufrufer einer Funktion ermitteln Allgemeine Java-Themen 13
W JMF- Player.getDuration() Funktion spinnt Allgemeine Java-Themen 2
C JTextComponent - mit Schlagwörter Funktion aufrufen Allgemeine Java-Themen 2
SuperSeppel13 php-funktion aufrufen Allgemeine Java-Themen 5
M get Funktion von Vector Allgemeine Java-Themen 4
V Wie Enum an Funktion "übergeben" ? Allgemeine Java-Themen 4
G Webserver Funktion Allgemeine Java-Themen 3
S Random funktion in einer Grafischen Oberfläche Allgemeine Java-Themen 10
C Funktion stoppt alles Allgemeine Java-Themen 7
G Funktion aus array aufrufen Allgemeine Java-Themen 16
N Funktion als Parameter einer anderen Funktion Allgemeine Java-Themen 5
lumo Row Header ist public, zeigt die funktion aber nicht public Allgemeine Java-Themen 8
P Unterschied zwischen Funktion und Methoden Allgemeine Java-Themen 3
B E-Funktion mit Java Allgemeine Java-Themen 9
S verstehe diese Funktion nicht Allgemeine Java-Themen 6
S Referenz auf Funktion? Allgemeine Java-Themen 16
K Funktion unabhängig vom Namen aufrufen Allgemeine Java-Themen 5
F Vorteile -> Funktion Allgemeine Java-Themen 2
P gegenstück zur php funktion gzinflate()? Allgemeine Java-Themen 3
D Problem bei Aufruf einer Funktion Allgemeine Java-Themen 3
J Welche Daten für Ative-X Funktion? Allgemeine Java-Themen 5
X Replay Funktion realisieren? Allgemeine Java-Themen 5
J Funktion alle Möglichkeiten berücksichtigen Allgemeine Java-Themen 5
P DLL Funktion benutzen Allgemeine Java-Themen 3
S Fortran Funktion mit JNI aufrufen: java.lang.UnsatisfiedLink Allgemeine Java-Themen 2
T Pipe-Funktion - Prozente falsch? Allgemeine Java-Themen 8
A undo funktion in Malprogramm Allgemeine Java-Themen 15
J Method.invoke -> Exceptions der Funktion abfangen Allgemeine Java-Themen 5
M Frage zu resume funktion bei downloadmanager Allgemeine Java-Themen 7
M Funktion liest nach Textaus aus der vorigen Zeile Allgemeine Java-Themen 2
G nichtabstrakte Funktion zu einer Interface hinzufügen Allgemeine Java-Themen 6
M Funktion des JRE Allgemeine Java-Themen 8
B Nach Deserialisieren: Elemente des JFrames ohne Funktion Allgemeine Java-Themen 5
A funktion schiffeZeichnen zwei mal aufrufen Allgemeine Java-Themen 16
P Suche String Tutorial zu Suche&Ersetze Funktion von text Allgemeine Java-Themen 35
D Mathematische Funktion grafisch in Java darstellen Allgemeine Java-Themen 2
7 Gibts in Java ne Funktion, die ein ganzes Array ausgibt Allgemeine Java-Themen 11
L sin cos funktion Allgemeine Java-Themen 5
L return-Funktion Allgemeine Java-Themen 5
L return Funktion Allgemeine Java-Themen 6
M Funktion als Parameter oder andere Möglichkeit Allgemeine Java-Themen 3
H Funktion aus einer anderen Klasse ausführen Allgemeine Java-Themen 3
TRunKX Gibt es ne fertige Java Funktion die Dateien vergleicht? Allgemeine Java-Themen 4
M Funktion wird nicht durchlaufen. Allgemeine Java-Themen 13
G Bilder zeichnen und Zoom Funktion Allgemeine Java-Themen 2
G java funktion in JSP file aufrufen. Allgemeine Java-Themen 2
K funktion aus einem String aufrufen Allgemeine Java-Themen 9
L C# Funktion in Java aufrufen Allgemeine Java-Themen 4
thE_29 Funktion mit Funktionaufrufen Allgemeine Java-Themen 4
G Funktion, die langsam wächst Allgemeine Java-Themen 7
Blender3D Alte Beiträge nicht mehr vorhanden Allgemeine Java-Themen 6
M SSLHandshakeException obwohl Cert im Truststore vorhanden Allgemeine Java-Themen 2
F Eclipse cache vorhanden? Allgemeine Java-Themen 5
F Cardlayout prüfen ob schon vorhanden, keine doppelten Allgemeine Java-Themen 3
U mit HTMLunit auf Website einloggen - Formname nicht vorhanden Allgemeine Java-Themen 5
R Windows ermitteln ob Administratorrechte vorhanden Allgemeine Java-Themen 17

Ähnliche Java Themen

Neue Themen


Oben