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