Search in sources :

Example 1 with Inflection

use of org.languagetool.rules.uk.InflectionHelper.Inflection 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 2 with Inflection

use of org.languagetool.rules.uk.InflectionHelper.Inflection in project languagetool by languagetool-org.

the class TokenInflectionAgreementRule method match.

@Override
public final RuleMatch[] match(AnalyzedSentence text) {
    List<RuleMatch> ruleMatches = new ArrayList<>();
    AnalyzedTokenReadings[] tokens = text.getTokensWithoutWhitespace();
    List<AnalyzedToken> adjTokenReadings = new ArrayList<>();
    AnalyzedTokenReadings adjAnalyzedTokenReadings = null;
    for (int i = 1; i < tokens.length; i++) {
        AnalyzedTokenReadings tokenReadings = tokens[i];
        String posTag0 = tokenReadings.getAnalyzedToken(0).getPOSTag();
        if (posTag0 == null) {
            //          || posTag0.equals(JLanguageTool.SENTENCE_START_TAGNAME) ){
            adjTokenReadings.clear();
            continue;
        }
        if (adjTokenReadings.isEmpty()) {
            // no need to start checking on last token or if no noun
            if (i == tokens.length - 1)
                continue;
            //TODO: nv still can be wrong if :np/:ns is present to it's not much gain for lots of work
            if (PosTagHelper.hasPosTagPart(tokens[i], ":nv") || //TODO: turn back on when we can handle pron
            PosTagHelper.hasPosTagPart(tokens[i], "&pron") || PosTagHelper.hasPosTagPart(tokens[i], "<"))
                continue;
            if (!PosTagHelper.hasPosTagPart(tokens[i + 1], "noun:") || PosTagHelper.hasPosTagPart(tokens[i + 1], ":nv") || PosTagHelper.hasPosTagPart(tokens[i + 1], "&pron") || PosTagHelper.hasPosTagPart(tokens[i + 1], "<"))
                continue;
            if (LemmaHelper.hasLemma(tokens[i], Arrays.asList("червоний", "правий", "місцевий", "найсильніший", "найкращі"), ":p:") || LemmaHelper.hasLemma(tokens[i], Arrays.asList("новенький", "головний", "вибраний", "більший", "побачений", "подібний"), ":n:") || LemmaHelper.hasLemma(tokens[i], Arrays.asList("державний"), ":f:")) {
                adjTokenReadings.clear();
                break;
            }
            for (AnalyzedToken token : tokenReadings) {
                String adjPosTag = token.getPOSTag();
                if (adjPosTag == null) {
                    // can happen for words with ́ or ­
                    continue;
                }
                if (adjPosTag.startsWith("adj")) {
                    adjTokenReadings.add(token);
                    adjAnalyzedTokenReadings = tokenReadings;
                } else {
                    adjTokenReadings.clear();
                    break;
                }
            }
            continue;
        }
        List<AnalyzedToken> slaveTokenReadings = new ArrayList<>();
        for (AnalyzedToken token : tokenReadings) {
            String nounPosTag = token.getPOSTag();
            if (nounPosTag == null) {
                // can happen for words with ́ or ­
                continue;
            }
            if (nounPosTag.startsWith("noun") && !nounPosTag.contains(NO_VIDMINOK_SUBSTR)) {
                slaveTokenReadings.add(token);
            } else if (nounPosTag.equals(JLanguageTool.SENTENCE_END_TAGNAME) || nounPosTag.equals(JLanguageTool.PARAGRAPH_END_TAGNAME)) {
                continue;
            } else {
                slaveTokenReadings.clear();
                break;
            }
        }
        if (slaveTokenReadings.isEmpty()) {
            adjTokenReadings.clear();
            continue;
        }
        if (DEBUG) {
            System.err.println(MessageFormat.format("=== Checking:\n\t{0}\n\t{1}", adjTokenReadings, slaveTokenReadings));
        }
        // perform the check
        List<InflectionHelper.Inflection> masterInflections = InflectionHelper.getAdjInflections(adjTokenReadings);
        List<InflectionHelper.Inflection> slaveInflections = InflectionHelper.getNounInflections(slaveTokenReadings);
        if (Collections.disjoint(masterInflections, slaveInflections)) {
            if (TokenInflectionExceptionHelper.isException(tokens, i, masterInflections, slaveInflections, adjTokenReadings, slaveTokenReadings)) {
                adjTokenReadings.clear();
                continue;
            }
            if (DEBUG) {
                System.err.println(MessageFormat.format("=== Found:\n\t{0}\n\t", adjAnalyzedTokenReadings.getToken() + ": " + masterInflections + " // " + adjAnalyzedTokenReadings, slaveTokenReadings.get(0).getToken() + ": " + slaveInflections + " // " + slaveTokenReadings));
            }
            String msg = String.format("Потенційна помилка: прикметник не узгоджений з іменником: \"%s\": [%s] і \"%s\": [%s]", adjTokenReadings.get(0).getToken(), formatInflections(masterInflections, true), slaveTokenReadings.get(0).getToken(), formatInflections(slaveInflections, false));
            if (PosTagHelper.hasPosTagPart(adjTokenReadings, ":m:v_rod") && tokens[i].getToken().matches(".*[ую]") && PosTagHelper.hasPosTag(slaveTokenReadings, "noun.*:m:v_dav.*")) {
                msg += ". Можливо вжито невнормований родовий відмінок ч.р. з закінченням -у/-ю замість -а/-я (така тенденція є в сучасній мові)?";
            }
            RuleMatch potentialRuleMatch = new RuleMatch(this, adjAnalyzedTokenReadings.getStartPos(), tokenReadings.getEndPos(), msg, getShort());
            Synthesizer ukrainianSynthesizer = ukrainian.getSynthesizer();
            List<String> suggestions = new ArrayList<>();
            try {
                for (Inflection adjInflection : masterInflections) {
                    String genderTag = ":" + adjInflection.gender + ":";
                    String vidmTag = adjInflection._case;
                    if (!adjInflection._case.equals("v_kly") && (adjInflection.gender.equals("p") || PosTagHelper.hasPosTagPart(slaveTokenReadings, genderTag))) {
                        for (AnalyzedToken nounToken : slaveTokenReadings) {
                            if (adjInflection.animMatters()) {
                                if (!nounToken.getPOSTag().contains(":" + adjInflection.animTag))
                                    continue;
                            }
                            String newNounPosTag = nounToken.getPOSTag().replaceFirst(":.:v_...", genderTag + vidmTag);
                            String[] synthesized = ukrainianSynthesizer.synthesize(nounToken, newNounPosTag, false);
                            for (String s : synthesized) {
                                String suggestion = adjAnalyzedTokenReadings.getToken() + " " + s;
                                if (!suggestions.contains(suggestion)) {
                                    suggestions.add(suggestion);
                                }
                            }
                        }
                    }
                }
                for (Inflection nounInflection : slaveInflections) {
                    String genderTag = ":" + nounInflection.gender + ":";
                    String vidmTag = nounInflection._case;
                    if (nounInflection.animMatters()) {
                        vidmTag += ":r" + nounInflection.animTag;
                    }
                    for (AnalyzedToken adjToken : adjTokenReadings) {
                        String newAdjTag = adjToken.getPOSTag().replaceFirst(":.:v_...(:r(in)?anim)?", genderTag + vidmTag);
                        String[] synthesized = ukrainianSynthesizer.synthesize(adjToken, newAdjTag, false);
                        for (String s : synthesized) {
                            String suggestion = s + " " + tokenReadings.getToken();
                            if (!suggestions.contains(suggestion)) {
                                suggestions.add(suggestion);
                            }
                        }
                    }
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            if (suggestions.size() > 0) {
                potentialRuleMatch.setSuggestedReplacements(suggestions);
            }
            ruleMatches.add(potentialRuleMatch);
        }
        adjTokenReadings.clear();
    }
    return toRuleMatchArray(ruleMatches);
}
Also used : ArrayList(java.util.ArrayList) Inflection(org.languagetool.rules.uk.InflectionHelper.Inflection) IOException(java.io.IOException) AnalyzedTokenReadings(org.languagetool.AnalyzedTokenReadings) RuleMatch(org.languagetool.rules.RuleMatch) AnalyzedToken(org.languagetool.AnalyzedToken) Synthesizer(org.languagetool.synthesis.Synthesizer)

Example 3 with Inflection

use of org.languagetool.rules.uk.InflectionHelper.Inflection in project languagetool by languagetool-org.

the class TokenInflectionAgreementRule method formatInflections.

private static String formatInflections(List<Inflection> inflections, boolean adj) {
    Collections.sort(inflections);
    Map<String, List<String>> map = new LinkedHashMap<>();
    for (Inflection inflection : inflections) {
        if (!map.containsKey(inflection.gender)) {
            map.put(inflection.gender, new ArrayList<>());
        }
        String caseStr = PosTagHelper.VIDMINKY_MAP.get(inflection._case);
        if (adj && inflection.animTag != null) {
            caseStr += " (" + (inflection.animTag.equals("ranim") ? "іст." : "неіст.") + ")";
        }
        map.get(inflection.gender).add(caseStr);
    }
    List<String> list = new ArrayList<>();
    for (Entry<String, List<String>> entry : map.entrySet()) {
        String genderStr = PosTagHelper.GENDER_MAP.get(entry.getKey());
        List<String> caseValues = entry.getValue();
        list.add(genderStr + ": " + StringUtils.join(caseValues, ", "));
    }
    return StringUtils.join(list, ", ");
}
Also used : ArrayList(java.util.ArrayList) Inflection(org.languagetool.rules.uk.InflectionHelper.Inflection) ArrayList(java.util.ArrayList) List(java.util.List) LinkedHashMap(java.util.LinkedHashMap)

Aggregations

Inflection (org.languagetool.rules.uk.InflectionHelper.Inflection)3 ArrayList (java.util.ArrayList)2 AnalyzedTokenReadings (org.languagetool.AnalyzedTokenReadings)2 IOException (java.io.IOException)1 LinkedHashMap (java.util.LinkedHashMap)1 List (java.util.List)1 AnalyzedToken (org.languagetool.AnalyzedToken)1 RuleMatch (org.languagetool.rules.RuleMatch)1 Synthesizer (org.languagetool.synthesis.Synthesizer)1