/** * @return false if neither the verb @param token1 (if any) nor @param token2 match @param person * and @param number, and none of them is "und" or "," if a finite verb is found, it is saved * in finiteVerb */ private boolean verbDoesMatchPersonAndNumber( final AnalyzedTokenReadings token1, final AnalyzedTokenReadings token2, final String person, final String number) { if (token1.getToken().equals(",") || token1.getToken().equals("und") || token2.getToken().equals(",") || token2.getToken().equals("und")) { return true; } boolean foundFiniteVerb = false; if (isFiniteVerb(token1)) { foundFiniteVerb = true; finiteVerb = token1; if (token1.hasPartialPosTag(":" + person + ":" + number)) { return true; } } if (isFiniteVerb(token2)) { foundFiniteVerb = true; finiteVerb = token2; if (token2.hasPartialPosTag(":" + person + ":" + number)) { return true; } } return !foundFiniteVerb; }
@Nullable private String baseForThirdPersonSingularVerb(String word) throws IOException { List<AnalyzedTokenReadings> readings = tagger.tag(Collections.singletonList(word)); for (AnalyzedTokenReadings reading : readings) { if (reading.hasPartialPosTag("VER:3:SIN:")) { return reading.getReadings().get(0).getLemma(); } } return null; }
/** * @return a list of pronouns which match the person and number of @param verb * @param toUppercase true when the suggestions should be capitalized */ private List<String> getPronounSuggestions( final AnalyzedTokenReadings verb, final boolean toUppercase) { List<String> result = new ArrayList<>(); if (verb.hasPartialPosTag(":1:SIN")) { result.add("ich"); } if (verb.hasPartialPosTag(":2:SIN")) { result.add("du"); } if (verb.hasPartialPosTag(":3:SIN")) { result.add("er"); result.add("sie"); result.add("es"); } if (verb.hasPartialPosTag(":1:PLU")) { result.add("wir"); } if (verb.hasPartialPosTag(":2:PLU")) { result.add("ihr"); } if (verb.hasPartialPosTag(":3:PLU") && !result.contains("sie")) { // do not add "sie" twice result.add("sie"); } if (toUppercase) { for (int i = 0; i < result.size(); ++i) { result.set(i, StringTools.uppercaseFirstChar(result.get(i))); } } return result; }
/** * @return true if the verb @param token (if it is a verb) matches @param person and @param * number, and matches no other person/number */ private boolean hasUnambiguouslyPersonAndNumber( final AnalyzedTokenReadings tokenReadings, final String person, final String number) { if (tokenReadings.getToken().length() == 0 || (Character.isUpperCase(tokenReadings.getToken().charAt(0)) && !(tokenReadings.getStartPos() == 0)) || !tokenReadings.hasPartialPosTag("VER")) return false; for (AnalyzedToken analyzedToken : tokenReadings) { final String postag = analyzedToken.getPOSTag(); if (postag.contains("_END")) // ignore SENT_END and PARA_END continue; if (!postag.contains(":" + person + ":" + number)) return false; } // for each reading return true; }
/** @return true if @param token is a finite verb, and it is no participle, pronoun or number */ private boolean isFiniteVerb(final AnalyzedTokenReadings token) { if (token.getToken().length() == 0 || (Character.isUpperCase(token.getToken().charAt(0)) && token.getStartPos() != 0) || !token.hasPartialPosTag("VER") || token.hasPartialPosTag("PA2") || token.hasPartialPosTag("PRO:") || token.hasPartialPosTag("ZAL")) { return false; } return (token.hasPartialPosTag(":1:") || token.hasPartialPosTag(":2:") || token.hasPartialPosTag(":3:")); }