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
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:
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
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