diff --git a/languagetool-language-modules/de/src/main/java/org/languagetool/rules/de/GermanSpellerRule.java b/languagetool-language-modules/de/src/main/java/org/languagetool/rules/de/GermanSpellerRule.java index 788a47be45e4..1f51bed3a704 100644 --- a/languagetool-language-modules/de/src/main/java/org/languagetool/rules/de/GermanSpellerRule.java +++ b/languagetool-language-modules/de/src/main/java/org/languagetool/rules/de/GermanSpellerRule.java @@ -2289,8 +2289,7 @@ protected boolean ignorePotentiallyMisspelledWord(String word) throws IOExceptio !part1.equals("Lass") && // e.g. "Lasstest" - couldn't find a more generic solution yet (wordsWithoutInfixS.contains(part1) || (compoundPatternSpecialEnding.matcher(part1).matches() && isNoun(part2uc))) && !isMisspelled(part1) && - !isMisspelled(part2uc) && - isMisspelled(part2) // don't accept e.g. "Azubikommt" + isNoun(part2uc) // don't accept e.g. "Azubikommt" ) { System.out.println("compound: " + part1 + " " + part2 + " (" + word + ")"); return true; @@ -2298,6 +2297,10 @@ protected boolean ignorePotentiallyMisspelledWord(String word) throws IOExceptio return false; } + private boolean isAdjective(String word) throws IOException { + return getTagger().tag(singletonList(word)).stream().anyMatch(k -> k.hasPosTagStartingWith("ADJ:")); + } + private boolean isNoun(String word) throws IOException { return getTagger().tag(singletonList(word)).stream().anyMatch(k -> k.hasPosTagStartingWith("SUB:")); } @@ -2781,7 +2784,9 @@ private boolean ignoreCompoundWithIgnoredWord(String word) throws IOException { isUppercaseNoun = isNoun(uppercaseFirstChar(partialWord)); } boolean isDirection = DIRECTION.matcher(ignoredWord).matches(); - boolean isCandidateForNonHyphenatedCompound = (isDirection || isNoun || isUppercaseNoun) && !StringUtils.isAllUpperCase(ignoredWord) && (StringUtils.isAllLowerCase(partialWord) || ignoredWord.endsWith("-")); + boolean isAdjective = isAdjective(ignoredWord); + boolean isDirectionalAdjective = (isDirection && (isAdjective || partialWord.matches(".+ische?[mnrs]?"))); + boolean isCandidateForNonHyphenatedCompound = (isDirectionalAdjective || isNoun || isUppercaseNoun) && !StringUtils.isAllUpperCase(ignoredWord) && (StringUtils.isAllLowerCase(partialWord) || ignoredWord.endsWith("-")); boolean needFugenS = isNeedingFugenS(ignoredWord); if (isCandidateForNonHyphenatedCompound && !needFugenS && partialWord.length() > 2) { return hunspell.spell(partialWord) || hunspell.spell(StringUtils.capitalize(partialWord)); diff --git a/languagetool-language-modules/de/src/main/resources/org/languagetool/resource/de/added.txt b/languagetool-language-modules/de/src/main/resources/org/languagetool/resource/de/added.txt index aa3ae31d91fd..b44556b28bdf 100644 --- a/languagetool-language-modules/de/src/main/resources/org/languagetool/resource/de/added.txt +++ b/languagetool-language-modules/de/src/main/resources/org/languagetool/resource/de/added.txt @@ -40010,6 +40010,79 @@ suspensives suspensiv ADJ:AKK:SIN:NEU:GRU:IND suspensives suspensiv ADJ:AKK:SIN:NEU:GRU:SOL suspensives suspensiv ADJ:NOM:SIN:NEU:GRU:IND suspensives suspensiv ADJ:NOM:SIN:NEU:GRU:SOL +estnisch estnisch ADJ:PRD:GRU +estnische estnisch ADJ:AKK:PLU:FEM:GRU:SOL +estnische estnisch ADJ:AKK:PLU:MAS:GRU:SOL +estnische estnisch ADJ:AKK:PLU:NEU:GRU:SOL +estnische estnisch ADJ:AKK:SIN:FEM:GRU:DEF +estnische estnisch ADJ:AKK:SIN:FEM:GRU:IND +estnische estnisch ADJ:AKK:SIN:FEM:GRU:SOL +estnische estnisch ADJ:AKK:SIN:NEU:GRU:DEF +estnische estnisch ADJ:NOM:PLU:FEM:GRU:SOL +estnische estnisch ADJ:NOM:PLU:MAS:GRU:SOL +estnische estnisch ADJ:NOM:PLU:NEU:GRU:SOL +estnische estnisch ADJ:NOM:SIN:FEM:GRU:DEF +estnische estnisch ADJ:NOM:SIN:FEM:GRU:IND +estnische estnisch ADJ:NOM:SIN:FEM:GRU:SOL +estnische estnisch ADJ:NOM:SIN:MAS:GRU:DEF +estnische estnisch ADJ:NOM:SIN:NEU:GRU:DEF +estnischen estnisch ADJ:AKK:PLU:FEM:GRU:DEF +estnischen estnisch ADJ:AKK:PLU:FEM:GRU:IND +estnischen estnisch ADJ:AKK:PLU:MAS:GRU:DEF +estnischen estnisch ADJ:AKK:PLU:MAS:GRU:IND +estnischen estnisch ADJ:AKK:PLU:NEU:GRU:DEF +estnischen estnisch ADJ:AKK:PLU:NEU:GRU:IND +estnischen estnisch ADJ:AKK:SIN:MAS:GRU:DEF +estnischen estnisch ADJ:AKK:SIN:MAS:GRU:IND +estnischen estnisch ADJ:AKK:SIN:MAS:GRU:SOL +estnischen estnisch ADJ:DAT:PLU:FEM:GRU:DEF +estnischen estnisch ADJ:DAT:PLU:FEM:GRU:IND +estnischen estnisch ADJ:DAT:PLU:FEM:GRU:SOL +estnischen estnisch ADJ:DAT:PLU:MAS:GRU:DEF +estnischen estnisch ADJ:DAT:PLU:MAS:GRU:IND +estnischen estnisch ADJ:DAT:PLU:MAS:GRU:SOL +estnischen estnisch ADJ:DAT:PLU:NEU:GRU:DEF +estnischen estnisch ADJ:DAT:PLU:NEU:GRU:IND +estnischen estnisch ADJ:DAT:PLU:NEU:GRU:SOL +estnischen estnisch ADJ:DAT:SIN:FEM:GRU:DEF +estnischen estnisch ADJ:DAT:SIN:FEM:GRU:IND +estnischen estnisch ADJ:DAT:SIN:MAS:GRU:DEF +estnischen estnisch ADJ:DAT:SIN:MAS:GRU:IND +estnischen estnisch ADJ:DAT:SIN:NEU:GRU:DEF +estnischen estnisch ADJ:DAT:SIN:NEU:GRU:IND +estnischen estnisch ADJ:GEN:PLU:FEM:GRU:DEF +estnischen estnisch ADJ:GEN:PLU:FEM:GRU:IND +estnischen estnisch ADJ:GEN:PLU:MAS:GRU:DEF +estnischen estnisch ADJ:GEN:PLU:MAS:GRU:IND +estnischen estnisch ADJ:GEN:PLU:NEU:GRU:DEF +estnischen estnisch ADJ:GEN:PLU:NEU:GRU:IND +estnischen estnisch ADJ:GEN:SIN:FEM:GRU:DEF +estnischen estnisch ADJ:GEN:SIN:FEM:GRU:IND +estnischen estnisch ADJ:GEN:SIN:MAS:GRU:DEF +estnischen estnisch ADJ:GEN:SIN:MAS:GRU:IND +estnischen estnisch ADJ:GEN:SIN:MAS:GRU:SOL +estnischen estnisch ADJ:GEN:SIN:NEU:GRU:DEF +estnischen estnisch ADJ:GEN:SIN:NEU:GRU:IND +estnischen estnisch ADJ:GEN:SIN:NEU:GRU:SOL +estnischen estnisch ADJ:NOM:PLU:FEM:GRU:DEF +estnischen estnisch ADJ:NOM:PLU:FEM:GRU:IND +estnischen estnisch ADJ:NOM:PLU:MAS:GRU:DEF +estnischen estnisch ADJ:NOM:PLU:MAS:GRU:IND +estnischen estnisch ADJ:NOM:PLU:NEU:GRU:DEF +estnischen estnisch ADJ:NOM:PLU:NEU:GRU:IND +estnischer estnisch ADJ:DAT:SIN:FEM:GRU:SOL +estnischer estnisch ADJ:GEN:PLU:FEM:GRU:SOL +estnischer estnisch ADJ:GEN:PLU:MAS:GRU:SOL +estnischer estnisch ADJ:GEN:PLU:NEU:GRU:SOL +estnischer estnisch ADJ:GEN:SIN:FEM:GRU:SOL +estnischer estnisch ADJ:NOM:SIN:MAS:GRU:IND +estnischer estnisch ADJ:NOM:SIN:MAS:GRU:SOL +estnischem estnisch ADJ:DAT:SIN:MAS:GRU:SOL +estnischem estnisch ADJ:DAT:SIN:NEU:GRU:SOL +estnisches estnisch ADJ:AKK:SIN:NEU:GRU:IND +estnisches estnisch ADJ:AKK:SIN:NEU:GRU:SOL +estnisches estnisch ADJ:NOM:SIN:NEU:GRU:IND +estnisches estnisch ADJ:NOM:SIN:NEU:GRU:SOL zuhauf zuhauf ADV:MOD piepegal piepegal ADJ:PRD:GRU piepegal piepegal ADV:MOD diff --git a/languagetool-language-modules/de/src/main/resources/org/languagetool/resource/de/hunspell/ignore.txt b/languagetool-language-modules/de/src/main/resources/org/languagetool/resource/de/hunspell/ignore.txt index 29b384320cd6..ba7f78bac03a 100644 --- a/languagetool-language-modules/de/src/main/resources/org/languagetool/resource/de/hunspell/ignore.txt +++ b/languagetool-language-modules/de/src/main/resources/org/languagetool/resource/de/hunspell/ignore.txt @@ -242947,6 +242947,9 @@ Lithiumnitrid Lithiumperoxid Lithiumphosphat Magnesiumcitrat +Unibetrieb +Unibetriebs +Unibetriebes Dogville/S #name Dahlmeier/S #name Soulfood/S #name diff --git a/languagetool-language-modules/de/src/test/java/org/languagetool/rules/de/GermanSpellerRuleTest.java b/languagetool-language-modules/de/src/test/java/org/languagetool/rules/de/GermanSpellerRuleTest.java index 255c3cb7e984..9071af2dd4c7 100644 --- a/languagetool-language-modules/de/src/test/java/org/languagetool/rules/de/GermanSpellerRuleTest.java +++ b/languagetool-language-modules/de/src/test/java/org/languagetool/rules/de/GermanSpellerRuleTest.java @@ -1000,6 +1000,11 @@ private void commonGermanAsserts(HunspellRule rule, JLanguageTool lt) throws IOE assertEquals(1, rule.match(lt.getAnalyzedSentence("Babyquietschte")).length); assertEquals(0, rule.match(lt.getAnalyzedSentence("nordwestfranzösisch")).length); assertEquals(0, rule.match(lt.getAnalyzedSentence("nordestnisch")).length); + assertEquals(0, rule.match(lt.getAnalyzedSentence("westmünsterländische")).length); + assertEquals(1, rule.match(lt.getAnalyzedSentence("süddeutschland")).length); + assertEquals(0, rule.match(lt.getAnalyzedSentence("Desktopbetrieb")).length); + assertEquals(0, rule.match(lt.getAnalyzedSentence("Desktophintergrund")).length); + assertEquals(0, rule.match(lt.getAnalyzedSentence("Unibetrieb")).length); } @Test