Skip to content

Commit

Permalink
[de] Improve CASE_RULE
Browse files Browse the repository at this point in the history
reduce false positives for "Der Versuch, Neues zu lernen / Gutes zu tun
/ Witziges auszuprobieren" etc.
  • Loading branch information
f-knorr committed Nov 1, 2016
1 parent 021c71f commit b19b931
Showing 1 changed file with 28 additions and 21 deletions.
Expand Up @@ -54,7 +54,10 @@ public class CaseRule extends GermanRule {
// wenn hinter diesen Wörtern ein Verb steht, ist es wohl ein substantiviertes Verb,
// muss also groß geschrieben werden:
private static final Set<String> nounIndicators = new HashSet<>();


private static final String UPPERCASE_MESSAGE = "Außer am Satzanfang werden nur Nomen und Eigennamen großgeschrieben";
private static final String LOWERCASE_MESSAGE = "Falls es sich um ein substantiviertes Verb handelt, wird es großgeschrieben.";

// also see case_rule_exception.txt:
private static final List<List<PatternToken>> ANTI_PATTERNS = Arrays.asList(
Arrays.asList(
Expand Down Expand Up @@ -340,6 +343,7 @@ private static PatternToken posRegex(String posTag) {
"Übrigen", // je nach Kontext groß (TODO), z.B. "im Übrigen"
"Unvorhergesehenes", // je nach Kontext groß (TODO), z.B. "etwas Unvorhergesehenes"
"Verantwortlicher",
"Verlass",
"Verwandter",
"Vielfaches",
"Vorsitzender",
Expand Down Expand Up @@ -471,6 +475,7 @@ private static PatternToken posRegex(String posTag) {
languages.add("Ungarisch");
languages.add("Usbekisch");
languages.add("Vietnamesisch");
languages.add("Walisisch");
languages.add("Weißrussisch");
}

Expand Down Expand Up @@ -694,12 +699,8 @@ private void potentiallyAddLowercaseMatch(List<RuleMatch> ruleMatches, AnalyzedT
// e.g. essen -> Essen
if (Character.isLowerCase(token.charAt(0)) && !substVerbenExceptions.contains(token) && tokenReadings.hasPartialPosTag("VER:INF")
&& !tokenReadings.isIgnoredBySpeller() && !tokenReadings.isImmunized()) {
String msg = "Falls es sich um ein substantiviertes Verb handelt, wird es großgeschrieben.";
RuleMatch ruleMatch = new RuleMatch(this, tokenReadings.getStartPos(), tokenReadings.getEndPos(), msg);
String word = tokenReadings.getToken();
String fixedWord = StringTools.uppercaseFirstChar(word);
ruleMatch.setSuggestedReplacement(fixedWord);
ruleMatches.add(ruleMatch);
String fixedWord = StringTools.uppercaseFirstChar(tokenReadings.getToken());
addRuleMatch(ruleMatches, LOWERCASE_MESSAGE, tokenReadings, fixedWord);
}
}
}
Expand All @@ -723,15 +724,17 @@ private void potentiallyAddUppercaseMatch(List<RuleMatch> ruleMatches, AnalyzedT
!isSpecialCase(i, tokens) &&
!isAdjectiveAsNoun(i, tokens) &&
!isExceptionPhrase(i, tokens)) {
String msg = "Außer am Satzanfang werden nur Nomen und Eigennamen großgeschrieben";
RuleMatch ruleMatch = new RuleMatch(this, tokens[i].getStartPos(), tokens[i].getEndPos(), msg);
String word = tokens[i].getToken();
String fixedWord = Character.toLowerCase(word.charAt(0)) + word.substring(1);
ruleMatch.setSuggestedReplacement(fixedWord);
ruleMatches.add(ruleMatch);
String fixedWord = StringTools.lowercaseFirstChar(tokens[i].getToken());
addRuleMatch(ruleMatches, UPPERCASE_MESSAGE, tokens[i], fixedWord);
}
}

private void addRuleMatch(List<RuleMatch> ruleMatches, String msg, AnalyzedTokenReadings tokenReadings, String fixedWord) {
RuleMatch ruleMatch = new RuleMatch(this, tokenReadings.getStartPos(), tokenReadings.getEndPos(), msg);
ruleMatch.setSuggestedReplacement(fixedWord);
ruleMatches.add(ruleMatch);
}

// e.g. "a) bla bla"
private boolean isNumbering(int i, AnalyzedTokenReadings[] tokens) {
return i >= 2
Expand Down Expand Up @@ -811,23 +814,27 @@ private boolean isSpecialCase(int i, AnalyzedTokenReadings[] tokens) {

private boolean isAdjectiveAsNoun(int i, AnalyzedTokenReadings[] tokens) {
AnalyzedTokenReadings prevToken = i > 0 ? tokens[i-1] : null;
AnalyzedTokenReadings nextReadings = i < tokens.length-1 ? tokens[i+1] : null;

// ignore "Der Versuch, Neues zu lernen / Gutes zu tun / Spannendes auszuprobieren"
boolean isPossiblyFollowedByInfinitve = nextReadings != null && (nextReadings.getToken().equals("zu"));
boolean isFollowedByInfinitve = nextReadings != null && !isPossiblyFollowedByInfinitve && nextReadings.hasPartialPosTag("EIZ");

boolean isUndefQuantifier = prevToken != null && UNDEFINED_QUANTIFIERS.contains(prevToken.getToken().toLowerCase());
boolean isPrevDeterminer = prevToken != null && (prevToken.hasPartialPosTag("ART") || prevToken.hasPartialPosTag("PRP") || prevToken.hasPartialPosTag("ZAL"));
if (!isPrevDeterminer && !isUndefQuantifier) {
if (!isPrevDeterminer && !isUndefQuantifier && !(isPossiblyFollowedByInfinitve || isFollowedByInfinitve)) {
AnalyzedTokenReadings prevPrevToken = i > 1 && prevToken.hasPartialPosTag("ADJ") ? tokens[i-2] : null;
// Another check to avoid false alarms for "ein politischer Revolutionär"
if (prevPrevToken == null || !(prevPrevToken.hasPartialPosTag("ART") || prevPrevToken.hasPartialPosTag("PRP") || prevToken.hasPartialPosTag("ZAL"))) {
return false;
}
}
AnalyzedTokenReadings nextReadings = i < tokens.length-1 ? tokens[i+1] : null;
for (AnalyzedToken reading : tokens[i].getReadings()) {
String posTag = reading.getPOSTag();
// ignore "die Ausgewählten" but not "die Ausgewählten Leute":
if ((posTag == null || posTag.contains("ADJ")) && !hasNounReading(nextReadings)) {
return true;
}

// ignore "die Ausgewählten" but not "die Ausgewählten Leute":
if (tokens[i].hasPartialPosTag("ADJ") && !hasNounReading(nextReadings)) {
return true;
}

return false;
}

Expand Down

0 comments on commit b19b931

Please sign in to comment.