in languagetool-language-modules/de/src/main/java/org/languagetool/rules/de/CaseRule.java [1114:1149]
private boolean isNominalization(int i, AnalyzedTokenReadings[] tokens, String token, AnalyzedTokenReadings lowercaseReadings) {
AnalyzedTokenReadings nextReadings = i < tokens.length-1 ? tokens[i+1] : null;
// TODO: "vor Schlimmerem", "Er hatte Schlimmes zu befürchten"
// TODO: wir finden den Fehler in "Die moderne Wissenschaftlich" nicht, weil nicht alle
// Substantivierungen in den Morphy-Daten stehen (z.B. "Größte" fehlt) und wir deshalb nur
// eine Abfrage machen, ob der erste Buchstabe groß ist.
if (StringTools.startsWithUppercase(token) && !isNumber(token) && !(hasNounReading(nextReadings) ||
(nextReadings != null && StringUtils.isNumeric(nextReadings.getToken()))) && !token.matches("Alle[nm]")) {
if (lowercaseReadings != null && lowercaseReadings.hasPosTag("PRP:LOK+TMP+CAU:DAT+AKK")) {
return false;
}
// Ignore "das Dümmste, was je..." but not "das Dümmste Kind"
AnalyzedTokenReadings prevToken = i > 0 ? tokens[i-1] : null;
AnalyzedTokenReadings prevPrevToken = i >= 2 ? tokens[i-2] : null;
AnalyzedTokenReadings prevPrevPrevToken = i >= 3 ? tokens[i-3] : null;
String prevTokenStr = prevToken != null ? prevToken.getToken() : "";
if (StringUtils.equalsAny(prevTokenStr, "und", "oder", "beziehungsweise") && prevPrevToken != null &&
(tokens[i].hasPartialPosTag("SUB") && tokens[i].hasPartialPosTag(":ADJ")) || //"das dabei Erlernte und Erlebte ist ..." -> 'Erlebte' is correct here
(prevPrevToken.hasPartialPosTag("SUB") && !hasNounReading(nextReadings) && // "die Ausgaben für Umweltschutz und Soziales"
lowercaseReadings != null && lowercaseReadings.hasPartialPosTag("ADJ") && !prevTokenStr.equals(","))) {
return true;
}
if (lowercaseReadings != null && lowercaseReadings.hasPosTag("PA1:PRD:GRU:VER")) {
// "aus sechs Überwiegend muslimischen Ländern"
return false;
}
return ((prevToken != null && IRGEND_ETC.matcher(prevTokenStr).matches() && tokens[i].hasPartialPosTag("SUB"))
|| isNumber(prevTokenStr)) ||
(hasPartialTag(prevToken, "ART", "PRO:") && !(((i < 4 && tokens.length > 4) || prevToken.getReadings().size() == 1 || prevPrevToken.hasLemma("sein")) && prevToken.hasPosTagStartingWith("PRO:PER:NOM:")) && !prevToken.hasPartialPosTag(":STD")) || // "die Verurteilten", "etwas Verrücktes", "ihr Bestes"
(hasPartialTag(prevPrevPrevToken, "ART") && hasPartialTag(prevPrevToken, "PRP") && hasPartialTag(prevToken, "SUB")) || // "die zum Tode Verurteilten"
(hasPartialTag(prevPrevToken, "PRO:", "PRP") && hasPartialTag(prevToken, "ADJ", "ADV", "PA2", "PA1")) || // "etwas schön Verrücktes", "mit aufgewühltem Innerem"
(hasPartialTag(prevPrevPrevToken, "PRO:", "PRP") && hasPartialTag(prevPrevToken, "ADJ", "ADV") && hasPartialTag(prevToken, "ADJ", "ADV", "PA2")) || // "etwas ganz schön Verrücktes"
(tokens[i].hasPosTagStartingWith("SUB:") && hasPartialTag(prevToken, "GEN") && !hasPartialTag(nextReadings, "PKT")); // "Parks Vertraute Choi Soon Sil ist zu drei Jahren Haft verurteilt worden."
}
return false;
}