Login
Newsletter
Werbung

Do, 13. Dezember 2012, 15:00

LanguageTool-Tutorial Teil III: Java-Regeln und falsche Freunde

Von gulp21

Die match-Funktion ist das Herz der Regel. Der Funktion wird immer ein Satz übergeben, der dann von der Regel auf Fehler untersucht wird.

final List<RuleMatch> ruleMatches = new ArrayList<RuleMatch>();
final AnalyzedTokenReadings[] tokens = text.getTokens();

Am Anfang der Funktion wird eine leere Liste ruleMatches erstellt, in der die Regel später die gefunden Fehler speichert. Desweiteren werden die Tokens des übergebenen Textes in ein Array geladen, um einfach auf die einzelnen Tokens des Satzes zugreifen zu können.

boolean foundSpiegelt = false;
boolean foundWieder = false;
boolean foundWider = false;
for (int i=0; i<tokens.length; i++) {
  final String token = tokens[i].getToken();
  if (token.trim().equals("")) {
    // ignore

In einer for-Schleife werden dann alle Tokens des Satzes durchgegangen. Der Token wird als erstes in einen normalen String umgewandelt. Falls der Token leer ist, wird er ignoriert.

  } else {
    if (token.equalsIgnoreCase("spiegelt") ||
        token.equalsIgnoreCase("spiegeln") ||
        token.equalsIgnoreCase("spiegelte") ||
        token.equalsIgnoreCase("spiegelten") ||
        token.equalsIgnoreCase("spiegelst")) {
      foundSpiegelt = true;
    } else if (token.equalsIgnoreCase("wieder") && foundSpiegelt) {
      foundWieder = true;
    } else if (token.equalsIgnoreCase("wider") && foundSpiegelt) {
      foundWider = true;
    }

Sobald eine Form von »spiegeln« gefunden wird, wird die boolesche Variable foundSpiegelt auf true gesetzt.

Wenn ein »wieder« oder »wider« gefunden wird, nachdem bereits eine Form von »spiegeln« gefunden worden ist, nimmt die Variable foundWieder bzw. foundWider den Wert true an.

if (foundSpiegelt && foundWieder && !foundWider &&
    !(tokens.length > i + 2 && (tokens[i + 1].getToken().equals("wider") || tokens[i + 2].getToken().equals("wider")) )
   ) {
  final String msg = "'wider' in 'widerspiegeln' wird mit 'i' statt mit 'ie' " +
          "geschrieben, z.B. 'Das spiegelt die Situation gut wider.'";
  final int pos = tokens[i].getStartPos();
  final RuleMatch ruleMatch = new RuleMatch(this, pos, pos + token.length(), msg);
  ruleMatch.setSuggestedReplacement("wider");
  ruleMatches.add(ruleMatch);
  foundSpiegelt = false;
  foundWieder = false;
  foundWider = false;
}

Sobald eine Form von »spiegeln« und »wieder«, aber nicht »wider« gefunden wurde, wird eine Fehlermeldung (ruleMatch) generiert. Für diese wird zunächst der Meldungstext (msg) generiert. Anschließend wird die Position des aktuellen Tokens (dies ist nach den Bedingungen das Wort »wieder«) mit der Methode getStartPos ausgelesen.

Dann wird ein neues ruleMatch-Objekt erstellt, dem die Regel (this), die Startposition des Fehlers, die Endposition (Startpostion + Länge des aktuellen Tokens) und die Nachricht übergeben werden; als fünfter Parameter könnte noch zusätzlich eine kürzere Meldung für das Kontextmenü in LibreOffice angegeben werden.

Danach wird mit setSuggestedReplacement der Korrekturvorschlag gesetzt; alternativ kann auch wie in XML-Regeln im Meldungstext mit <suggestion> gearbeitet werden. ruleMatch wird danach in die Liste aller gefundenen Fehler (ruleMatches) eingefügt. Zuletzt werden alle Variablen auf false zurückgesetzt.

    }
  }
  return toRuleMatchArray(ruleMatches);
}

Die match-Funktion gibt am Ende die ruleMatches-Liste zurück.

  @Override
  public void reset() {
    // nothing
  }
}

Am Ende der Klasse ist eine reset-Funktion, die aufgerufen wird, wenn ein neuer Text geprüft wird. In dieser Funktion könnten z.B. Klassenvariablen zurückgesetzt werden, die dazu verwendet werden, den Zustand der Regel für die Prüfung von mehreren Sätzen zu speichern. Da diese Regel nicht satzübergreifend arbeitet, ist die Funktion leer.

Alle Java-Regeln für die deutsche Prüfung sind am Ende der Datei German.java unter src/main/java/org/languagetool/language aufgeführt.

Um geänderte und neue Java-Regeln zu testen, muss LanguageTool neu kompiliert werden.

Dies geschieht zur Zeit (Stand: November 2012) einfach, indem im Verzeichnis languagetool, in welchem sich die Datei build.xml befindet, ant ausgeführt wird. Das Ergebnis befindet sich dann im Unterverzeichnis dist.

Kommentare (Insgesamt: 0 )
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung