From 33bbd2863ebec5cb21b700085d61112d18117901 Mon Sep 17 00:00:00 2001 From: Vladislav Khorev Date: Tue, 2 Dec 2014 01:48:08 +0000 Subject: [PATCH] =?UTF-8?q?Added=20=D0=B9=20form?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rudict/grammar_case.csv | 24 +++ rudict/grammar_case.xlsx | Bin 13270 -> 13910 bytes rudict/rudict/main.cpp | 1 + rudict/rudict/noun.cpp | 320 +++++++++++++++++++++++++++------------ rudict/rudict/noun.h | 27 +++- 5 files changed, 271 insertions(+), 101 deletions(-) diff --git a/rudict/grammar_case.csv b/rudict/grammar_case.csv index ca9bdfe..f6ff90c 100644 --- a/rudict/grammar_case.csv +++ b/rudict/grammar_case.csv @@ -143,6 +143,30 @@ SECOND_MALE_SSFORM_ANIMATE;NC_SINGULAR;NGC_P1_NOMINATIVE;ь;парень ;;NGC_P4_ACCUSATIVE;ей;обвиняю парней ;;NGC_P5_INSTRUMENTAL;ями;говорю с парнями ;;NGC_P6_PREPOSITIONAL;ях;говорю о парнях +SECOND_I_SHORT_INANIMATE;NC_SINGULAR;NGC_P1_NOMINATIVE;й;каравай +;;NGC_P2_GENITIVE;я;подарок для каравая +;;NGC_P3_DATIVE;ю;подарок караваю +;;NGC_P4_ACCUSATIVE;й;обвиняю каравай +;;NGC_P5_INSTRUMENTAL;ем;говорю с караваем +;;NGC_P6_PREPOSITIONAL;е;говорю о каравае +;NC_PLURAL;NGC_P1_NOMINATIVE;и;караваи +;;NGC_P2_GENITIVE;ев;подарок для караваев +;;NGC_P3_DATIVE;ям;подарок караваям +;;NGC_P4_ACCUSATIVE;и;обвиняю караваи +;;NGC_P5_INSTRUMENTAL;ями;говорю с караваями +;;NGC_P6_PREPOSITIONAL;ях;говорю о караваях +SECOND_I_SHORT_ANIMATE;NC_SINGULAR;NGC_P1_NOMINATIVE;й;герой +;;NGC_P2_GENITIVE;я;подарок для героя +;;NGC_P3_DATIVE;ю;подарок герою +;;NGC_P4_ACCUSATIVE;я;обвиняю героя +;;NGC_P5_INSTRUMENTAL;ем;говорю с героем +;;NGC_P6_PREPOSITIONAL;е;говорю о каравае +;NC_PLURAL;NGC_P1_NOMINATIVE;и;герои +;;NGC_P2_GENITIVE;ев;подарок для героев +;;NGC_P3_DATIVE;ям;подарок героям +;;NGC_P4_ACCUSATIVE;ев;обвиняю героев +;;NGC_P5_INSTRUMENTAL;ями;говорю с героями +;;NGC_P6_PREPOSITIONAL;ях;говорю о героях SECOND_NEUTRAL_E_FORM;NC_SINGULAR;NGC_P1_NOMINATIVE;е;поле ;;NGC_P2_GENITIVE;я;подарок для поля ;;NGC_P3_DATIVE;ю;подарок полю diff --git a/rudict/grammar_case.xlsx b/rudict/grammar_case.xlsx index ffc96215174195d0e16141d0a3ebf724fa1eb0e6..9c404416cc5b6f155449ef646057ee4a57e6a261 100644 GIT binary patch delta 6918 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 ZwFd?8COZpAflrG)>k#-y`9H%wHTnPm delta 6271 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 EABG^pw*UYD diff --git a/rudict/rudict/main.cpp b/rudict/rudict/main.cpp index ea6df40..f82aef6 100644 --- a/rudict/rudict/main.cpp +++ b/rudict/rudict/main.cpp @@ -12,6 +12,7 @@ int main() LoadNounDeclencionCaseTable(); LoadFrequentWordSet(); FillDivisionCaseMaps(); + CalculatePluralForm(); //RecognizeNoun(L"стульями"); //Косяк: "вечер" diff --git a/rudict/rudict/noun.cpp b/rudict/rudict/noun.cpp index fa10204..1d2a048 100644 --- a/rudict/rudict/noun.cpp +++ b/rudict/rudict/noun.cpp @@ -120,6 +120,17 @@ NounDeclencion WStringToNounDeclencion(std::wstring str) { return SECOND_MALE_SSFORM_ANIMATE; } + + if (str == L"SECOND_I_SHORT_INANIMATE") + { + return SECOND_I_SHORT_INANIMATE; + } + if (str == L"SECOND_I_SHORT_ANIMATE") + { + return SECOND_I_SHORT_ANIMATE; + } + + if (str == L"SECOND_NEUTRAL_E_FORM") { return SECOND_NEUTRAL_E_FORM; @@ -225,6 +236,10 @@ std::vector GetAllNounEndingArr() std::vector result { L"", + + L"й", + L"ев", + L"а", L"и", L"е", @@ -266,18 +281,143 @@ bool NounIsInDictionary(std::wstring nounNominative) } -bool NounSpecialPluralFormIsInDictionary(std::wstring nounNominativePlural) +std::wstring convertToStandardPluralForm(std::wstring s) { - for (auto& noun : NounRecordArr) + std::wstring pluralForm = s; + + if (pluralForm[pluralForm.size() - 1] == L'а' && charIsIFormConsolant(pluralForm[pluralForm.size() - 2])) { - if (noun.specialMultipleForm == nounNominativePlural) + pluralForm[pluralForm.size() - 1] = L'и'; + } + else if (pluralForm[pluralForm.size() - 1] == L'а' && charIsUFormConsolant(pluralForm[pluralForm.size() - 2])) + { + pluralForm[pluralForm.size() - 1] = L'ы'; + } + else if (pluralForm[pluralForm.size() - 1] == L'я') + { + pluralForm[pluralForm.size() - 1] = L'и'; + } + else if (charIsIFormConsolant(pluralForm[pluralForm.size() - 1])) + { + pluralForm += L'и'; + } + else if (charIsUFormConsolant(pluralForm[pluralForm.size() - 1])) + { + pluralForm += L'ы'; + } + else if (pluralForm[pluralForm.size() - 1] == L'ь') + { + pluralForm[pluralForm.size() - 1] = L'и'; + } + else if (pluralForm[pluralForm.size() - 1] == L'й') + { + pluralForm[pluralForm.size() - 1] = L'и'; + } + else if (pluralForm[pluralForm.size() - 1] == L'о') + { + pluralForm[pluralForm.size() - 1] = L'а'; + } + else if (pluralForm[pluralForm.size() - 1] == L'е') + { + pluralForm[pluralForm.size() - 1] = L'я'; + } + else + { + std::cout << "Error in convertToStandardPluralForm" << std::endl; + } + + return pluralForm; +} + +std::wstring convertFromStandardToAlternativePluralForm(std::wstring s) +{ + if (s[s.size() - 1] == L'и') + { + s[s.size() - 1] = L'я'; + } + if (s[s.size() - 1] == L'ы') + { + s[s.size() - 1] = L'а'; + } + + return s; +} + +std::set getPluralForm(NounRecord noun) +{ + std::set result; + + if (noun.specialMultipleForm != L"") + { + result.insert(noun.specialMultipleForm); + } + + if (noun.haveSingleForm) + { + if (noun.haveStandardMultipleForm) { - return true; + std::wstring pluralForm = convertToStandardPluralForm(noun.nominativeForm); + + if (noun.haveStandardMultipleFormEnding) + { + result.insert(pluralForm); + } + + if (noun.haveAlternativeMultipleFormEnding) + { + result.insert(convertFromStandardToAlternativePluralForm(pluralForm)); + } + + } + + if (noun.haveStandardMultipleFormWithMissingLastVowel) + { + std::wstring pluralForm = convertToStandardPluralForm(noun.nominativeForm); + + wchar_t prevsschar = pluralForm[pluralForm.size() - 4]; + + if (charIsMissingVowelSoftenerConsolant(prevsschar)) + { + pluralForm[pluralForm.size() - 3] = L'ь'; + } + else + { + pluralForm.erase(pluralForm.begin() + pluralForm.size() - 3); + } + + if (noun.haveStandardMultipleFormEnding) + { + result.insert(pluralForm); + } + + if (noun.haveAlternativeMultipleFormEnding) + { + result.insert(convertFromStandardToAlternativePluralForm(pluralForm)); + } } - if (!noun.haveSingleForm && noun.nominativeForm == nounNominativePlural) + + + } + else + { + result.insert(noun.nominativeForm); + } + + + return result; +} + +bool NounPluralFormIsInDictionary(std::wstring nounNominativePlural) +{ + for (auto& noun : NounRecordArr) + { + if (noun.haveMultipleForm) { - return true; + if (noun.precalculatedNominativePluralSet.count(nounNominativePlural) != 0) + { + return true; + } } } @@ -298,29 +438,26 @@ NounRecord GetNounRecordFromDictionary(std::wstring nounNominative) } -NounRecord GetNounRecordFromDictionary_BySpecialPluralForm(std::wstring nounNominativePlural) +NounRecord GetNounRecordFromDictionary_ByPluralForm(std::wstring nounNominativePlural) { for (auto& noun : NounRecordArr) { - if (noun.specialMultipleForm == nounNominativePlural) + if (noun.haveMultipleForm) { - return noun; - } - - if (!noun.haveSingleForm && noun.nominativeForm == nounNominativePlural) - { - return noun; + if (noun.precalculatedNominativePluralSet.count(nounNominativePlural) != 0) + { + return noun; + } } } - return{}; } -bool charIsConsolant(wchar_t c) +bool charIsConsolant(wchar_t c) //except й { - std::wstring consolants = L"йцкнгшщзхфвпрлджчсмтб"; + std::wstring consolants = L"цкнгшщзхфвпрлджчсмтб"; for (wchar_t ic : consolants) { @@ -381,10 +518,13 @@ std::set getPossibleNounEndingDivisionSet(std::wstring noun) { std::wstring nounBase = boost::replace_last_copy(noun, ending, ""); - if (charIsConsolant(nounBase[nounBase.size() - 1]) || nounBase[nounBase.size() - 1] == L'ь' || nounBase[nounBase.size() - 1] == L'ъ') + + + if ((charIsVowel(nounBase[nounBase.size() - 1])) || //Might be exact the й case + (charIsConsolant(nounBase[nounBase.size() - 1]) || nounBase[nounBase.size() - 1] == L'ь' || nounBase[nounBase.size() - 1] == L'ъ')) { result.insert({ nounBase, ending, NounEndingDivision::DC_COMMON }); - result.insert({ nounBase, ending, NounEndingDivision::DC_SPECIAL_PLURAL_FORM }); + //result.insert({ nounBase, ending, NounEndingDivision::DC_SPECIAL_PLURAL_FORM }); } //Check missed vowel (simple case) @@ -470,7 +610,7 @@ std::wstring GetNounNoninative(std::wstring nounBase, NounDeclencion nounDeclenc return L""; } -std::wstring i_form_consolants = L"гкжшчщ"; +std::wstring i_form_consolants = L"гхкжшчщ"; std::wstring u_form_consolants = L"бпдтвфзснмлрц"; wchar_t GetLastChar(const NounRecord& nounRecord) @@ -494,14 +634,6 @@ bool charIsUFormConsolant(wchar_t c) } -bool AIFormEndingIsCorrect(const NounRecord& nounRecord) -{ - return (GetLastChar(nounRecord) == L'а' && charIsIFormConsolant(GetPrevLastChar(nounRecord))) && nounRecord.haveSingleForm || - (GetLastChar(nounRecord) == L'и' && charIsIFormConsolant(GetPrevLastChar(nounRecord))) && !nounRecord.haveSingleForm; -} - - - bool FirstAIFormInanimateSingularCondition(const NounRecord& nounRecord) { return nounRecord.haveSingleForm && nounRecord.canBeInanimate && (GetLastChar(nounRecord) == L'а' && charIsIFormConsolant(GetPrevLastChar(nounRecord))); @@ -670,6 +802,31 @@ bool SecondMaleSSFormAnimatePluralCondition(const NounRecord& nounRecord) ); } + +bool SecondIShortInanimateSingularCondition(const NounRecord& nounRecord) +{ + return nounRecord.haveSingleForm && nounRecord.canBeInanimate && GetLastChar(nounRecord) == L'й'; +} + +bool SecondIShortAnimateSingularCondition(const NounRecord& nounRecord) +{ + return nounRecord.haveSingleForm && nounRecord.canBeAnimate && GetLastChar(nounRecord) == L'й'; +} + +bool SecondIShortInanimatePluralCondition(const NounRecord& nounRecord) +{ + return nounRecord.haveSingleForm && nounRecord.canBeInanimate && GetLastChar(nounRecord) == L'й'; +} + +bool SecondIShortAnimatePluralCondition(const NounRecord& nounRecord) +{ + return nounRecord.haveSingleForm && nounRecord.canBeAnimate && GetLastChar(nounRecord) == L'й'; +} + + + + + bool SecondNeutralEFormSingularCondition(const NounRecord& nounRecord) { return nounRecord.haveSingleForm && nounRecord.gender == NG_NEUTRAL && GetLastChar(nounRecord) == L'е'; @@ -760,6 +917,12 @@ void SetupDeclentionMap() DeclentionConditionMap[{SECOND_MALE_SSFORM_ANIMATE, NC_SINGULAR}] = std::bind(SecondMaleSSFormAnimateSingularCondition, std::placeholders::_1); DeclentionConditionMap[{SECOND_MALE_SSFORM_ANIMATE, NC_PLURAL}] = std::bind(SecondMaleSSFormAnimatePluralCondition, std::placeholders::_1); + DeclentionConditionMap[{SECOND_I_SHORT_INANIMATE, NC_SINGULAR}] = std::bind(SecondIShortInanimateSingularCondition, std::placeholders::_1); + DeclentionConditionMap[{SECOND_I_SHORT_INANIMATE, NC_PLURAL}] = std::bind(SecondIShortInanimatePluralCondition, std::placeholders::_1); + DeclentionConditionMap[{SECOND_I_SHORT_ANIMATE, NC_SINGULAR}] = std::bind(SecondIShortAnimateSingularCondition, std::placeholders::_1); + DeclentionConditionMap[{SECOND_I_SHORT_ANIMATE, NC_PLURAL}] = std::bind(SecondIShortAnimatePluralCondition, std::placeholders::_1); + + DeclentionConditionMap[{SECOND_NEUTRAL_E_FORM, NC_SINGULAR}] = std::bind(SecondNeutralEFormSingularCondition, std::placeholders::_1); DeclentionConditionMap[{SECOND_NEUTRAL_E_FORM, NC_PLURAL}] = std::bind(SecondNeutralEFormPluralCondition, std::placeholders::_1); DeclentionConditionMap[{SECOND_NEUTRAL_O_FORM, NC_SINGULAR}] = std::bind(SecondNeutralOFormSingularCondition, std::placeholders::_1); @@ -814,6 +977,8 @@ bool IsDeclencionSecondType(NounDeclencion nounDeclention) case SECOND_MALE_UFORM_ANIMATE: case SECOND_MALE_SSFORM_INANIMATE: case SECOND_MALE_SSFORM_ANIMATE: + case SECOND_I_SHORT_INANIMATE: + case SECOND_I_SHORT_ANIMATE: return true; break; default: @@ -832,6 +997,7 @@ bool IsDeclencionAnimated(NounDeclencion nounDeclention) case SECOND_MALE_IFORM_ANIMATE: case SECOND_MALE_UFORM_ANIMATE: case SECOND_MALE_SSFORM_ANIMATE: + case SECOND_I_SHORT_ANIMATE: case THIRD_FORM_ANIMATE: return true; break; @@ -888,8 +1054,6 @@ void FillDivisionCaseMaps() DivisionCaseNounModificatorMap[NounEndingDivision::DC_SPECIAL_PLURAL_A] = DivisionCaseNounModificatorMap[NounEndingDivision::DC_COMMON]; - DivisionCaseNounModificatorMap[NounEndingDivision::DC_SPECIAL_PLURAL_FORM] = DivisionCaseNounModificatorMap[NounEndingDivision::DC_COMMON]; - DivisionCaseEndingModificatorMap[NounEndingDivision::DC_COMMON] = [](std::wstring s){ return s; }; DivisionCaseEndingModificatorMap[NounEndingDivision::DC_LOST_VOWEL_O] = DivisionCaseEndingModificatorMap[NounEndingDivision::DC_COMMON]; DivisionCaseEndingModificatorMap[NounEndingDivision::DC_LOST_VOWEL_E] = DivisionCaseEndingModificatorMap[NounEndingDivision::DC_COMMON]; @@ -901,8 +1065,6 @@ void FillDivisionCaseMaps() return L""; }; - DivisionCaseEndingModificatorMap[NounEndingDivision::DC_SPECIAL_PLURAL_FORM] = DivisionCaseEndingModificatorMap[NounEndingDivision::DC_COMMON]; - DivisionCaseNounTupleFilterMap[NounEndingDivision::DC_COMMON] = [](NounTuple t) { return true; }; @@ -923,10 +1085,6 @@ void FillDivisionCaseMaps() ((std::get<2>(t) == NGC_P4_ACCUSATIVE && !IsDeclencionAnimated(std::get<0>(t))))); }; - DivisionCaseNounTupleFilterMap[NounEndingDivision::DC_SPECIAL_PLURAL_FORM] = [](NounTuple t) - { - return (std::get<1>(t) == NC_PLURAL); - }; DivisionCaseNounTupleRecordFilterMap[NounEndingDivision::DC_COMMON] = [](NounTuple t, NounRecord r) { @@ -948,12 +1106,6 @@ void FillDivisionCaseMaps() return r.haveAlternativeMultipleFormEnding && StandardTest(t, r); }; - - DivisionCaseNounTupleRecordFilterMap[NounEndingDivision::DC_SPECIAL_PLURAL_FORM] = [](NounTuple t, NounRecord r) - { - return r.specialMultipleForm != L"" && StandardTest(t, r); - }; - } @@ -984,74 +1136,41 @@ std::vector RecognizeNoun(std::wstring noun) if (DivisionCaseNounTupleFilterMap[dc](nounTuple)) { - std::wstring nounNominaviteSingular = GetNounNoninative(modifiedNounBase, std::get<0>(nounTuple), NC_SINGULAR); - - if (NounIsInDictionary(nounNominaviteSingular)) + if (std::get<1>(nounTuple) == NC_SINGULAR) { - NounRecord nounRecord = GetNounRecordFromDictionary(nounNominaviteSingular); + std::wstring nounNominaviteSingular = GetNounNoninative(modifiedNounBase, std::get<0>(nounTuple), NC_SINGULAR); - if (DivisionCaseNounTupleRecordFilterMap[dc](nounTuple, nounRecord)) + if (NounIsInDictionary(nounNominaviteSingular)) { - result.push_back({ std::get<2>(nounTuple), std::get<1>(nounTuple), IsDeclencionAnimated(std::get<0>(nounTuple)), nounRecord }); + + NounRecord nounRecord = GetNounRecordFromDictionary(nounNominaviteSingular); + + if (DivisionCaseNounTupleRecordFilterMap[dc](nounTuple, nounRecord)) + { + result.push_back({ std::get<2>(nounTuple), std::get<1>(nounTuple), IsDeclencionAnimated(std::get<0>(nounTuple)), nounRecord }); + } } + } - - - std::wstring nounNominavitePlural = GetNounNoninative(nounBase, std::get<0>(nounTuple), NC_PLURAL); - - if (NounSpecialPluralFormIsInDictionary(nounNominavitePlural)) + else { - NounRecord nounRecord = GetNounRecordFromDictionary_BySpecialPluralForm(nounNominavitePlural); - if (DivisionCaseNounTupleRecordFilterMap[dc](nounTuple, nounRecord)) + std::wstring nounNominavitePlural = GetNounNoninative(nounBase, std::get<0>(nounTuple), NC_PLURAL); + + if (NounPluralFormIsInDictionary(nounNominavitePlural)) { - result.push_back({ std::get<2>(nounTuple), std::get<1>(nounTuple), IsDeclencionAnimated(std::get<0>(nounTuple)), nounRecord }); + NounRecord nounRecord = GetNounRecordFromDictionary_ByPluralForm(nounNominavitePlural); + + if (DivisionCaseNounTupleRecordFilterMap[dc](nounTuple, nounRecord)) + { + result.push_back({ std::get<2>(nounTuple), std::get<1>(nounTuple), IsDeclencionAnimated(std::get<0>(nounTuple)), nounRecord }); + } } } } } - - /* - //Special plural form check - for (auto nounTuple : possibleTupleArr) - { - if (std::get<1>(nounTuple) == NC_PLURAL) - { - std::wstring nounNominavitePlural = GetNounNoninative(nounBase, std::get<0>(nounTuple), NC_PLURAL); - - if (NounSpecialPluralFormIsInDictionary(nounNominavitePlural)) - { - NounRecord nounRecord = GetNounRecordFromDictionary_BySpecialPluralForm(nounNominavitePlural); - - - if (nounRecord.canBeAnimate) - { - NounStruct ns{ std::get<2>(nounTuple), std::get<1>(nounTuple), true, nounRecord }; - - if (!NounScructIsAlreadyInArray(ns, result)) - { - result.push_back(ns); - } - } - - if (nounRecord.canBeInanimate) - { - NounStruct ns{ std::get<2>(nounTuple), std::get<1>(nounTuple), false, nounRecord }; - - if (!NounScructIsAlreadyInArray(ns, result)) - { - result.push_back(ns); - } - } - } - } - - }*/ - - - } @@ -1078,6 +1197,15 @@ NounDeclencion CalculateNounDeclention(NounRecord nounRecord) } +void CalculatePluralForm() +{ + for (auto& nounRecord : NounRecordArr) + { + nounRecord.precalculatedNominativePluralSet = getPluralForm(nounRecord); + } +} + + void LoadNounDeclencionCaseTable() { diff --git a/rudict/rudict/noun.h b/rudict/rudict/noun.h index 8eecefa..a8ff107 100644 --- a/rudict/rudict/noun.h +++ b/rudict/rudict/noun.h @@ -35,6 +35,8 @@ struct NounRecord bool canBeAnimate; bool canBeInanimate; + std::set precalculatedNominativePluralSet; + NounRecord(); NounRecord(std::wstring line); }; @@ -53,6 +55,8 @@ enum NounDeclencion SECOND_MALE_UFORM_ANIMATE, SECOND_MALE_SSFORM_INANIMATE, SECOND_MALE_SSFORM_ANIMATE, + SECOND_I_SHORT_INANIMATE, + SECOND_I_SHORT_ANIMATE, SECOND_NEUTRAL_E_FORM, SECOND_NEUTRAL_O_FORM, THIRD_FORM_INANIMATE, @@ -126,8 +130,7 @@ struct NounEndingDivision DC_COMMON = 0, DC_LOST_VOWEL_O, DC_LOST_VOWEL_E, - DC_SPECIAL_PLURAL_A, - DC_SPECIAL_PLURAL_FORM + DC_SPECIAL_PLURAL_A } divisionCase; bool operator<(const NounEndingDivision& other) const @@ -152,18 +155,23 @@ struct NounEndingDivision std::vector GetAllNounEndingArr(); + +std::set getPluralForm(NounRecord nounRecord); + bool NounIsInDictionary(std::wstring nounNominative); -bool NounSpecialPluralFormIsInDictionary(std::wstring nounNominativePlural); +bool NounPluralFormIsInDictionary(std::wstring nounNominativePlural); NounRecord GetNounRecordFromDictionary(std::wstring nounNominative); -NounRecord GetNounRecordFromDictionary_BySpecialPluralForm(std::wstring nounNominativePlural); +NounRecord GetNounRecordFromDictionary_ByPluralForm(std::wstring nounNominativePlural); -bool charIsConsolant(wchar_t c); +bool charIsConsolant(wchar_t c); //except й bool charIsVowel(wchar_t c); +bool charIsMissingVowelSoftenerConsolant(wchar_t c); + struct NounStruct { NounGrammaticalCase nounGrammaticalCase; @@ -179,6 +187,12 @@ std::vector GetPossibleNounTupleArr(std::wstring nounEnding); std::wstring GetNounNoninative(std::wstring nounBase, NounDeclencion nounDeclencion, NounCount nounCount); +wchar_t GetLastChar(const NounRecord& nounRecord); +wchar_t GetPrevLastChar(const NounRecord& nounRecord); +bool charIsIFormConsolant(wchar_t c); +bool charIsUFormConsolant(wchar_t c); + + void SetupDeclentionMap(); bool NounFitsDeclention(NounRecord nounRecord, NounTuple nounTuple); @@ -192,8 +206,11 @@ std::vector RecognizeNoun(std::wstring noun); NounDeclencion CalculateNounDeclention(NounRecord nounRecord); +void CalculatePluralForm(); void LoadFrequentWordSet(); + + void LoadNounDeclencionCaseTable(); #endif //NOUN_H_INCLUDED