diff --git a/Duckling/Ordinal/RU/Corpus.hs b/Duckling/Ordinal/RU/Corpus.hs index 33e4d300..fea86b12 100644 --- a/Duckling/Ordinal/RU/Corpus.hs +++ b/Duckling/Ordinal/RU/Corpus.hs @@ -30,6 +30,7 @@ allExamples = concat , "первое" , "первой" , "первого" + , "первые" , "1ая" , "1-ая" , "1ый" @@ -40,6 +41,11 @@ allExamples = concat , "1-й" , "1го" , "1-го" + , "1-ого" + , "первой" + , "первым" + , "первому" + , "первым" ] , examples (OrdinalData 3) [ "третий" @@ -47,6 +53,7 @@ allExamples = concat , "третье" , "третьей" , "третьего" + , "третьи" , "3й" , "3ий" , "3я" @@ -61,6 +68,11 @@ allExamples = concat , "3-е" , "3-ье" , "3-го" + , "3-его" + , "третьей" + , "третьим" + , "третьему" + , "третьим" ] , examples (OrdinalData 4) [ "четвертый" @@ -68,6 +80,8 @@ allExamples = concat , "четвертое" , "четвертой" , "четвертого" + , "четвёртый" + , "четвертые" , "4й" , "4ый" , "4ая" @@ -80,39 +94,102 @@ allExamples = concat , "4-ое" , "4-ой" , "4-го" + , "4-ого" + , "четвертой" + , "четвертым" + , "четвёртому" + , "четвёртым" ] , examples (OrdinalData 15) [ "пятнадцатый" , "15й" , "15-й" + , "15-ый" + , "пятнадцатая" + , "15я" + , "15-я" + , "15-ая" + , "пятнадцатое" + , "15е" + , "15-е" + , "15-ое" + , "пятнадцатому" + , "пятнадцатые" + , "пятнадцатой" + , "пятнадцатым" + , "пятнадцатому" + , "пятнадцатым" + ] + , examples (OrdinalData 10) + [ "десятый" + , "10й" + , "10-й" + , "10-ый" + , "десятая" + , "десятой" ] , examples (OrdinalData 21) [ "21й" , "21-й" , "21-го" + , "21-ого" , "Двадцать первый" , "двадцать первый" , "двадцать первого" + , "двадцать первой" ] , examples (OrdinalData 23) [ "23й" , "23-й" , "двадцать третий" , "двадцать третьего" + , "двадцать третьей" + , "23-го" + , "23-его" ] , examples (OrdinalData 31) [ "31ый" , "31-ый" , "тридцать первый" ] + , examples (OrdinalData 30) + [ "30ый" + , "30-ый" + , "тридцатый" + ] , examples (OrdinalData 48) [ "48ое" , "48-ое" , "сорок восьмое" ] + , examples (OrdinalData 40) + [ "40ое" + , "40-ое" + , "сороковой" + , "сороковое" + , "сороковая" + ] , examples (OrdinalData 99) [ "99ый" , "99-й" + , "99-ый" , "девяносто девятый" + , "девяносто девятая" + ] + , examples (OrdinalData 90) + [ "90ый" + , "90-й" + , "90-ый" + , "девяностый" + , "девяностая" + ] + , examples (OrdinalData 100) + [ "сотое" + , "сотая" + , "сотый" + , "100-ая" + , "100-я" + , "100-й" + , "100-е" ] ] diff --git a/Duckling/Ordinal/RU/Rules.hs b/Duckling/Ordinal/RU/Rules.hs index 3a4f846d..50594fd7 100644 --- a/Duckling/Ordinal/RU/Rules.hs +++ b/Duckling/Ordinal/RU/Rules.hs @@ -31,6 +31,7 @@ ordinalsFirstthMap = HashMap.fromList , ( "втор", 2 ) , ( "трет", 3 ) , ( "четверт", 4 ) + , ( "четвёрт", 4 ) , ( "пят", 5 ) , ( "шест", 6 ) , ( "седьм", 7 ) @@ -47,6 +48,14 @@ ordinalsFirstthMap = HashMap.fromList , ( "восемнадцат", 18 ) , ( "девятнадцат", 19 ) , ( "двадцат", 20 ) + , ( "тридцат", 30 ) + , ( "сороков", 40 ) + , ( "пятидесят", 50 ) + , ( "шестидесят", 60 ) + , ( "семидесят", 70 ) + , ( "восьмидесят", 80 ) + , ( "девяност", 90 ) + , ( "сот", 100 ) ] cardinalsMap :: HashMap Text.Text Int @@ -59,13 +68,14 @@ cardinalsMap = HashMap.fromList , ( "семьдесят", 70 ) , ( "восемьдесят", 80 ) , ( "девяносто", 90 ) + , ( "сто", 100 ) ] ruleOrdinalsFirstth :: Rule ruleOrdinalsFirstth = Rule - { name = "ordinals (first..19th)" + { name = "ordinals (first..20th, then 30th, 40th, ..., 100th)" , pattern = - [ regex "(перв|втор|трет|четверт|пят|шест|седьм|восьм|девят|десят|одиннадцат|двенадцат|тринадцат|четырнадцат|пятнадцат|шестнадцат|семнадцат|восемнадцат|девятнадцат|двадцат)(ье(го|й)?|ого|ый|ой|ий|ая|ое|ья)" + [ regex "(перв|втор|трет|четв[её]рт|пят|шест|седьм|восьм|девят|десят|одиннадцат|двенадцат|тринадцат|четырнадцат|пятнадцат|шестнадцат|семнадцат|восемнадцат|девятнадцат|двадцат|тридцат|сороков|пятидесят|шестидесят|семидесят|восьмидесят|девяност|сот)(ь(его|ему|ей|ем|им|их|и|е)|ого|ому|ый|ой|ий|ая|ое|ья|ом|ые|ым|ых)" ] , prod = \tokens -> case tokens of (Token RegexMatch (GroupMatch (match:_)):_) -> @@ -78,7 +88,7 @@ ruleOrdinal = Rule { name = "ordinal 21..99" , pattern = [ regex "(двадцать|тридцать|сорок|пятьдесят|шестьдесят|семьдесят|восемьдесят|девяносто)" - , regex "(перв|втор|трет|четверт|пят|шест|седьм|восьм|девят)(ье(го|й)?|ого|ый|ой|ий|ая|ое|ья)" + , regex "(перв|втор|трет|четв[её]рт|пят|шест|седьм|восьм|девят)(ье(го|й)?|ого|ому|ый|ой|ий|ая|ое|ья|ые|ым|ых)" ] , prod = \tokens -> case tokens of (Token RegexMatch (GroupMatch (m1:_)): @@ -94,7 +104,7 @@ ruleOrdinalDigits :: Rule ruleOrdinalDigits = Rule { name = "ordinal (digits)" , pattern = - [ regex "0*(\\d+)-?((ы|о|и|а|e|ь)?(ее|й|я|е|го))" + [ regex "0*(\\d+)-?((ы|о|и|а|е|ь)?(ее|й|я|е|го|му?))" ] , prod = \tokens -> case tokens of (Token RegexMatch (GroupMatch (match:_)):_) -> ordinal <$> parseInt match diff --git a/Duckling/Ranking/Classifiers/RU_XX.hs b/Duckling/Ranking/Classifiers/RU_XX.hs index e986d1de..9cd5837a 100644 --- a/Duckling/Ranking/Classifiers/RU_XX.hs +++ b/Duckling/Ranking/Classifiers/RU_XX.hs @@ -30,11 +30,12 @@ classifiers likelihoods = HashMap.fromList [], n = 0}}), ("\1055\1086\1085\1077\1076\1077\1083\1100\1085\1080\1082", Classifier{okData = - ClassData{prior = 0.0, unseen = -1.791759469228055, - likelihoods = HashMap.fromList [("", 0.0)], n = 4}, + ClassData{prior = -0.1823215567939546, + unseen = -1.9459101490553135, + likelihoods = HashMap.fromList [("", 0.0)], n = 5}, koData = - ClassData{prior = -infinity, unseen = -0.6931471805599453, - likelihoods = HashMap.fromList [], n = 0}}), + ClassData{prior = -1.791759469228055, unseen = -1.0986122886681098, + likelihoods = HashMap.fromList [("", 0.0)], n = 1}}), ("