Wie kann ich einem vorhandenen RUTA-Projekt eine benutzerdefinierte Bedingung hinzufügen?Gestartet, aber stecke fest
Frage
Ich möchte eine benutzerdefinierte UIMA RUTA-Regelbedingung hinzufügen.Ich habe ein bestehendes UIMA Ruta-Projekt in Eclipse.Bisher habe ich im selben Projekt eine Quelldatei mit einem einfachen Annotator-Stub erstellt:
package mynamespace.extensions;
[imports]
public class MyNewCondition extends AbstractRutaCondition {
private final String para1;
public MyNewCondition(String para1) {
super();
this.para1 = para1;
}
@Override
public EvaluatedCondition eval(AnnotationFS annotation,
RuleElement element, RutaStream stream, InferenceCrowd crowd) {
// TODO Auto-generated method stub
if (para1 == "hfoo")
return new EvaluatedCondition(this, true);
else
return new EvaluatedCondition(this, false);
}
public String getPara() {
return para1;
}
}
Die Datei wird zum Ziel / classes / kompiliert...ordner, aber wenn ich ein RUTA-Skript erstelle:
DECLARE Test;
SW{MyNewCondition("foo") -> MARK(Test)};
...Eclipse sagt mir, dass "MyNewCondition" nicht definiert ist und wenn ich es starte, bekomme ich:"Fehler in Zeile 40, "(":keine brauchbare Alternative gefunden" auf der Konsole.Ich nehme an, ich muss noch etwas importieren, weiß aber nicht wie.Ich habe versucht, mit dem Erweiterungsbeispielprojekt im Github-Repository zu arbeiten, weiß aber nicht, wo ich dort anfangen soll, da die Skriptdatei keine weiteren Importe enthält, die zugehörigen XML-Deskriptordateien jedoch.Aber da diese automatisch generiert werden, weiß ich nicht, ob ich das ändern soll oder ob es etwas anderes ist.
Ich habe auch versucht, denselben neuen Bedingungstyp aus einem zweiten Projekt über die Build-Path-Optionen von Eclipse zu importieren, aber auch dort kein Glück.
Kann mir jemand helfen?Danke.
Lösung
Sie benötigen mindestens drei Klassen, um eine neue Bedingung hinzuzufügen, die auch in der UIMA Ruta Workbench aufgelöst wird:
- Eine Umsetzung der Bedingung, wie Sie es in Ihrer Frage getan haben
- Eine Implementierung von IRutaConditionExtension, die die Bedingungsimplementierung für die Engine bereitstellt
- Eine Implementierung von IIDEConditionExtension, die die Bedingung für die UIMA Ruta Workench bereitstellt
Die Bedingung selbst enthält nur die Funktionalität, die der Sprache hinzugefügt werden soll.Die Analyse-Engine weiß natürlich nichts über externe Implementierungen, die zu einer seltsamen Analyseausnahme wie "(" nicht gefunden.Das sollte manchmal verbessert werden.Die Analyse-Engine stellt einen Konfigurationsparameter bereit additionalExtensions
das listet alle bekannten Erweiterungen der Sprache auf.Wenn Sie die UIMA Ruta-Workbench nicht verwenden, müssen Sie diesem Parameter Ihre Implementierung von IRutaConditionExtension hinzufügen.Die Implementierung von IIDEConditionExtension stellt die notwendige Funktionalität für die UIMA Ruta Workbench bereit, nämlich die Syntaxprüfung, Syntaxhervorhebung usw.Darüber hinaus ermöglicht es der Workbench, korrekte Deskriptoren zu generieren.Es fügt dem jeweiligen Parameter Ihre Implementierung von IRutaConditionExtension hinzu.Diese Erweiterung der Workbench muss natürlich in einem Eclipse-Plugin implementiert sein, das in Ihrer UIMA Ruta Workbench Eclipse-Instanz installiert ist, um in der Workbench verfügbar zu sein.Es gibt einen Erweiterungspunkt, den Sie erweitern müssen, der sowohl Ihre Implementierung von IRutaConditionExtension als auch von IIDEConditionExtension kennt.
Es gibt ein beispielhaftes Projekt, das die Implementierung aller möglichen Sprachelemente vorsieht.Dieses Projekt enthält die Implementierungen für die Analyse-Engine und auch die Implementierung für die UIMA Ruta Workbench und ist daher ein Eclipse-Plugin (beachten Sie die POM-Datei).
Bezüglich der ExampleCondition Bedingungserweiterung gibt es drei wichtige Punkte / Klassen:
ExampleCondition.java
stellt die Implementierung der neuen Bedingung bereit, die Termine auswertetExampleConditionExtension.java
stellt die Erweiterung für die Analyse-Engine bereit.Es kennt den Namen der Bedingung, ihre Implementierung, kann neue Instanzen dieser Bedingung erstellen und ist in der Lage, die Bedingung für die Erklärungskomponenten zu verbalisieren.ExampleConditionIDEExtension
stellt die Syntaxprüfung für den Editor und das Schlüsselwort für die Syntaxfärbung bereit.plugin.xml
definiert die Erweiterung für die Workbench:<extension point="org.apache.uima.ruta.ide.conditionExtension"> <condition class="org.apache.uima.ruta.example.extensions.ExampleConditionIDEExtension" engine="org.apache.uima.ruta.example.extensions.ExampleConditionExtension"> </condition> </extension>
Wenn Sie die UIMA Ruta Workbench nicht verwenden oder nur die Regeln in UIMA Pipelines anwenden möchten, benötigen Sie nur ExampleCondition
und ExampleConditionExtension
, und Sie müssen hinzufügen org.apache.uima.ruta.example.extensions.ExampleConditionExtension
zu den additionalExtensions
parameter Ihrer UIMA Ruta-Analyse-Engine (Deskriptor).
Das Hinzufügen neuer Bedingungen mithilfe von Java-Projekten im selben Arbeitsbereich wurde noch nicht getestet, aber zumindest die Workbench-Unterstützung fehlt aufgrund der Einbeziehung von Erweiterungen, die den Erweiterungspunktmechanismus von Eclipse verwenden.