Search in sources :

Example 1 with AnalyzedTokenReadings

use of org.languagetool.AnalyzedTokenReadings in project languagetool by languagetool-org.

the class GermanUppercasePhraseFinder method isRelevant.

private static boolean isRelevant(JLanguageTool lt, String term) throws IOException {
    AnalyzedSentence analyzedSentence = lt.analyzeText(term).get(0);
    AnalyzedTokenReadings[] tokens = analyzedSentence.getTokensWithoutWhitespace();
    if (tokens.length == 1 + 2) {
        // 1 is for sentence start
        if (tokens[1].hasPartialPosTag("ADJ:") && tokens[2].hasPartialPosTag("SUB:")) {
            return true;
        }
    }
    return false;
}
Also used : AnalyzedSentence(org.languagetool.AnalyzedSentence) AnalyzedTokenReadings(org.languagetool.AnalyzedTokenReadings)

Example 2 with AnalyzedTokenReadings

use of org.languagetool.AnalyzedTokenReadings in project languagetool by languagetool-org.

the class TokenInflectionExceptionHelper method isException.

public static boolean isException(AnalyzedTokenReadings[] tokens, int i, List<InflectionHelper.Inflection> masterInflections, List<InflectionHelper.Inflection> slaveInflections, List<AnalyzedToken> adjTokenReadings, List<AnalyzedToken> slaveTokenReadings) {
    AnalyzedTokenReadings adjAnalyzedTokenReadings = tokens[i - 1];
    if (i > 1 && LemmaHelper.hasLemma(tokens[i - 1], "національний") && LemmaHelper.hasLemma(tokens[i - 2], "перший") && Character.isUpperCase(tokens[i - 1].getToken().charAt(0)) && Character.isUpperCase(tokens[i - 2].getToken().charAt(0))) {
        logException();
        return true;
    }
    //  в день Хрещення Господнього священики
    if (LemmaHelper.hasLemma(tokens[i - 1], Arrays.asList("божий", "господній", "Христовий")) && Character.isUpperCase(tokens[i - 1].getToken().charAt(0))) {
        logException();
        return true;
    }
    // князівством Литовським подоляни
    if (i > 1 && PosTagHelper.hasPosTagPart(tokens[i - 2], "noun") && //TODO: 2nd char is lowercase?
    Character.isUpperCase(tokens[i - 1].getToken().charAt(0)) && !Collections.disjoint(masterInflections, InflectionHelper.getNounInflections(tokens[i - 2].getReadings()))) {
        logException();
        return true;
    }
    // одним із перших
    if (i > 1 && LemmaHelper.hasLemma(adjAnalyzedTokenReadings, Arrays.asList("перший"))) {
        //                && PosTagHelper.hasPosTag(slaveTokenReadings, ".*v_naz.*")) ) {
        logException();
        return true;
    }
    // лава запасних партії
    if (i > 1 && tokens[i - 1].getToken().equals("запасних") && LemmaHelper.hasLemma(tokens[i - 2], "лава")) {
        logException();
        return true;
    }
    // на повну людей розкрутили
    if (i > 1 && tokens[i - 1].getToken().equals("повну") && tokens[i - 2].getToken().equalsIgnoreCase("на")) {
        logException();
        return true;
    }
    // у Другій світовій участь
    if (i > 1 && LemmaHelper.hasLemma(tokens[i - 1], Arrays.asList("світовий"), ":f:") && LemmaHelper.hasLemma(tokens[i - 2], Arrays.asList("другий", "перший"), ":f:")) {
        logException();
        return true;
    }
    // довжиною до 500
    if (i < tokens.length - 1 && Arrays.asList("площею", "об'ємом", "довжиною", "висотою", "зростом").contains(tokens[i].getToken()) && PosTagHelper.hasPosTag(tokens[i + 1], "prep.*|.*num.*")) {
        logException();
        return true;
    }
    // молодшого гвардії сержанта
    if (i > 1 && i < tokens.length - 1 && tokens[i].getToken().equals("гвардії") && PosTagHelper.hasPosTag(tokens[i + 1], "noun.*") && !Collections.disjoint(masterInflections, InflectionHelper.getNounInflections(tokens[i + 1].getReadings()))) {
        logException();
        return true;
    }
    // 200% річних прибутку
    if (i > 1 && tokens[i - 2].getToken().endsWith("%") && tokens[i - 1].getToken().equals("річних")) {
        logException();
        return true;
    }
    // пасли задніх
    if (i > 2 && LemmaHelper.hasLemma(tokens[i - 2], "пасти") && tokens[i - 1].getToken().equals("задніх")) {
        logException();
        return true;
    }
    // не мати рівних
    if (i > 2 && LemmaHelper.hasLemma(tokens[i - 2], "мати") && tokens[i - 1].getToken().equals("рівних")) {
        logException();
        return true;
    }
    // на манер
    if (i > 1 && tokens[i].getToken().equals("манер") && tokens[i - 2].getToken().equalsIgnoreCase("на")) {
        logException();
        return true;
    }
    // усі до єдиного
    if (i > 2 && tokens[i - 1].getToken().equals("єдиного") && tokens[i - 2].getToken().equals("до") && LemmaHelper.hasLemma(tokens[i - 3], Arrays.asList("весь", "увесь"), ":p:")) {
        logException();
        return true;
    }
    // сильні світу цього
    if (LemmaHelper.hasLemma(adjAnalyzedTokenReadings, Arrays.asList("сильний", "могутній", "великий")) && tokens[i].getToken().equals("світу")) {
        logException();
        return true;
    }
    // колишня Маяковського
    if (LemmaHelper.hasLemma(tokens[i - 1], Arrays.asList("колишній", "тодішній", "теперішній", "нинішній"), Pattern.compile("adj.*:f:.*")) && Character.isUpperCase(tokens[i].getToken().charAt(0))) {
        logException();
        return true;
    }
    // 4-й Запорізький ім. гетьмана Б. Хмельницького
    if (i < tokens.length - 1 && Arrays.asList("ім.", "імені", "ордена").contains(tokens[i].getToken())) {
        //        && Character.isUpperCase(tokens[i+1].getToken().charAt(0)) ) {
        logException();
        return true;
    }
    // на дівоче Анна
    if (i > 1 && Arrays.asList("дівоче").contains(tokens[i - 1].getToken()) && PosTagHelper.hasPosTagPart(tokens[i], "name")) {
        logException();
        return true;
    }
    // вольному воля
    if (Arrays.asList("вольному", "вільному").contains(adjAnalyzedTokenReadings.getToken().toLowerCase()) && tokens[i].getToken().equals("воля")) {
        logException();
        return true;
    }
    // порядок денний
    if (i > 1 && LemmaHelper.hasLemma(adjAnalyzedTokenReadings, "денний") && LemmaHelper.hasLemma(tokens[i - 2], "порядок") && !Collections.disjoint(masterInflections, InflectionHelper.getNounInflections(tokens[i - 2].getReadings()))) {
        logException();
        return true;
    }
    // статтю 6-ту закону
    if (i > 1 && PosTagHelper.hasPosTagPart(adjAnalyzedTokenReadings, "num") && LemmaHelper.hasLemma(tokens[i - 2], "стаття") && !Collections.disjoint(masterInflections, InflectionHelper.getNounInflections(tokens[i - 2].getReadings()))) {
        logException();
        return true;
    }
    // Вони здатні екскаватором переорювати
    if (LemmaHelper.hasLemma(tokens[i - 1], Arrays.asList("здатний", "змушений", "винний", "повинний", "готовий", "спроможний"))) {
        logException();
        return true;
    }
    // моїх маму й сестер
    if (i < tokens.length - 2 && PosTagHelper.hasPosTag(adjAnalyzedTokenReadings, "adj:p:.*") && forwardConjFind(tokens, i + 1, 2) && hasOverlapIgnoreGender(masterInflections, slaveInflections)) {
        logException();
        return true;
    }
    // протягом минулих травня – липня
    if (i < tokens.length - 2 && PosTagHelper.hasPosTag(adjAnalyzedTokenReadings, "adj:p:.*") && tokens[i + 1].getToken().matches("[—–-]") && PosTagHelper.hasPosTag(tokens[i + 2], "(adj|noun).*") && //TODO: hasOverlapIgnoreGender(masterInflections, tokens[i+2])
    hasOverlapIgnoreGender(masterInflections, slaveInflections)) {
        logException();
        return true;
    }
    // на зарубаних матір з двома синами
    if (i < tokens.length - 2 && PosTagHelper.hasPosTag(adjAnalyzedTokenReadings, "adj:p:.*") && Arrays.asList("з", "із", "зі").contains(tokens[i + 1].getToken()) && PosTagHelper.hasPosTag(tokens[i + 2], "(noun|numr).*:v_oru.*") && hasOverlapIgnoreGender(masterInflections, slaveInflections)) {
        logException();
        return true;
    }
    // навчальної та середньої шкіл
    if (i > 2 && PosTagHelper.hasPosTag(tokens[i], "noun:.*:p:.*") && reverseConjFind(tokens, i - 2, 3) && hasOverlapIgnoreGender(masterInflections, slaveInflections)) {
        logException();
        return true;
    }
    // коринфський з іонійським ордери
    if (i > 2 && PosTagHelper.hasPosTag(tokens[i], "noun:.*:p:.*") && tokens[i - 2].getToken().matches("з|із|зі") && PosTagHelper.hasPosTag(tokens[i - 1], "adj.*v_oru.*") && hasOverlapIgnoreGender(InflectionHelper.getAdjInflections(tokens[i - 3].getReadings()), slaveInflections)) {
        logException();
        return true;
    }
    // на довгих півстоліття
    if (PosTagHelper.hasPosTag(adjAnalyzedTokenReadings, "adj:p:v_rod.*") && tokens[i].getToken().startsWith("пів") && PosTagHelper.hasPosTag(tokens[i], "noun.*v_rod.*")) {
        logException();
        return true;
    }
    // на довгих чверть століття
    if (i < tokens.length - 1 && PosTagHelper.hasPosTag(adjAnalyzedTokenReadings, "adj:p:v_rod.*") && tokens[i].getToken().equals("чверть") && PosTagHelper.hasPosTag(tokens[i + 1], "noun.*v_rod.*")) {
        logException();
        return true;
    }
    // присудок ж.р. + професія ч.р.
    if (Arrays.asList("переконана", "впевнена", "упевнена", "годна", "ладна", "певна", "причетна", "обрана", "призначена").contains(adjAnalyzedTokenReadings.getToken()) && PosTagHelper.hasPosTag(tokens[i], "noun:anim:m:v_naz.*")) {
        logException();
        return true;
    }
    // чинних станом на
    if (i < tokens.length - 1 && tokens[i].getToken().equals("станом") && tokens[i + 1].getToken().equals("на")) {
        logException();
        return true;
    }
    // постійно на рівних міністри, президенти
    if (i > 1 && tokens[i - 1].getToken().equals("рівних") && tokens[i - 2].getToken().equalsIgnoreCase("на")) {
        logException();
        return true;
    }
    // польські зразка 1620—1650 років
    if (i < tokens.length - 1 && tokens[i].getToken().equals("зразка")) {
        logException();
        return true;
    }
    // три зелених плюс два червоних
    if (Arrays.asList("мінус", "плюс").contains(tokens[i].getToken())) {
        logException();
        return true;
    }
    // природний тисячею років підтверджений
    if (i < tokens.length - 1 && LemmaHelper.hasLemma(tokens[i], Arrays.asList("пара", "низка", "ряд", "купа", "більшість", "десятка", "сотня", "тисяча", "мільйон")) && PosTagHelper.hasPosTag(tokens[i + 1], "noun.*:p:v_rod.*")) {
        logException();
        return true;
    }
    // років 6, відсотків зо два, разів у десять
    if (i < tokens.length - 1 && LemmaHelper.hasLemma(tokens[i], TIME_PLUS_LEMMAS) && (PosTagHelper.hasPosTag(tokens[i + 1], "num.*") || PosTagHelper.hasPosTagPart(tokens[i + 1], "prep"))) {
        logException();
        return true;
    }
    // відсотків/років на 5
    if (i < tokens.length - 2 && LemmaHelper.hasLemma(tokens[i], TIME_PLUS_LEMMAS, Pattern.compile("noun:inanim:p:v_(rod|naz).*")) && //        && PosTagHelper.hasPosTag(tokens[i], ".*:p:v_(rod|naz).*")
    LemmaHelper.hasLemma(tokens[i + 1], "на") && PosTagHelper.hasPosTag(tokens[i + 2], "num.*")) {
        logException();
        return true;
    }
    // пофарбований рік тому
    if (i < tokens.length - 1 && LemmaHelper.hasLemma(tokens[i], TIME_LEMMAS) && LemmaHelper.hasLemma(tokens[i + 1], "тому")) {
        logException();
        return true;
    }
    // замість звичного десятиліттями
    if (i < tokens.length - 1 && LemmaHelper.hasLemma(tokens[i], TIME_PLUS_LEMMAS, Pattern.compile("noun:inanim:p:v_oru.*"))) {
        logException();
        return true;
    }
    // кількох десятих відсотка
    if (LemmaHelper.hasLemma(tokens[i - 1], Arrays.asList("десятий", "сотий", "тисячний", "десятитисячний", "стотитисячний", "мільйонний", "мільярдний")) && PosTagHelper.hasPosTag(adjAnalyzedTokenReadings, ".*:[fp]:.*") && PosTagHelper.hasPosTag(tokens[i], "noun.*v_rod.*")) {
        logException();
        return true;
    }
    // TODO: два закинутих, похмурих палаци
    if (i > 1 && i < tokens.length && PosTagHelper.hasPosTag(adjAnalyzedTokenReadings, ".*:p:v_(rod|naz).*") && LemmaHelper.reverseSearch(tokens, i - 2, 5, DOVYE_TROYE, null) && //                    || tokens[i-2].getToken().matches("[«„\"]"))) ) 
    (PosTagHelper.hasPosTag(tokens[i], ".*(:p:v_naz|:n:v_rod).*") || Arrays.asList("імені", "ока").contains(tokens[i].getToken()))) {
        logException();
        return true;
    }
    // на сьомому–восьмому поверхах
    if ((adjAnalyzedTokenReadings.getToken().matches("[0-9]+[—–-][0-9]+-[а-яіїєґ]{1,3}") || (adjAnalyzedTokenReadings.getToken().matches(".*[а-яїієґ][—–-].*") && PosTagHelper.hasPosTagPart(adjAnalyzedTokenReadings, "&numr"))) && PosTagHelper.hasPosTag(slaveTokenReadings, ".*:p:.*") && hasOverlapIgnoreGender(masterInflections, slaveInflections)) {
        logException();
        return true;
    }
    // восьмого – дев’ятого класів
    if (i > 2 && Arrays.asList("–", "—").contains(tokens[i - 2].getToken()) && PosTagHelper.hasPosTag(adjAnalyzedTokenReadings, ".*num.*") && PosTagHelper.hasPosTag(tokens[i - 3], ".*num.*") && PosTagHelper.hasPosTag(slaveTokenReadings, ".*:p:.*") && hasOverlapIgnoreGender(InflectionHelper.getAdjInflections(tokens[i - 3].getReadings()), slaveInflections) && hasOverlapIgnoreGender(masterInflections, slaveInflections)) {
        logException();
        return true;
    }
    //    if( LemmaHelper.hasLemma(adjAnalyzedTokenReadins, Arrays.asList("найближчий", "минулий"), ":p:") 
    if (PosTagHelper.hasPosTag(adjAnalyzedTokenReadings, "adj.*:p:.*") && tokens[i].getToken().matches(".*[—–-].*") && (TIME_PLUS_LEMMAS.contains(tokens[i].getAnalyzedToken(0).getLemma().split("[—–-]")[0]) || // does not work for тиждень-два due to dynamic tagging returning singular
    hasOverlapIgnoreGender(masterInflections, slaveInflections))) {
        logException();
        return true;
    }
    // Від наступних пари десятків
    if (i < tokens.length - 1 && LemmaHelper.hasLemma(tokens[i], "пара") && PosTagHelper.hasPosTag(adjAnalyzedTokenReadings, "adj.*:p:.*") && PosTagHelper.hasPosTag(tokens[i + 1], ".*:p:v_rod.*")) {
        // adding "num" fails "десятків" тощо 
        logException();
        return true;
    }
    // п'ять шостих світу
    if (i > 1 && PosTagHelper.hasPosTag(tokens[i - 1], ".*:p:v_rod.*num.*") && PosTagHelper.hasPosTagPart(tokens[i - 2], "num") && PosTagHelper.hasPosTag(tokens[i], "noun.*v_rod.*")) {
        logException();
        return true;
    }
    // dates
    if (PosTagHelper.hasPosTagPart(adjAnalyzedTokenReadings, ":&numr")) {
        String adjToken = adjAnalyzedTokenReadings.getToken();
        // Ставши 2003-го прем’єром
        if (adjToken.matches("([12][0-9])?[0-9][0-9]-(й|го|м|му|х)") || adjToken.matches("([12][0-9])?[0-9]0-(ті|тих)") || adjToken.matches("[12][0-9][0-9][0-9][—–-][12][0-9][0-9][0-9]-(й|го|му|х)")) {
            logException();
            return true;
        }
        // Призначений на 11-ту похід
        if (i > 1 && PosTagHelper.hasPosTagPart(adjAnalyzedTokenReadings, ":f:") && LemmaHelper.hasLemma(tokens[i - 2], Arrays.asList("на", "в", "у", "за", "о")) && !LemmaHelper.hasLemma(tokens[i], Arrays.asList("хвилина", "година"))) {
            logException();
            return true;
        }
        // Arrays.asList("ранок", "день", "вечір", "ніч", "пополудень") + "v_rod"
        if (PosTagHelper.hasPosTagPart(adjAnalyzedTokenReadings, ":f:") && tokens[i].getToken().matches("ранку|дня|вечора|ночі|пополудня")) {
            logException();
            return true;
        }
        // дев'яте травня
        if (PosTagHelper.hasPosTagPart(adjAnalyzedTokenReadings, ":n:") && LemmaHelper.hasLemma(tokens[i], MONTH_LEMMAS, "v_rod")) {
            logException();
            return true;
        }
    }
    // let simple replace rule take care of this
    if (PosTagHelper.hasPosTagPart(adjAnalyzedTokenReadings, "adjp:actv:imperf")) {
        //        && PosTagHelper.hasPosTag(slaveTokenReadings, "noun.*v_zna")) {
        logException();
        return true;
    }
    // писав про щось подібне Юрій
    if (i > 2 && i <= tokens.length - 1 && LemmaHelper.hasLemma(tokens[i - 2], Arrays.asList("ніщо", "щось", "ніхто", "хтось")) && // we now have gender for pron
    !Collections.disjoint(InflectionHelper.getNounInflections(tokens[i - 2].getReadings()), masterInflections)) //&& tokens[i+1].getToken().equals("не")
    {
        logException();
        return true;
    }
    // визнання тут шкідливою орієнтацію
    if (i > 1 && LemmaHelper.revSearch(tokens, i - 2, Pattern.compile(".*(ння|ття)"), null) && PosTagHelper.hasPosTag(tokens[i - 1], "adj.*:v_oru.*") && PosTagHelper.hasPosTag(tokens[i], "noun:.*:v_rod.*") && genderMatches(masterInflections, slaveInflections, "v_oru", "v_rod")) {
        logException();
        return true;
    }
    int verbPos = LemmaHelper.revSearchIdx(tokens, i - 2, Pattern.compile("бути|ставати|стати|залишатися|залишитися"), null);
    if (verbPos != -1) {
        if (PosTagHelper.hasPosTag(adjAnalyzedTokenReadings, "adj.*v_naz.*adjp:pasv.*")) {
            // був змушений
            if (genderMatches(masterInflections, slaveInflections, "v_naz", "v_naz")) {
                logException();
                return true;
            } else // був заповнений відвідувачами
            if (genderMatches(masterInflections, slaveInflections, "v_naz", "v_naz")) {
                logException();
                return true;
            }
        } else if (PosTagHelper.hasPosTag(adjAnalyzedTokenReadings, "adj.*v_oru.*")) {
            // була чинною заборона
            if (PosTagHelper.hasPosTag(slaveTokenReadings, "noun.*v_naz.*")) {
                if (genderMatches(masterInflections, slaveInflections, "v_oru", "v_naz")) {
                    // не можуть бути толерантними ізраїльтяни
                    if (PosTagHelper.hasPosTagPart(tokens[verbPos], ":inf") || TokenVerbAgreementRule.inflectionsOverlap(tokens[verbPos].getReadings(), tokens[i].getReadings())) {
                        logException();
                        return true;
                    }
                } else // Стали дорожчими хліб чи бензин
                if (i < tokens.length - 1 && PosTagHelper.hasPosTagPart(tokens[i - 1], "adj:p:") && CONJ_FOR_PLURAL.contains(tokens[i + 1].getToken())) {
                    logException();
                    return true;
                }
            } else // слід бути обережними туристам у горах
            if (PosTagHelper.hasPosTag(slaveTokenReadings, "noun.*v_dav.*")) {
                if (genderMatches(masterInflections, slaveInflections, "v_oru", "v_dav")) {
                    logException();
                    return true;
                }
            }
        }
    }
    verbPos = LemmaHelper.revSearchIdx(tokens, i - 2, null, "verb.*");
    if (verbPos != -1) {
        if (PosTagHelper.hasPosTag(adjAnalyzedTokenReadings, "adj.*v_oru.*")) {
            // визнали справедливою наставники обох команд
            if (PosTagHelper.hasPosTag(slaveTokenReadings, "noun.*v_naz.*") && TokenVerbAgreementRule.inflectionsOverlap(tokens[verbPos].getReadings(), tokens[i].getReadings())) {
                logException();
                return true;
            }
        }
    }
    // помальована в (усе) біле кімната
    if (i > 2 && Arrays.asList("біле", "чорне", "оранжеве", "червоне", "жовте", "синє", "зелене", "фіолетове").contains(tokens[i - 1].getToken()) && Arrays.asList("в", "у").contains(tokens[i - 2].getToken()) && PosTagHelper.hasPosTagPart(tokens[i - 3], "adjp:pasv")) {
        List<InflectionHelper.Inflection> masterInflections_ = InflectionHelper.getAdjInflections(tokens[i - 3].getReadings());
        if (!Collections.disjoint(masterInflections_, slaveInflections)) {
            logException();
            return true;
        }
    }
    if (i > 3 && Arrays.asList("біле", "чорне").contains(tokens[i - 1].getToken()) && Arrays.asList("усе", "все").contains(tokens[i - 2].getToken()) && Arrays.asList("в", "у").contains(tokens[i - 3].getToken()) && PosTagHelper.hasPosTagPart(tokens[i - 4], "adjp:pasv")) {
        List<InflectionHelper.Inflection> masterInflections_ = InflectionHelper.getAdjInflections(tokens[i - 4].getReadings());
        if (!Collections.disjoint(masterInflections_, slaveInflections)) {
            logException();
            return true;
        }
    }
    // повторена тисячу разів
    if (i < tokens.length - 1 && PosTagHelper.hasPosTagPart(adjAnalyzedTokenReadings, "adjp:pasv") && Arrays.asList("тисячу", "сотню", "десятки").contains(tokens[i].getToken()) && Arrays.asList("разів", "раз", "років").contains(tokens[i + 1].getToken())) {
        logException();
        return true;
    }
    if (i > 2) {
        // наближена до сімейної форма
        if (PosTagHelper.hasPosTagPart(tokens[i - 2], "prep")) {
            if (PosTagHelper.hasPosTag(tokens[i - 3], "(adj|verb|part|noun|adv).*")) {
                Collection<String> prepGovernedCases = getPrepGovernedCases(tokens[i - 2]);
                if (TokenAgreementRule.hasVidmPosTag(prepGovernedCases, tokens[i - 1])) {
                    // can't just ignore noun: ігнорує "асоціюється в нас із сучасною цивілізацію"
                    if ((PosTagHelper.hasPosTag(tokens[i - 3], "(verb|part).*") || Arrays.asList("поряд", "відміну", "порівнянні").contains(tokens[i - 3].getToken().toLowerCase())) && PosTagHelper.hasPosTag(tokens[i], "noun.*v_(naz|zna|oru).*")) {
                        //TODO: check noun case agreement with verb
                        logException();
                        return true;
                    }
                    List<InflectionHelper.Inflection> masterInflections_ = InflectionHelper.getAdjInflections(tokens[i - 3].getReadings());
                    if (!Collections.disjoint(masterInflections_, slaveInflections)) {
                        logException();
                        return true;
                    }
                    // тотожні із загальносоюзними герб і прапор
                    if (i < tokens.length - 1 && PosTagHelper.hasPosTagPart(tokens[i - 1], "adj:p:") && CONJ_FOR_PLURAL.contains(tokens[i + 1].getToken())) {
                        logException();
                        return true;
                    }
                }
            }
        }
    }
    // підсвічений синім діамант
    if (i > 1 && // could be :&adjp or :&_adjp
    PosTagHelper.hasPosTagPart(tokens[i - 2], "adjp:pasv") && PosTagHelper.hasPosTag(tokens[i - 1], "adj.*v_oru.*") && !Collections.disjoint(InflectionHelper.getAdjInflections(tokens[i - 2].getReadings()), slaveInflections)) {
        logException();
        return true;
    }
    // всі вкриті плющем
    if (// could be :&adjp or :&_adjp
    PosTagHelper.hasPosTagPart(adjAnalyzedTokenReadings, "adjp:pasv") && PosTagHelper.hasPosTagPart(tokens[i], "v_oru")) {
        logException();
        return true;
    }
    // Слабшою критики вважають
    if (i > 1 && !PosTagHelper.hasPosTag(tokens[i - 2], ".*adjp:pasv.*|prep.*") && PosTagHelper.hasPosTag(adjAnalyzedTokenReadings, "adj.*v_oru.*") && PosTagHelper.hasPosTag(slaveTokenReadings, "noun.*v_naz.*") && LemmaHelper.forwardPosTagSearch(tokens, i + 1, "verb", 3)) {
        logException();
        return true;
    }
    // we still want to trigger on: за наявною інформацію
    if ((i < 3 || !PosTagHelper.hasPosTag(tokens[i - 2], "prep.*rv_oru.*|adj.*adjp:pasv.*")) && PosTagHelper.hasPosTagPart(adjAnalyzedTokenReadings, "v_oru") && PosTagHelper.hasPosTag(slaveTokenReadings, ".*v_zna.*") && genderMatches(masterInflections, slaveInflections, "v_oru", "v_zna")) {
        logException();
        return true;
    }
    if (caseGovernmentMatches(adjTokenReadings, slaveInflections)) {
        if (i < tokens.length - 1 && PosTagHelper.hasPosTagPart(tokens[i + 1], "noun:")) {
            // радий присутності генерала
            if (PosTagHelper.hasPosTag(tokens[i + 1], "noun.*v_(rod|oru|naz|dav).*")) {
                //            && ! PosTagHelper.hasPosTag(adjAnalyzedTokenReadins, "adj.*v_oru.*") ) {
                logException();
                return true;
            }
            // Нав’язаний Австрії нейтралитет
            List<InflectionHelper.Inflection> slave2Inflections = InflectionHelper.getNounInflections(tokens[i + 1].getReadings());
            if (!Collections.disjoint(masterInflections, slave2Inflections)) {
                logException();
                return true;
            }
        } else {
            // Нав’язаний Австрії,
            logException();
            return true;
        }
    }
    // альтернативні газовому варіанти
    if (i > 1 && PosTagHelper.hasPosTagPart(tokens[i - 2], "adj") && caseGovernmentMatches(tokens[i - 2].getReadings(), masterInflections)) {
        List<Inflection> preAdjInflections = InflectionHelper.getAdjInflections(tokens[i - 2].getReadings());
        if (//genderMatches(masterInflections, slaveInflections, null, null)
        !Collections.disjoint(preAdjInflections, slaveInflections)) {
            logException();
            return true;
        }
    }
    // not an exception
    return false;
}
Also used : Inflection(org.languagetool.rules.uk.InflectionHelper.Inflection) AnalyzedTokenReadings(org.languagetool.AnalyzedTokenReadings)

Example 3 with AnalyzedTokenReadings

use of org.languagetool.AnalyzedTokenReadings in project languagetool by languagetool-org.

the class TokenVerbAgreementRule method match.

@Override
public final RuleMatch[] match(AnalyzedSentence text) {
    List<RuleMatch> ruleMatches = new ArrayList<>();
    AnalyzedTokenReadings[] tokens = text.getTokensWithoutWhitespace();
    List<AnalyzedToken> nounTokenReadings = new ArrayList<>();
    AnalyzedTokenReadings nounAnalyzedTokenReadings = null;
    for (int i = 1; i < tokens.length; i++) {
        AnalyzedTokenReadings tokenReadings = tokens[i];
        String posTag0 = tokenReadings.getAnalyzedToken(0).getPOSTag();
        if (posTag0 == null) {
            nounTokenReadings.clear();
            continue;
        }
        if (nounTokenReadings.isEmpty()) {
            // no need to start checking on last token or if no noun
            if (i == tokens.length - 1)
                continue;
            if (!PosTagHelper.hasPosTag(tokenReadings, "noun.*:v_naz.*"))
                continue;
            for (AnalyzedToken token : tokenReadings) {
                String nounPosTag = token.getPOSTag();
                if (nounPosTag == null) {
                    // can happen for words with ́ or ­
                    continue;
                }
                if (nounPosTag.startsWith("noun") && nounPosTag.contains("v_naz")) {
                    nounTokenReadings.add(token);
                    nounAnalyzedTokenReadings = tokenReadings;
                } else //          else if ( nounPosTag.equals(JLanguageTool.SENTENCE_END_TAGNAME) ) {
                //            continue;
                //          }
                {
                    nounTokenReadings.clear();
                    break;
                }
            }
            continue;
        }
        // see if we get a following verb
        //       System.err.println("Check for verb: " + tokenReadings);
        List<AnalyzedToken> verbTokenReadings = new ArrayList<>();
        for (AnalyzedToken token : tokenReadings) {
            String verbPosTag = token.getPOSTag();
            if (verbPosTag == null) {
                // can happen for words with ́ or ­
                continue;
            }
            if (verbPosTag.startsWith("</")) {
                verbTokenReadings.clear();
                break;
            }
            if (verbPosTag.startsWith("verb")) {
                verbTokenReadings.add(token);
            } else if (verbPosTag.equals(JLanguageTool.SENTENCE_END_TAGNAME)) {
                continue;
            } else {
                verbTokenReadings.clear();
                break;
            }
        }
        if (verbTokenReadings.isEmpty()) {
            nounTokenReadings.clear();
            continue;
        }
        if (DEBUG) {
            System.err.println(MessageFormat.format("=== Checking\n\t{}\n\t{}", nounTokenReadings, verbTokenReadings));
        }
        // perform the check
        List<Inflection> masterInflections = getNounInflections(nounTokenReadings);
        List<Inflection> slaveInflections = getVerbInflections(verbTokenReadings);
        if (DEBUG) {
            System.err.println(MessageFormat.format("\t\t{}\n\t{}", masterInflections, slaveInflections));
        }
        if (Collections.disjoint(masterInflections, slaveInflections)) {
            if (TokenVerbAgreementExceptionHelper.isException(tokens, i, masterInflections, slaveInflections, nounTokenReadings, verbTokenReadings)) {
                nounTokenReadings.clear();
                break;
            }
            if (DEBUG) {
                System.err.println(MessageFormat.format("=== Found noun/verb mismatch\n\t{}\n\t{}", nounAnalyzedTokenReadings.getToken() + ": " + masterInflections + " // " + nounAnalyzedTokenReadings, verbTokenReadings.get(0).getToken() + ": " + slaveInflections + " // " + verbTokenReadings));
            }
            String msg = String.format("Неузгоджені іменник з дієсловом: \"%s\" (%s) і \"%s\" (%s)", nounTokenReadings.get(0).getToken(), masterInflections, verbTokenReadings.get(0).getToken(), slaveInflections);
            RuleMatch potentialRuleMatch = new RuleMatch(this, nounAnalyzedTokenReadings.getStartPos(), tokenReadings.getEndPos(), msg, getShort());
            ruleMatches.add(potentialRuleMatch);
        }
        nounTokenReadings.clear();
    }
    return toRuleMatchArray(ruleMatches);
}
Also used : RuleMatch(org.languagetool.rules.RuleMatch) AnalyzedToken(org.languagetool.AnalyzedToken) ArrayList(java.util.ArrayList) AnalyzedTokenReadings(org.languagetool.AnalyzedTokenReadings)

Example 4 with AnalyzedTokenReadings

use of org.languagetool.AnalyzedTokenReadings in project languagetool by languagetool-org.

the class UkrainianWordRepeatRule method ignore.

@Override
public boolean ignore(AnalyzedTokenReadings[] tokens, int position) {
    AnalyzedTokenReadings analyzedTokenReadings = tokens[position];
    String token = analyzedTokenReadings.getToken();
    // від добра добра не шукають
    if (position > 1 && token.equals("добра") && tokens[position - 2].getToken().equalsIgnoreCase("від"))
        return true;
    if (REPEAT_ALLOWED_SET.contains(token.toLowerCase()))
        return true;
    if (REPEAT_ALLOWED_CAPS_SET.contains(token))
        return true;
    if (PosTagHelper.hasPosTag(analyzedTokenReadings, "date|time|number"))
        return true;
    for (AnalyzedToken analyzedToken : analyzedTokenReadings.getReadings()) {
        String posTag = analyzedToken.getPOSTag();
        if (posTag != null) {
            if (!isInitial(analyzedToken, tokens, position) && //            && ! posTag.equals(JLanguageTool.SENTENCE_START_TAGNAME)
            !posTag.equals(JLanguageTool.SENTENCE_END_TAGNAME))
                return false;
        }
    }
    return true;
}
Also used : AnalyzedToken(org.languagetool.AnalyzedToken) AnalyzedTokenReadings(org.languagetool.AnalyzedTokenReadings)

Example 5 with AnalyzedTokenReadings

use of org.languagetool.AnalyzedTokenReadings in project languagetool by languagetool-org.

the class UkrainianHybridDisambiguator method getInitialReadings.

private static AnalyzedTokenReadings getInitialReadings(AnalyzedTokenReadings initialsReadings, AnalyzedTokenReadings lnameTokens, String initialType) {
    List<AnalyzedToken> newTokens = new ArrayList<>();
    for (AnalyzedToken lnameToken : lnameTokens.getReadings()) {
        String lnamePosTag = lnameToken.getPOSTag();
        if (lnamePosTag == null || !lnamePosTag.contains(LAST_NAME_TAG))
            continue;
        String initialsToken = initialsReadings.getAnalyzedToken(0).getToken();
        AnalyzedToken newToken = new AnalyzedToken(initialsToken, lnamePosTag.replace(LAST_NAME_TAG, ":" + initialType + ":abbr"), initialsToken);
        newTokens.add(newToken);
    }
    return new AnalyzedTokenReadings(newTokens, initialsReadings.getStartPos());
}
Also used : AnalyzedToken(org.languagetool.AnalyzedToken) ArrayList(java.util.ArrayList) AnalyzedTokenReadings(org.languagetool.AnalyzedTokenReadings)

Aggregations

AnalyzedTokenReadings (org.languagetool.AnalyzedTokenReadings)116 AnalyzedToken (org.languagetool.AnalyzedToken)48 ArrayList (java.util.ArrayList)47 AnalyzedSentence (org.languagetool.AnalyzedSentence)21 Test (org.junit.Test)16 RuleMatch (org.languagetool.rules.RuleMatch)14 Matcher (java.util.regex.Matcher)13 IOException (java.io.IOException)7 Nullable (org.jetbrains.annotations.Nullable)6 JLanguageTool (org.languagetool.JLanguageTool)6 Pattern (java.util.regex.Pattern)5 ChunkTag (org.languagetool.chunking.ChunkTag)5 English (org.languagetool.language.English)3 TaggedWord (org.languagetool.tagging.TaggedWord)3 InputStream (java.io.InputStream)2 HashMap (java.util.HashMap)2 List (java.util.List)2 Scanner (java.util.Scanner)2 TreeSet (java.util.TreeSet)2 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)2