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;
}
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);
}
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, ", ");
}
Aggregations